OK

Při poskytování služeb nám pomáhají soubory cookie. Používáním našich služeb vyjadřujete souhlas s naším používáním souborů cookie. Více informací

Úvodní stránka » Arduino » Nextion display - IV.díl – posuvník a nastavení jasu

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

jaroslav.bohac@arduinotech.cz

Přidat komentář

Zvýrazněné položky jsou povinné.

Přehled komentářů

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

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

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


TOP produkty

Arduinotech GSM shield

Arduinotech GSM shield
877 Kč s DPH

Arduino DUE

Arduino DUE
696 Kč s DPH

Kontakt

Ing. Petr Foltýn
Kunčice pod Ondřejníkem 814, 73913
TOPlist