Hjälp med kod Arduino - visa volt på oled

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
SeniorLemuren
Inlägg: 7779
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Hjälp med kod Arduino - visa volt på oled

Inlägg av SeniorLemuren »

Bra tips. :)
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Hjälp med kod Arduino - visa volt på oled

Inlägg av Icecap »

När spänningen väl är offsettat till positiva nivåer är resten bara en fråga om att lägga in en negativ offset ett lämpligt ställe i uträkningerna. T.ex. direkt efter A/D-värdet är hämtat på det råa värde.

Men ett problem är att sensorn ska ha tillgång till negativ spänningsmatning vilket ju i sig är ett problem. Så jag förespråkar allvarligt att använda en sensor av typen DS18B20 eller liknande, då är det inte någon negativ matningsspänning, analogt offset-kretslopp eller liknande inblandad.
EonX
Inlägg: 48
Blev medlem: 11 januari 2010, 23:36:56

Re: Hjälp med kod Arduino - visa volt på oled

Inlägg av EonX »

För en gångs skull lyckades jag med att få mätningen att börja på ett negativt tal enligt den metod ni föreslog. Tack för de :bravo:

jag har även beställt en DS18B20 ist för en analog tempgivare. När man nu har en digital sådan, kommer man att kunna göra denna visning av temperaturen på ett enklare sätt som sparar minne?
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Hjälp med kod Arduino - visa volt på oled

Inlägg av Icecap »

Man ska kommunicera med sensorn, det sker enligt 1-Wire® protokollet som är rimligt timings-beroende.
Jag har gjort det på många olika typer µC (8, 16 & 32 bitars) utan problem.

Men dagens tips: om inte du har sensorn på samma kretskort som µC'n som ska prata med den "ska" du lägga lite komponenter mellan för att säkra µC'n mot skador.

Jag använder oftast 2 st 2N7000 (N-MOSFET) men andra fungerar också. Sedan använder jag 2 portpinnar, en för utgående och en för ingående. 1-Wire® är ju planerat för att man kan nöja sig med 1 pinne - men har man två är det enklare att skydda elektroniken.

Jag ska försöka kasta in ett schema imorgon som visar hur jag har gjort.
SeniorLemuren
Inlägg: 7779
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Hjälp med kod Arduino - visa volt på oled

Inlägg av SeniorLemuren »

Eftersom du använder Arduino så finns det massor av exempel på hur du gör. Här är en länk med kopplingsschema och kod. Jag använder DS18B20 i flera olika applikationer och tycker den är väldigt smidig och enkel.
EonX
Inlägg: 48
Blev medlem: 11 januari 2010, 23:36:56

Re: Hjälp med kod Arduino - visa volt på oled

Inlägg av EonX »

Så där ja då har jag fått min DS18B20 och fått den att skriva temperaturen i Serial.monitor. Funkar mycket bra. jag har ju även min tidigare kod som visade volt i oled (kod nedan). Hur ska jag få oled att visa temperaturen från DS18B20?

Att man skall klippa ihop koderna begriper jag men vart i oled koden kan jag få in värdet från DS18B20?

kod som visar volt på oled:

#include <U8glib.h>

U8GLIB_SSD1306_128X64 oled(U8G_I2C_OPT_NONE);

void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
}

void loop() {
// read the input on analog pin 0:
int sensorValue = analogRead(A0);
// Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
float voltage = sensorValue * (5.0 / 1023.0);
// print out the value you read:
Serial.println(voltage);

int a = voltage;

char buf[9];
sprintf (buf, "%d", a);

oled.firstPage();
do {
oled.setFont(u8g_font_helvB10);
oled.drawStr(20, 30, buf);
} while(oled.nextPage());

}


Kod som visar temperatur i Serial.monitor.

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is conntec to the Arduino digital pin 2
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature sensor
DallasTemperature sensors(&oneWire);

void setup(void)
{
// Start serial communication for debugging purposes
Serial.begin(9600);
// Start up the library
sensors.begin();
}

void loop(void){
// Call sensors.requestTemperatures() to issue a global temperature and Requests to all devices on the bus
sensors.requestTemperatures();

Serial.print("Celsius temperature: ");
// Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire
Serial.println(sensors.getTempCByIndex(0));

delay(1000);
}
SeniorLemuren
Inlägg: 7779
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Hjälp med kod Arduino - visa volt på oled

Inlägg av SeniorLemuren »

sensors.getTempCByIndex(0) är detsamma som du använde som float voltage i tidigare kod. Nollan står för den första givaren, om du har fler än en så blir nästa en etta osv.

Kod: Markera allt

newTmp0 = sensors.getTempCByIndex(0)
newTmp1 = sensors.getTempCByIndex(1)
Så här ser min utskrift ut på en av mina Oled displayer (bild kommer sist). Som du ser så skriver jag bara ut temperaturen här och bara om värdet har ändrats, först måste man skriva över det gamla värdet med bakgrundsfärgen och sedan skriva det nya värdet. På så sätt behöver man inte skriva om hela displayen för att rensa den. Texterna som är fasta skriver jag ut bara en gång i setup.

Kod: Markera allt

