Switch to full style
Dneska se procesory objevují všude, pokud máte nějaký nápad, či udělát, tak se neváhejte pochlubit.
Odeslat odpověď

Arduino a LCD12864

úte 03.10.2017 21:22

Ahoj, můžete mi někdo poradit jak napsat aby mi displej zobrazoval proměnou.
Když napíšu lcd.print("IN "); tak je vše v pohodě,
ale když lcd.print(INtep); kde INtep je proměnná tak mi to vyhodí chybu že to není v uvozovkách.
Přitom když napíšu serial.print(INtep); tak mi to v monitoru normálně vypíše.
Prosím polopaticky nejsem žádný programátor.
Ještě jeden dotaz jak se píše °C na displeji mi to napíše A C.

Re: Arduino a LCD12864

úte 03.10.2017 21:37

No a jakou máš knihovnu? Grafickou pro čip ST7920?
A jako co máš definovanou tu proměnnou INtep?
Ten symbol stupně je někde nadefinovanej?
Jirka

Re: Arduino a LCD12864

úte 03.10.2017 21:48

Knihovna je "U8glib.h" a proměnná je float.


#include "U8glib.h"
#include "DHT.h"
#define pinDHT 5
#define typDHT22 DHT22
#define pin1DHT 6
#define typ1DHT22 DHT22
DHT inDHT(pinDHT, typDHT22);
DHT outDHT(pin1DHT, typ1DHT22);


int tlacitko = 7;
int ventylator = 8;
int stavtla;
boolean aaa;



#define EN 13
#define RW 12
#define RS 11

U8GLIB_ST7920_128X64_1X lcd(EN, RW, RS); // inicialiyace OLED dipleje z knihovny U8glib

long int prepis = 0;


void setup(void)
{

pinMode (ventylator, OUTPUT);
pinMode (tlacitko, INPUT);

if (lcd.getMode() == U8G_MODE_R3G3B2) {
lcd.setColorIndex(255);
}
else if (lcd.getMode() == U8G_MODE_GRAY2BIT) {
lcd.setColorIndex(3);
}
else if (lcd.getMode() == U8G_MODE_BW) {
lcd.setColorIndex(1);
}



}


void loop(void){

lcd.firstPage();
do {
teplomer();
} while( lcd.nextPage() );

// rebuild the picture after some delay
delay(500);




float INtep = inDHT.readTemperature();
float INvlh = inDHT.readHumidity();

float OUTtep = outDHT.readTemperature();
float OUTvlh = outDHT.readHumidity();


if ((INvlh > OUTvlh) && (INtep < OUTtep)) {
digitalWrite(ventylator, HIGH);
}


else {
stavtla = digitalRead(tlacitko);
digitalWrite(ventylator, stavtla);
}
aaa = digitalRead(ventylator);

}


void teplomer(void){



lcd.setFont(u8g_font_unifont); // nastaveni pisma, toto pismo cca 15x4 znaku

lcd.setPrintPos(0, 10); //nastaveni pozice (0, 0) levy horni roh, max 128x64

lcd.print("IN ");
// lcd.print(INtep);
lcd.print("C ");
// lcd.print(INvlh);


}

Re: Arduino a LCD12864

úte 03.10.2017 23:16

Já nemám arduino a neznám přímo jeho možnosti. Ale jeho jazyk vychází zdá se z C++.
Patrně umí objekt lcd vypsat pouze buď pole znaků nebo řetězec a proto je potřeba nejdřív float proměnnou na něj převést.

Podle internetu by mohlo fungovat i něco takového:
Kód:
char tmp [6];
dtostrf(INtep, 5, 2, tmp);
lcd.print(String(tmp) + "°C");

případně pouze:
Kód:
lcd.print(String(INtep, 2));


https://www.arduino.cc/en/Reference/StringConstructor

Ale za nic z toho neručím. :mrgreen:

Ten znak pro stupně nemusí být podporovaný. Nepatří do základní tabulky ASCII:
https://cs.wikipedia.org/wiki/ASCII

Edit -------------
Beru všechno zpět. Chvíli mi trvalo najít rozhraní třídy Print, která je předkem toho lcd displeje.
mělo by stačit:
Kód:
lcd.print((double) INtep);


