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

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
EonX
Inlägg: 48
Blev medlem: 11 januari 2010, 23:36:56

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

Inlägg av EonX »

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());

}
Användarvisningsbild
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

Inlägg av Hobbyisten »

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"
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 »

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.
Användarvisningsbild
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

Inlägg av Hobbyisten »

bort med parenteserna
Användarvisningsbild
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

Inlägg av Klas-Kenny »

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);
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

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

Inlägg av sodjan »

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
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 »

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.
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);
Såhär ser min kod ut nu:

#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());
}
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

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

Inlägg av sodjan »

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...
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 »

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!!
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

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

Inlägg av sodjan »

> 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:

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(){
}
Du kör så klart oled.drawStr() istället för Serial.println()...
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 »

Sorry alldeles för trög här, nu är jag med på vad du menar :tumupp: ska prova det i morgon.

Återigen tack :shock:
Användarvisningsbild
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

Inlägg av Klas-Kenny »

sodjan skrev:Det kan vara (kanske är) så att float inte stöds av sprintf() i Arduino versionen.
Du verkar ha helt rätt. Vad pinsamt, Arduino som ska vara så fantastiskt enkelt och bra... :roll: :doh:
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

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

Inlägg av sodjan »

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.
Användarvisningsbild
Icecap
Inlägg: 26139
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 »

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.
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 »

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);
}
Skriv svar