Sida 3 av 4

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

Postat: 31 oktober 2018, 16:03:22
av SeniorLemuren
Bra tips. :)

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

Postat: 31 oktober 2018, 16:08:08
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.

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

Postat: 31 oktober 2018, 20:58:31
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?

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

Postat: 31 oktober 2018, 21:35:42
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.

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

Postat: 31 oktober 2018, 22:54:00
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.

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

Postat: 2 november 2018, 13:48:14
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);
}

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

Postat: 2 november 2018, 14:55:47
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

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

Postat: 2 november 2018, 15:57:10
av EonX
Tackar å det ödmjukaste, fungerade på första försöket. :tumupp:

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

Postat: 4 november 2018, 10:39:23
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);

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

Postat: 4 november 2018, 11:58:54
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.

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

Postat: 4 november 2018, 13:20:55
av HUGGBÄVERN
Det är inte SPÄNNING som ska visas på displejen, väl? Eller är det saltomortaler??? :wink:

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

Postat: 4 november 2018, 14:04:05
av SeniorLemuren
Jag väntar med SPÄNNING på nästa inlägg. :)

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

Postat: 4 november 2018, 14:17:39
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!

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

Postat: 4 november 2018, 15:02:12
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);
}

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

Postat: 5 november 2018, 16:34:51
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);
    }