Nextion display - IV.díl – posuvník a nastavení jasu
Znáte ta na svých tabletech a mobilních zařízeních. V noci září až oslňují, ve dne, především na slunci na nich není nic vidět. Přitom většina moderních zařízení toto nastavení umí automaticky, jenom to zapnout. My si dnes ukážeme jak to nastavit na našem Nextion displeji.
Nastavit kontrast u displeje Nextion je velmi jednoduché. Lze ho nastavit jak manuálně přes obrazovku displeje, tak přes Arduino to za pomoci potenciometru, nebo světelné čidlo za pár kaček, což je stejně jen potenciometr. Přesný název photoresistor je dost příznačný. A nakonec si ukážeme jak ztmavit displej při nečinnosti.
Současně také v prvním příkladu si ukážeme práci s posuvníkem, jako dalším prvkem displeje.
Co potřebovat budete zcela určitě, je ten displej držet v ruce. Simulace v PC jas displeje nezobrazuje.
Manuální ovládání jasu
Tato akce běží pouze na displeji, Arduino do toho nemusí nijak vstupovat. Tady tedy využijeme potenciál displeje a Arduino vůbec nebudeme obtěžovat. Necháme si titulní stránku, pro tentokrát prázdnou s jedním tlačítkem settings. Po stisknutí tlačítka si zobrazíme stránku nastavení jasu displeje. Nejprve si při inicializaci této stránky aktualizujeme data a pak zde máme posuvník, kterým v reálném čase nastavujeme jas a pak dvě tlačítka. Jedno ukládá nastavení jako výchozí příkazem „dims“, které se zobrazí při spuštění, nebo restartu displeje a pak tlačítko návratu na předchozí stránku. Také jsme využili přenos dat mezi jednotlivými poli a jedno pole jsme si nastavili jako globální proměnnou, aby si displej pamatoval kde byl na posledy. Pokud globální proměnou voláme z jiné stránky než je umístěna, dělá se to trochu jinak, ale na to se ještě podíváme.
HMI soubor ke stažení zde. Nahrajte do displeje a uvidíte, že to funguje. Když se vrátím k displejům SPI, také to lze, ale už to není tak jednoduché.
Automatické ovládání jasu
Potenciometr zapojit umíme, photoresistor můžete zapojit jeden konec do Vout a druhý přímo do analogového portu, v našem případě k A0. Jenom doporučuji připojit tento analogový port přes rezistor 10K k GND. V programu pro Arduino není žádný rozdíl. Potenciometr lze umístit kam Vás napadne, photoresistor doporučuji umístit do krabičky na pravou horní stranu displeje tak, abyste si ho nezastínili rukou při používání. Tam ho najdete i na svých telefonech.
HMI soubor je ke stažení zde. Tady nám zůstala jenom ta první stránka s diodou, z minulého článku.
Sketch displeje opět na začátku provede nezbytná nastavení a pak už jen kontroluje jas a odesílá hodnoty do displeje. A tady POZOR, jestli Vám to poběží v hlavní smyčce, utopíte displej v příkazech. Řešení jsou dvě. Provést kontrolu jednou za čas, třeba jednou za 5 s, nebo ji provádět neustále, ale jas měnit např. až při změně o více než 10%. Vzpomínáte, jak jsme se bavili o poskakování analogových hodnot. Ve sketchi máte tu druhou variantu. Mě se prostě líbí.
#define nextion Serial // port pro komunikaci s displejem Nextion
#define photoresistor A0 // nastaveni nazvu pin pro vstup
//------------------------------------------------------------------
int brightness; // promenna pro nastaveni jasu
int brightness_old; // promenna pro ulozeni posledni hodnoty
const byte brightness_min = 30; // nastaveni minimalniho jasu
const byte hystereze = 10; // nastaveni hysterze zmeny jasu displeje
//------------------------------------------------------------------
void setup() {
nextion_init(9600); // inicializace displeje a nastaveni rychlosti
}
//------------------------------------------------------------------
void loop() {
//------------------------------------------------------------------
brightness = map(analogRead(photoresistor), 300, 1023, brightness_min, 100); // vypocita jas displeje na zaklade okolniho jasu
//------------------------------------------------------------------
if (brightness < brightness_old - hystereze || brightness > brightness_old + hystereze) { // zkontroluje zda je aktualni jas v povolenem rozsahu
brightness_old = constrain(brightness, brightness_min, 100); // omezeni rozsahu hodnoty
brightness_display(brightness_old); // odesli novou hodnotu nastaveni jasu
}
}
//------------------------------------------------------------------
void nextion_init(int speed_init) { // nastaveni pri spusteni displeje
nextion.begin(speed_init);
}//------------------------------------------------------------------
void brightness_display(byte brightness) { // nastav jas displeje
brightness = constrain(brightness, 20, 100);
String brightnessValue = "dim=" + String(brightness); // odesli hodnotu
send_Command(brightnessValue.c_str());
}
//------------------------------------------------------------------
void send_Command(const char* cmd) { // odeslani dat do displeje
nextion.print(cmd);
nextion.write(0xFF);
nextion.write(0xFF);
nextion.write(0xFF);
nextion.flush();
}
Automatické ztmavení displeje
Když se nedívám, nemusí zářit. Stačí po doteku ho rozsvítit a po určité době ho zase zhasnout. Když ho rozsvítíme tak využijeme automatické nastavení jasu.
HMI je zapotřebí změnit. Aby nám to fungovalo, musíme Arduinu říci že jsme se dotkli. Tedy každý prvek v displeji je zapotřebí doplnit o příkaz sendme. Nový HMI je ke stažení zde.
Sketch je oproti předchozímu příkladu doplněn o kontrolu stisknutí displeje, kdy za pomoci značky kontroluje aktuální stav a podle ní spustíme buď ztmavení, nebo automatické nastavení jasu. Je to jednoduché, jenom program nám trochu roste.
#define nextion Serial // port pro komunikaci s displejem Nextion
#define photoresistor A0 // nastaveni nazvu pin pro vstup
//------------------------------------------------------------------
int brightness; // promenna pro nastaveni jasu
int brightness_old; // promenna pro ulozeni posledni hodnoty
const byte brightness_min = 30; // nastaveni minimalniho jasu
const byte hystereze = 10; // nastaveni hysterze zmeny jasu displeje
const int delayTime = 10000; // nastaveni zpozdeni zhasnuti disleje v ms
unsigned long touchTime; // cas posledniho doteku
boolean displayState = true; // stav rozsvicen displeje
//------------------------------------------------------------------
void setup() {
nextion_init(9600); // inicializace displeje a nastaveni rychlosti
}
//------------------------------------------------------------------
void loop() {
//------------------------------------------------------------------
check_display(); // kontrola prijatych dat
//------------------------------------------------------------------
if ((unsigned long)(millis() - touchTime) >= delayTime && displayState) { // kdyz uplynul cas a displej je rozviceny
displayState = false; // zmen status na zhasnuto
brightness_display(brightness_min); // odesli prikaz pro ztmaveni displeje
brightness_old = brightness_min; // nastav novou hodnotu pro kontrolu po rozsviceni
}
else if (displayState) { // jinak kdyz je pouze rozviceno
//------------------------------------------------------------------
brightness = map(analogRead(photoresistor), 0, 1023, brightness_min, 100); // vypocita jas displeje na zaklade okolniho jasu
//------------------------------------------------------------------
if (brightness < brightness_old - hystereze || brightness > brightness_old + hystereze) { // zkontroluje zda je aktualni jas v povolenem rozsahu
brightness_old = constrain(brightness, brightness_min, 100); // omezeni rozsahu hodnoty
brightness_display(brightness_old); // odesli novou hodnotu nastaveni jasu
}
}
}
//------------------------------------------------------------------
void touch_Return(String page_ID, String component_ID, String touch_event) {
touchTime = millis(); // nastav novou hodnotu aktualizace
displayState = true; // zmen status na rozsviceno
}
//------------------------------------------------------------------
void page_Return(String page_ID) {
touchTime = millis(); // nastav novou hodnotu aktualizace
displayState = true; // zmen status na rozsviceno
}
//------------------------------------------------------------------
String Nextion_receive(boolean read_data) { //returns generic
boolean answer = false; // znacka
char bite; // promenna pro ulozeni znaku
String cmd; // promenna pro ulozeni textu
byte countEnd = 0; // pocitadlo
unsigned long previous; // cas spusteni
int timeout = 1000; // doba po kterou se ceka na prichozi data
previous = millis();
do { // cekani na spravnou odpoved
if (nextion.available() > 0) { // kdyz jsou k dispozici data, precti data
bite = nextion.read();
cmd += bite;
if ((byte)bite == 0xff) countEnd++;
if (countEnd == 3) answer = true;
}
}
while (!answer && !((unsigned long)(millis() - previous) >= timeout)); // ceka na spravnou hodnotu, nebo uplynuti casu
if (read_data) { // read general data
if (cmd[0] == 0x65) { // Touch event return data
// 0X65 + Page ID + Component ID + TouchEvent + End
touch_Return(String(cmd[1], DEC), String(cmd[2], DEC), String(cmd[3], DEC));
}
else if (cmd[0] == 0x66) { // Current page ID number returns
// 0X66 + Page ID + End
page_Return(String(cmd[1], DEC));
}
else if (cmd[0] == 0x67) { // Touch coordinate data returns
// 0X67++ Coordinate X High-order+Coordinate X Low-order+Coordinate Y High-order+Coordinate Y Low-order+TouchEvent State+End
}
else if (cmd[0] == 0x68) { // Touch Event in sleep mode
// 0X68++Coordinate X High-order+Coordinate X Low-order+Coordinate Y High-order+Coordinate Y Low-order+TouchEvent State+End
}
}
else { //read get data
if (cmd[0] == 0x70) { // String variable data returns
// X70+Variable Content in ASCII code+End
return cmd;
}
else if (cmd[0] == 0x71) { // Numeric variable data returns
// 0X71+variable binary data(4 bytes little endian mode, low in front)+End
return cmd;
}
}
}
//------------------------------------------------------------------
void nextion_init(int speed_init) { // nastaveni pri spusteni displeje
nextion.begin(speed_init);
}
//------------------------------------------------------------------
void check_display() { // kontrola prijatych dat
if (nextion.available() > 0) // kontroluje obsah pameti, pokud nen nic odeslano, dalsi cast programu se neprovede
{
Nextion_receive(true); // precist hodnoty z serial portu
}
}
//------------------------------------------------------------------
void brightness_display(byte brightness) { // nastav jak displeje
brightness = constrain(brightness, 20, 100);
String brightnessValue = "dim=" + String(brightness); // odesli hodnotu
send_Command(brightnessValue.c_str());
}
//------------------------------------------------------------------
void send_Command(const char* cmd) { // odeslani dat do displeje
nextion.print(cmd);
nextion.write(0xFF);
nextion.write(0xFF);
nextion.write(0xFF);
nextion.flush();
}
Toto je pouze na ukázku interakce displeje s Arduinem. Velmi snadno se automatické ztmavení po uplynutí času dá naprogramovat přímo v displeji za pomoci časovače, na který se podíváme později. Nicméně pokud v Arduinu ponecháte automatické nastavení jasu podle okolního světla, je nutné mu to sdělit, protože Vám to pak při změně přenastaví.
Závěr
Ukázali jsme si nastavení jasu displeje a práci s posuvníkem.
V příštím díle zůstaneme u nastavení jasu, ale doplníme ho o nastavení prodlevy přímo v displeji. Tady se opět využije potenciál displeje, vytvoříme počítadlo opakovaných hodnot a naučíme se přenášet hodnoty do Arduina.
JB
Přidat komentář
Přehled komentářů
-
Výměna ikony
(Zdendis, 8. 2. 2017 8:23:32)
Odpovědět
| Zobrazit odpovědi
Dobrý den,
umí tento display i uživatelsky nastavení ikon ?
Příklad:
Mám oblast na úvodní obrazovce 6 stejně velkých ikon označených 1,2,3,4,5,6 a v nastavení je těch ikon ale až x , šlo by vyrbrat v nastavení jaké ikony se zobrazují na úvodní stránce třeba 6,10,2,5,7,9
díky za čas -
Re: Výměna ikony
(Jaroslav Boháč, 9. 2. 2017 22:41:01)
Odpovědět
Samozřejmě že to lze. Je to jenom na Vás jak to naprogramujete. Vložte ikony, které se budou překrývat a podle nějakého příkazu, se zobrazí ta kterou chcete. Abyste ale věděl co stisknete, je zapotřebí definovat proměnou, která bude souviset s danou ikonou a podle toho se bude dít stisk. Podobný příklad jak na to Vám ukáži v díle, který se bude zabývat textovou klávesnicí, kdy budeme volit mezi malými, velkými písmeny a znaky - tedy budeme na při stisku jednoho místa vybírat ze tří možností podle zobrazené klávesnice- chcete-li ikony.
-
Re: Re: Výměna ikony
(Zdendis, 10. 2. 2017 14:16:29)
Odpovědět
Jak jednoduché moc jste mi pomohl .. děkuji těším se na další díl... skvělá prace
-
Poděkování
(vanyj, 20. 2. 2018 17:24:30)
Odpovědět
Ahoj
Děkuji za vaše články. Jsou dobrou inspirací.