Odeslat nové téma Odpovědět na téma  [ Příspěvků: 9 ] 
Autor Zpráva
 Předmět příspěvku: Arduino a LCD12864
PříspěvekNapsal: úte 03.10.2017 20:22 
Protřelejší uživatel
Protřelejší uživatel
Uživatelský avatar

Registrován: 22.12.2010
Příspěvky: 132
Bydliště: Vyškov
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.


Nahoru
 Profil  
 
 
 Předmět příspěvku: Re: Arduino a LCD12864
PříspěvekNapsal: úte 03.10.2017 20:37 
Mazák
Mazák
Uživatelský avatar

Registrován: 22.4.2010
Příspěvky: 10494
Bydliště: Nový Bydžov ČR
Obrázky: 14
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


Nahoru
 Profil Soukromé album {RCalbum.cz}  
 
 Předmět příspěvku: Re: Arduino a LCD12864
PříspěvekNapsal: úte 03.10.2017 20:48 
Protřelejší uživatel
Protřelejší uživatel
Uživatelský avatar

Registrován: 22.12.2010
Příspěvky: 132
Bydliště: Vyškov
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);


}


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a LCD12864
PříspěvekNapsal: úte 03.10.2017 22:16 
Mazák
Mazák

Registrován: 24.11.2013
Příspěvky: 627
Bydliště: Praha 10, ČR
Obrázky: 9
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&);


Nahoru
 Profil Soukromé album  
 
 Předmět příspěvku: Re: Arduino a LCD12864
PříspěvekNapsal: úte 03.10.2017 23:08 
Mazák
Mazák
Uživatelský avatar

Registrován: 22.4.2010
Příspěvky: 10494
Bydliště: Nový Bydžov ČR
Obrázky: 14
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


Nahoru
 Profil Soukromé album {RCalbum.cz}  
 
 Předmět příspěvku: Re: Arduino a LCD12864
PříspěvekNapsal: stř 04.10.2017 1:35 
Mazák
Mazák

Registrován: 24.11.2013
Příspěvky: 627
Bydliště: Praha 10, ČR
Obrázky: 9
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ší?


Nahoru
 Profil Soukromé album  
 
 Předmět příspěvku: Re: Arduino a LCD12864
PříspěvekNapsal: stř 04.10.2017 6:34 
Zkušený debatér
Zkušený debatér

Registrován: 23.11.2016
Příspěvky: 319
Bydliště: Český Těšín
Obrázky: 2
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


Nahoru
 Profil Soukromé album  
 
 Předmět příspěvku: Re: Arduino a LCD12864
PříspěvekNapsal: stř 04.10.2017 16:01 
Protřelejší uživatel
Protřelejší uživatel
Uživatelský avatar

Registrován: 22.12.2010
Příspěvky: 132
Bydliště: Vyškov
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.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a LCD12864
PříspěvekNapsal: stř 04.10.2017 17:41 
Mazák
Mazák
Uživatelský avatar

Registrován: 22.4.2010
Příspěvky: 10494
Bydliště: Nový Bydžov ČR
Obrázky: 14
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


Nahoru
 Profil Soukromé album {RCalbum.cz}  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 9 ] 

 


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 9 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  

 

  Powered by phpBB® Forum Software © phpBB Group  Český překlad – phpBB.cz 

 

NAVRCHOLU.cz