RCmania.cz - web pro modeláře a modely
http://www.rcmania.cz/

Arduino a LCD12864
http://www.rcmania.cz/viewtopic.php?f=41&t=82079
Stránka 1 z 1

Autor:  X-Blade [ úte 03.10.2017 20:22 ]
Předmět příspěvku:  Arduino a LCD12864

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.

Autor:  Celeron [ úte 03.10.2017 20:37 ]
Předmět příspěvku:  Re: Arduino a LCD12864

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

Autor:  X-Blade [ úte 03.10.2017 20:48 ]
Předmět příspěvku:  Re: Arduino a LCD12864

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


}

Autor:  Grugh [ úte 03.10.2017 22:16 ]
Předmět příspěvku:  Re: Arduino a LCD12864

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

Autor:  Celeron [ úte 03.10.2017 23:08 ]
Předmět příspěvku:  Re: Arduino a LCD12864

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

Autor:  Grugh [ stř 04.10.2017 1:35 ]
Předmět příspěvku:  Re: Arduino a LCD12864

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ší?

Autor:  bahora [ stř 04.10.2017 6:34 ]
Předmět příspěvku:  Re: Arduino a LCD12864

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

Autor:  X-Blade [ stř 04.10.2017 16:01 ]
Předmět příspěvku:  Re: Arduino a LCD12864

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.

Autor:  Celeron [ stř 04.10.2017 17:41 ]
Předmět příspěvku:  Re: Arduino a LCD12864

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

Stránka 1 z 1 Všechny časy jsou v UTC + 1 hodina
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/