void skrivTemp() {  
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0,0);
    display.println("Temperature Control"); 
    if (oldTmp0 != newTmp0){    
    display.setCursor(77,10);
    display.setTextColor(BLACK);
    display.print(oldTmp0);
    delay(1);
    display.setCursor(77,10);
    display.setTextColor(WHITE);
    display.print(newTmp0);    
    oldTmp0 = newTmp0;
    }
    if (oldTmp1 != newTmp1){    
    display.setCursor(77,20);
    display.setTextColor(BLACK);
    display.print(oldTmp1);
    delay(1);
    display.setCursor(77,20);
    display.setTextColor(WHITE);
    display.print(newTmp1);    
    oldTmp1 = newTmp1;
    }
    display.display();
 }
 
Texterna som är fasta skriver jag ut bara en gång i setup. (display.write(247); är den lilla runda gradsymbolen)

Kod: Markera allt

display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3D (for the 128x64) 
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setCursor(0,10);
  display.print("Water Out");
  display.setCursor(94,10);
  display.write(247);
  display.setCursor(100,10);
  display.print("C"); 
  display.setCursor(0,20);
  display.print("Water return");
  display.setCursor(94,20);
  display.write(247);
  display.setCursor(100,20);
  display.print("C"); 
  display.setCursor(0,30);    
  display.print("Motor Speed");  
  display.setCursor(100,30);
  display.print("%");  
  display.display(); 
  display.display();
  delay(1);
  // init done  
Jag använder dessa lib till Oled:
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
som du ser så skriver jag ut enbart heltal och slipper krångla med decimaler. I mitt fall är det fullt tillräckligt.
oledexempel.jpg
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
EonX
Inlägg: 48
Blev medlem: 11 januari 2010, 23:36:56

Re: Hjälp med kod Arduino - visa volt på oled

Inlägg av EonX »

Tackar å det ödmjukaste, fungerade på första försöket. :tumupp:
EonX
Inlägg: 48
Blev medlem: 11 januari 2010, 23:36:56

Re: Hjälp med kod Arduino - visa volt på oled

Inlägg av EonX »

Har stött på nästa "utmaning" med programmet jag håller på med.

Finns det nått bra sätt att använda en digitalWrite som en förutsättning för något annat?

Om jag tex vill att en funktion skall fungera endast när en annan funktion (write) körs?

Nedan ett må hända et dåligt exempel men det kanske gör min fråga mer förståelig, det är iaf detta jag på nått vis vill få utfört.

if (buttonState == HIGH) and (ledPin1 == HIGH);
digitalWrite (ledPin2, HIGH);
Shimonu
Inlägg: 294
Blev medlem: 21 oktober 2015, 22:44:33

Re: Hjälp med kod Arduino - visa volt på oled

Inlägg av Shimonu »

Har du inte svarat på din egen fråga där eller? Du har satt upp ett villkor för att anropa en funktion? Sen kan du ju ha något tillstånd som du kollar, antingen globalt eller som skickas in till en funktion för att se om den ska göra något.
Användarvisningsbild
HUGGBÄVERN
Tidigare soundbrigade
Inlägg: 32626
Blev medlem: 23 augusti 2006, 22:44:11
Ort: Lilla Paris
Kontakt:

Re: Hjälp med kod Arduino - visa volt på oled

Inlägg av HUGGBÄVERN »

Det är inte SPÄNNING som ska visas på displejen, väl? Eller är det saltomortaler??? :wink:
SeniorLemuren
Inlägg: 7779
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Hjälp med kod Arduino - visa volt på oled

Inlägg av SeniorLemuren »

Jag väntar med SPÄNNING på nästa inlägg. :)
Användarvisningsbild
HUGGBÄVERN
Tidigare soundbrigade
Inlägg: 32626
Blev medlem: 23 augusti 2006, 22:44:11
Ort: Lilla Paris
Kontakt:

Re: Hjälp med kod Arduino - visa volt på oled

Inlägg av HUGGBÄVERN »

Jag var mest förvånad att ingen hade påpekat att som elektrisk ärkesnubbe brukar det vara vanligt att man skiljer på (fysikalisk) storhet och (fysikalisk) enhet, alltså SPÄNNING och VOLT.

Dessutom har rubriken stuckit mig i ögonen alltsedan jag först såg den. Tråden är ju annars intressant!
Användarvisningsbild
arvidb
Inlägg: 4537
Blev medlem: 8 maj 2004, 12:56:24
Ort: Stockholm

Re: Hjälp med kod Arduino - visa volt på oled

Inlägg av arvidb »

EonX skrev:

Kod: Markera allt

if (buttonState == HIGH) and (ledPin1 == HIGH);
     digitalWrite (ledPin2, HIGH);
Du har ett semikolon direkt efter if-satsen. Det avslutar satsen och gör den verkningslös - digitalWrite() kommer alltid att köras. Så här ska det se ut:

Kod: Markera allt

if (buttonState == HIGH) and (ledPin1 == HIGH)
    digitalWrite (ledPin2, HIGH);
Edit: Ett tips är att alltid använda "måsvingar", även om du bara har en rad kod i satsen. På så sätt blir det lättare att upptäcka såna här fel:

Kod: Markera allt

if (buttonState == HIGH) and (ledPin1 == HIGH) {
    digitalWrite (ledPin2, HIGH);
}
Användarvisningsbild
adent
Inlägg: 4094
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: Hjälp med kod Arduino - visa volt på oled

Inlägg av adent »

...och för att göra det till korrekt C skulle jag vilja rätta det så här:

Kod: Markera allt

    if ((buttonState == HIGH) && (ledPin1 == HIGH)) {
        digitalWrite (ledPin2, HIGH);
    }
Skriv svar