Tohle jsou (asi) všechny varianty metody print a float mezi nimi není a implicitní konverze float->double asi není definovaná:
Kód:
    size_t print(const __FlashStringHelper *);
    size_t print(const String &);
    size_t print(const char[]);
    size_t print(char);
    size_t print(unsigned char, int = DEC);
    size_t print(int, int = DEC);
    size_t print(unsigned int, int = DEC);
    size_t print(long, int = DEC);
    size_t print(unsigned long, int = DEC);
    size_t print(double, int = 2);
    size_t print(const Printable&);

Re: Arduino a LCD12864

stř 04.10.2017 0:08

Moc jsem to nezkoumal a nejsem si jistej, ale není to tím, že máš proměný INtep a INvlhk lokálně definovaný v loop a tudíž ve void teploměru se chovaj jako jiná proměná? IDE tohle nehlídá, taky se mi to stalo. Nadefinuj je před setupem aby byly pro celej program.
Ale třeba je to něco ouplně jinýho, v Arduinu stále dost tápu. :)
Zkoušel jsi tuhle knihovnu: http://playground.arduino.cc/uploads/Code/LCD12864.zip

to Grugh:
Já tisknu na nokia displej float vario na 3 desetiný místa tímhle:
lcd.print((vario), 3);

Jirka

Re: Arduino a LCD12864

stř 04.10.2017 2:35

Celeron píše:Moc jsem to nezkoumal a nejsem si jistej, ale není to tím, že máš proměný INtep a INvlhk lokálně definovaný v loop a tudíž ve void teploměru se chovaj jako jiná proměná? IDE tohle nehlídá, taky se mi to stalo. Nadefinuj je před setupem aby byly pro celej program.
Ale třeba je to něco ouplně jinýho, v Arduinu stále dost tápu. :)
Zkoušel jsi tuhle knihovnu: http://playground.arduino.cc/uploads/Code/LCD12864.zip

to Grugh:
Já tisknu na nokia displej float vario na 3 desetiný místa tímhle:
lcd.print((vario), 3);

Jirka

Samozřejmě máš naprostou pravdu. INtep je deklarovaná jako lokální proměnná funkce loop(). A proto je ve funkci teplomer() neznámá.
Jsem to nějak přehlédl. A to jsem profík :oops: .

@X-Blade
deklarace někde nad funkcemi
Kód:
float INtep, INvlh;

přiřazení ve funkci loop
Kód:
INtep = inDHT.readTemperature();
INvlh = inDHT.readHumidity();

Při prvních voláních budou hodnoty INtep a INvlh nepřiřazené a vypíší se nějaké hlouposti. Podle mě by se měl cyklus s výpisem a čekání umístit až na konec funkce loop().
Nemá IDE nějakou možnost automatické přeformátování zdrojového kódu aby byl čitelnější?

Re: Arduino a LCD12864

stř 04.10.2017 7:34

Grugh píše:Při prvních voláních budou hodnoty INtep a INvlh nepřiřazené a vypíší se nějaké hlouposti. Podle mě by se měl cyklus s výpisem a čekání umístit až na konec funkce loop().
Nemá IDE nějakou možnost automatické přeformátování zdrojového kódu aby byl čitelnější?


Pokud ti nestačí možnost přeformátovat text z orginálního Arduino IDE, pak se koukni na Visual Studio Code je free a multiplatformní s podporou folding
a dalších užitečných věcí s plnou podporou Arduina včetně instalace knihoven ....

https://marketplace.visualstudio.com/it ... de-arduino

Re: Arduino a LCD12864

stř 04.10.2017 17:01

Tak už to funguje bylo to tím že proměnná byla ve funkci loop. Taková hloupá chyba a jak jsem se u ní zapotil a bez vás bych se asi ještě potil.
Ještě se zeptám pokud budu chtít změnit písmo nebo velikost tak to změním zde- lcd.setFont(u8g_font_unifont); pokud ano co tam napsat a kde zjistím co tam napsat?
Aby toho nebylo málo je těžké udělat menu? Něco jako tři tlačítka jedním se budu přepínat mezi obrazovkami a dvěma bych měnit hodnoty nahoru a dolů. Nebo už je to vyšší dívči a mám na to raději zapomenout.

Re: Arduino a LCD12864

stř 04.10.2017 18:41

Na netu by měl být popis knihovny co se dá nastavit. Nebo to bude přímo v knihovně.
Tlačítka by neměl být problém. Co máš za desku? Pokud mini tak ohledáváním, pokud mega tak by to šlo přes přerušení.
Naštuduj na netu, příkladů je tam kupa. :)
Jirka
Odeslat odpověď