Hjälp med kod Arduino - visa volt på oled
Hjälp med kod Arduino - visa volt på oled
God dag!
Jag är ytterst ny på detta med Arduino, jag håller fortfarande på att prova mig fram men nu har jag stött på ett problem jag inte kommer förbi.
Det jag vill uppnå är att visa en spänning i min oled display. Jag har lyckats få arduinon att skriva volt talet i serialmonitor. Jag har även fått displayen att bara skriva texten "VOLTAGE" men där val jag ju ha in det faktiska värdet.
Tacksam för all hjälp, bifogar koden nedan:
#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);
oled.firstPage();
do {
oled.setFont(u8g_font_helvB10);
oled.drawStr(20, 30, "VOLTAGE");
} while(oled.nextPage());
}
Jag är ytterst ny på detta med Arduino, jag håller fortfarande på att prova mig fram men nu har jag stött på ett problem jag inte kommer förbi.
Det jag vill uppnå är att visa en spänning i min oled display. Jag har lyckats få arduinon att skriva volt talet i serialmonitor. Jag har även fått displayen att bara skriva texten "VOLTAGE" men där val jag ju ha in det faktiska värdet.
Tacksam för all hjälp, bifogar koden nedan:
#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);
oled.firstPage();
do {
oled.setFont(u8g_font_helvB10);
oled.drawStr(20, 30, "VOLTAGE");
} while(oled.nextPage());
}
- Hobbyisten
- Gått bort
- Inlägg: 2531
- Blev medlem: 3 december 2017, 22:55:25
Re: Hjälp med kod Arduino - visa volt på oled
Med kunskaperna i sin krypta hos mig ser det ändå ut som om du ska sätta PARAMETERN (floattalet) voltage i oledrutinen istället för "VOLTAGE"
Re: Hjälp med kod Arduino - visa volt på oled
Jag har provat byta "VOLTAGE" mot (voltage)
oled.drawStr(20, 30, (voltage));
Då får jag felmedelandet:
no matching function for call to 'U8GLIB_SSD1306_128X64::drawStr(int, int, float&)'
Sen vad det meddelandet vill påvisa begriper jag inte riktigt.
oled.drawStr(20, 30, (voltage));
Då får jag felmedelandet:
no matching function for call to 'U8GLIB_SSD1306_128X64::drawStr(int, int, float&)'
Sen vad det meddelandet vill påvisa begriper jag inte riktigt.
- Hobbyisten
- Gått bort
- Inlägg: 2531
- Blev medlem: 3 december 2017, 22:55:25
- Klas-Kenny
- Inlägg: 11328
- Blev medlem: 17 maj 2010, 19:06:14
- Ort: Växjö/Alvesta
Re: Hjälp med kod Arduino - visa volt på oled
drawStr vill ha en sträng, inte ett flyttal.
Gör typ
Gör typ
Kod: Markera allt
char voltageStr[10];
sprintf(voltageStr, "%.2f V", voltage);
oled.drawStr (20,30,voltageStr);
Re: Hjälp med kod Arduino - visa volt på oled
Om oled.drawStr() enbart kan ta en textsträng som parameter så
kanske du måste konvertera din float till en string först. Om jag
googlar "arduino float to string" så finns det en del förslag. T.ex.
http://www.hobbytronics.co.uk/arduino-float-vars
https://arduino.stackexchange.com/quest ... ib-library
kanske du måste konvertera din float till en string först. Om jag
googlar "arduino float to string" så finns det en del förslag. T.ex.
http://www.hobbytronics.co.uk/arduino-float-vars
https://arduino.stackexchange.com/quest ... ib-library
Re: Hjälp med kod Arduino - visa volt på oled
När jag kör denna kod kommer jag nästan ändra fram. då visas
?V
på oled, fortfarande skrivs rätt värde ut i serialprinter.
#include <U8glib.h>
U8GLIB_SSD1306_128X64 oled(U8G_I2C_OPT_NONE);
char voltageStr[10];
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(A0);
float voltage = sensorValue * (5.0 / 1023.0);
Serial.println(voltage);
sprintf (voltageStr, "%.2f V", voltage);
oled.firstPage();
do {
oled.setFont(u8g_font_helvB10);
oled.drawStr (20,30,voltageStr);
} while(oled.nextPage());
}
?V
på oled, fortfarande skrivs rätt värde ut i serialprinter.
Såhär ser min kod ut nu:Klas-Kenny skrev:drawStr vill ha en sträng, inte ett flyttal.
Gör typ
Kod: Markera allt
char voltageStr[10]; sprintf(voltageStr, "%.2f V", voltage); oled.drawStr (20,30,voltageStr);
#include <U8glib.h>
U8GLIB_SSD1306_128X64 oled(U8G_I2C_OPT_NONE);
char voltageStr[10];
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(A0);
float voltage = sensorValue * (5.0 / 1023.0);
Serial.println(voltage);
sprintf (voltageStr, "%.2f V", voltage);
oled.firstPage();
do {
oled.setFont(u8g_font_helvB10);
oled.drawStr (20,30,voltageStr);
} while(oled.nextPage());
}
Re: Hjälp med kod Arduino - visa volt på oled
Det kan vara (kanske är) så att float inte stöds av sprintf() i Arduino versionen.
Ett av mina exempellänkar använder dtostrf() istället...
Ett av mina exempellänkar använder dtostrf() istället...
Re: Hjälp med kod Arduino - visa volt på oled
Jag provade att stoppa in dtostrf() ist för sprint() men den ville inte svälja det (det vart inte orange text) och jag fick felmeddelandet:
exit status 1
cannot convert 'char*' to 'double' for argument '1' to 'char* dtostrf(double, signed char, unsigned char, char*)'
Ytterst tacksam för all hjälp!!
exit status 1
cannot convert 'char*' to 'double' for argument '1' to 'char* dtostrf(double, signed char, unsigned char, char*)'
Ytterst tacksam för all hjälp!!
Re: Hjälp med kod Arduino - visa volt på oled
> Jag provade att stoppa in dtostrf() ist för sprint()
Hur menar du nu??? Alltså utan att anpassa parametrarna från sprintf() till dtostrf()?
Har du över huvud taget kollat min länk med dtostrf() exemplet?
Alltså http://www.hobbytronics.co.uk/arduino-float-vars med exemplet:
Du kör så klart oled.drawStr() istället för Serial.println()...
Hur menar du nu??? Alltså utan att anpassa parametrarna från sprintf() till dtostrf()?
Har du över huvud taget kollat min länk med dtostrf() exemplet?
Alltså http://www.hobbytronics.co.uk/arduino-float-vars med exemplet:
Kod: Markera allt
static float f_val = 123.6794;
static char outstr[15];
void setup() {
dtostrf(f_val,7, 3, outstr);
Serial.begin(9600);
Serial.println(outstr);
}
void loop(){
}
Re: Hjälp med kod Arduino - visa volt på oled
Sorry alldeles för trög här, nu är jag med på vad du menar ska prova det i morgon.
Återigen tack
Återigen tack
- Klas-Kenny
- Inlägg: 11328
- Blev medlem: 17 maj 2010, 19:06:14
- Ort: Växjö/Alvesta
Re: Hjälp med kod Arduino - visa volt på oled
Du verkar ha helt rätt. Vad pinsamt, Arduino som ska vara så fantastiskt enkelt och bra...sodjan skrev:Det kan vara (kanske är) så att float inte stöds av sprintf() i Arduino versionen.
Re: Hjälp med kod Arduino - visa volt på oled
Nja. Det är dokumenterat så vitt jag förstår och dessutom en
ganska rimlig optimering. Även om det kan framstå som en bra
idé att köra med float i enkla exempel, så är det mindre ofta en
bra lösning just p.g.a. koden växer. Det är t.ex sällan som man
behöver en float för att representera en spänning inom ganska
begränsade gränser. Eller en temperatur, som normalt klarar
sig med en decimal o.s.v.
Hur som helst, om jag inte har missförstått allt så löser dtostrf() problemet.
ganska rimlig optimering. Även om det kan framstå som en bra
idé att köra med float i enkla exempel, så är det mindre ofta en
bra lösning just p.g.a. koden växer. Det är t.ex sällan som man
behöver en float för att representera en spänning inom ganska
begränsade gränser. Eller en temperatur, som normalt klarar
sig med en decimal o.s.v.
Hur som helst, om jag inte har missförstått allt så löser dtostrf() problemet.
Re: Hjälp med kod Arduino - visa volt på oled
Det går ju att jobba med heltal och skippa floaten. Float i µC brukar ju vara trögt och äta minne.
float voltage = sensorValue * (5.0 / 1023.0); används nu men vad med:
DWORD voltage = (sensorValue * 500) / 1023;
Detta vill då ge spänningen i steg om 0,01V.
Utskriften då?
sprintf(VoltageStr, "%u, %02u", sensorValue / 100, sensorValue % 100);
Den skriver först ut sensorValue/100, alltså hela antal Volt.
Sedan en komma.
Därefter resten av en division med 100 - vilket blir decimalerna. De formateras till 2 st med 'leading zero'.
*POOOFFF* är alla float borta och resultatet är det samma förutom mindre programstorlek och snabbare genomlopp.
float voltage = sensorValue * (5.0 / 1023.0); används nu men vad med:
DWORD voltage = (sensorValue * 500) / 1023;
Detta vill då ge spänningen i steg om 0,01V.
Utskriften då?
sprintf(VoltageStr, "%u, %02u", sensorValue / 100, sensorValue % 100);
Den skriver först ut sensorValue/100, alltså hela antal Volt.
Sedan en komma.
Därefter resten av en division med 100 - vilket blir decimalerna. De formateras till 2 st med 'leading zero'.
*POOOFFF* är alla float borta och resultatet är det samma förutom mindre programstorlek och snabbare genomlopp.
Re: Hjälp med kod Arduino - visa volt på oled
Nu har jag fått det att fungera, med bara ett men, jag har blivit av med mina decimaler.
Med denna kod visas voltvärdet på min oled men bara i heltal, går det att få med en alt två decimaler?
#include "U8glib.h"
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // VDD=5V GND=GND SCL=A5 SDA=A4
void setup() {
}
void loop() {
int sensorValue = analogRead(A0);
float voltage = sensorValue * (5.0 / 1023.0);
int a = (voltage);
u8g.firstPage();
do {
u8g.setFont(u8g_font_gdr25r);
//u8g.drawStr(8, 30, "Eeee");
char buf[9];
sprintf (buf, "%d", a);
u8g.drawStr(18, 42, buf);
} while( u8g.nextPage() );
delay(200);
}
Med denna kod visas voltvärdet på min oled men bara i heltal, går det att få med en alt två decimaler?
#include "U8glib.h"
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // VDD=5V GND=GND SCL=A5 SDA=A4
void setup() {
}
void loop() {
int sensorValue = analogRead(A0);
float voltage = sensorValue * (5.0 / 1023.0);
int a = (voltage);
u8g.firstPage();
do {
u8g.setFont(u8g_font_gdr25r);
//u8g.drawStr(8, 30, "Eeee");
char buf[9];
sprintf (buf, "%d", a);
u8g.drawStr(18, 42, buf);
} while( u8g.nextPage() );
delay(200);
}