Komunikace Arduino-Nextion

mato
Příspěvky: 49
Registrován: 18 říj 2019, 20:24
Reputation: 0

Komunikace Arduino-Nextion

Příspěvek od mato » 18 říj 2019, 20:45

Ahoj,
potřeboval bych prosím poradit proč mi jde vždy jen odeslat data do displeje.
Pokud chci ovládat vstupy v arduinu z displeje,tak mi to jde jen pokud vymažu(odkomentuju) tu část kodu
kde ovládám to odesílání dat z arduina.viz kod.
Omlouvám v tomto začínám,takže dělám někde nějakou blbost,ale nikde jsem na netu nenašel radu,která by mi pomohla....
Nebo snad obousměrná komunikace je problém????
Děkuji

Kód: Vybrat vše

// připojení potřebné knihovny
#include <SoftwareSerial.h>
// nastavení čísel propojovacích pinů
#define RX 7
#define TX 8
#define LEDka 13
int Pin_pohyb = 9;
 String zprava ="";
// vytvoření objektu swSerial z knihovny s nastavenými piny
SoftwareSerial swSerial(RX, TX);
// proměnná pro uložení času přepisu textu
unsigned long casPrepisu = 0;

void setup() {
  // zahájení komunikace po softwarové sériové lince
  swSerial.begin(9600);
   //swSerial.setTimeout(100);
  // nastavení LED diody jako výstupu
  // a zapsání základního stavu
  pinMode(LEDka, OUTPUT);
  digitalWrite(LEDka, LOW);
  pinMode(Pin_pohyb, INPUT);
   digitalWrite(Pin_pohyb, LOW);
   
    // nastaví objekty do základního stavu
   swSerial.print("A.b0.picc=39");SerialFFF();swSerial.print("A.b1.picc=39");SerialFFF();
   swSerial.print("A.b2.picc=39");SerialFFF();swSerial.print("A.b3.picc=39");SerialFFF();
   swSerial.print("A.bt0.val=0");SerialFFF();swSerial.print("A.bt1.val=0");SerialFFF();
   swSerial.print("A.bt2.val=0");SerialFFF();swSerial.print("A.bt3.val=0");SerialFFF();
}

void loop() {
// kontrola příchozí zprávy
  if (swSerial.available()) {
    // vytvoření proměnné pro uložení zprávy
   String zprava;
    // načtení všech znaků zprávy s převodem
    // (char) na znaky
    while (swSerial.available()) {
      zprava += swSerial.readString();
        }
    // pokud najdeme ve zprávě znak b,
    // LED diodu zapneme
    if (zprava.substring(1) == "b") {
      digitalWrite(LEDka, HIGH);
       }
    // pokud najdeme ve zprávě znak a,
    // LED diodu vypneme
    else if (zprava.substring(1) == "a") {
      digitalWrite(LEDka, LOW);
        }
  }
  
  
if(digitalRead(Pin_pohyb) == HIGH){
     digitalWrite(LEDka, HIGH);
     swSerial.print("A.b0.picc=96");        // do b0 nahraje obrazek 
     SerialFFF();
     swSerial.print("A.n1.val=");
     swSerial.print(digitalRead(Pin_pohyb)); 
     SerialFFF();
    }else if(digitalRead(Pin_pohyb) == LOW)
     {
      digitalWrite(LEDka, LOW);
     swSerial.print("A.b0.picc=39");        // do b0 nahraje obrazek 
     SerialFFF();
     swSerial.print("A.n1.val=");
     swSerial.print(digitalRead(Pin_pohyb)); 
     SerialFFF();
      }
}

void SerialFFF(void)
  {
    swSerial.write(0xFF);
    swSerial.write(0xFF);
    swSerial.write(0xFF);
    delay(100);
  }


KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: Komunikace Arduino-Nextion

Příspěvek od KamilV » 18 říj 2019, 21:15

Ahoj,
co znamená Pin_pohyb? A proč je deklarován jako int, když ostatní piny jsou #define?
Čeho chceš docílit řádky:

Kód: Vybrat vše

pinMode(Pin_pohyb, INPUT);
digitalWrite(Pin_pohyb, LOW);
Je ten pin vstupní nebo výstupní?
Co mění jeho hodnotu?
K čemu je long casPrepisu?
Kterou část kódu musíš zakomentovat, aby to šlo podle představ?

mato
Příspěvky: 49
Registrován: 18 říj 2019, 20:24
Reputation: 0

Re: Komunikace Arduino-Nextion

Příspěvek od mato » 18 říj 2019, 21:36

Na Pin_pohyb je připojeno čidlo pohybu. Je deklarovám jako INPUT,takže jeho hodnotu
mění výstup z toho čidla.
casPrepisu je zůstatek z předešlých pokusů(v tomto nemá žádný smysl).

Takto mi funguje čtení z čidla a zapne LEDku na pinu 13 a dokonce se mi to správně chová a zobrazuje i na displeji,
ale pokud chci LEDku zapnout přes tlačítko z displeje,tak to nefunguje

Zakomentovat musím tu celou dolní část kde čtu signál z toho pohyb.čidla

Kód: Vybrat vše

if(digitalRead(Pin_pohyb) == HIGH){
......
Potom mi funguje ta horní část kde data přijímám a zapnu LEDku na pinu 13

Kód: Vybrat vše

  if (swSerial.available()) {
.....

Uživatelský avatar
SkullKeep
Příspěvky: 290
Registrován: 23 srp 2017, 18:51
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Komunikace Arduino-Nextion

Příspěvek od SkullKeep » 18 říj 2019, 23:00

Podle mne by mělo stačit dát slovo else před if v podmínce při čtení PINU. Místo

Kód: Vybrat vše

if(digitalRead(Pin_pohyb) == HIGH){
dát

Kód: Vybrat vše

 else if(digitalRead(Pin_pohyb) == HIGH){
a nakonec }.
:twisted: :?: :arrow: :geek: P. Q. M.

mato
Příspěvky: 49
Registrován: 18 říj 2019, 20:24
Reputation: 0

Re: Komunikace Arduino-Nextion

Příspěvek od mato » 19 říj 2019, 00:05

Přeci nemůžu začínat podmínku else if.......,nebo snad ano!!!
Zdá se, že už mi to tak nějak funguje,
začal jsem to psát celé od začátku. Zřejmě jsem tam někde udělal nějakou logickou chybu,
ale vypadá to,že by to mohlo už snad fungovat.Máme po půlnoci,takže doladění nechám na zítra :o .
Ale každopádně v tuto chvíli všem děkuji za snahu.

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Komunikace Arduino-Nextion

Příspěvek od gilhad » 19 říj 2019, 04:38

Samozrejme nemuzes zacinat podminku else if, ale muzes tu predchozi koncit else a v pripade, ze neni splnena, tak se provede ten kod za else a v nem muze byt napriklad podmineny prikaz, cili if.

Kód: Vybrat vše

if (rozsvitit_ledku) {
   Serial.println("rozsvecim");
   digitalWrite(led, HIGH);
} else {
   Serial.println("zhasinam");
   digitalWrite(led, LOW);
};

Kód: Vybrat vše

if (rozsvitit_ledku) {
   Serial.println("rozsvecim");
   digitalWrite(led, HIGH);
} else {
   if (nezhasinat) {
       Serial.println("nechavam ji jak je");
   } else {
     Serial.println("zhasinam");
     digitalWrite(led, LOW);
   };
};

Prikaz za if (nebo else) muze byt vzdy jen jeden, pokud je jich potreba vic, tak se musi uzavrit do bloku pomoci { a }, protoze blok je navenek jen jeden prikaz. Pokud je jen jeden, tak uzavirat nemusi.

Kód: Vybrat vše

if (rozsvitit_ledku) 
   digitalWrite(led, HIGH);
 else 
   if (nezhasinat) 
       Serial.println("nechavam ji jak je");
    else 
     digitalWrite(led, LOW);
(Na druhou stranu neni chyba pouzit blok obsahujici jen jeden prikaz - casto to usnadni nasledujici upravy, kdy tam clovek chce pridat jeste jeden a neuvedomi si, ze to neni v bloku a pak se divi. A dokonce neni chyba pouzit prazdny blok, akorat se to hodi jen zridka.)

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Komunikace Arduino-Nextion

Příspěvek od gilhad » 19 říj 2019, 05:00

K tomu prazdnemu bloku treba

Kód: Vybrat vše

char *s, *t; // ukazatele na nejake znaky v pameti 
    // s ukazuje na zacatek kopirovaneho retezce (source)
    // t (target) na misto, kam ho chci zkopirovat. 
    // Kopiruju do znaku \0 coz je v C/C++ konec retezce
...
for (; *t=*s ; s++, t++) {}; // to je to kopirovani

for (; je prikaz for, kde nedelam zadnou inicializaci, takze prvni cast do stredniku je prazdna - predpokladam, ze s a t jsem nastavil nekde driv

*t=*s; je podminka, ktera musi byt splnena, aby cyklus pokracoval dalsim pruchodem.

Tady je pouzito jen jedno = schvalne, protoze to nejdriv vezme znak, na ktery ukazuje s, rovnitko ho vrazi do mista, na ktere ukazuje t
a hodnota prirazeni je prirazovana hodnota, takze ten vyraz se rovna prave zapsanemu znaku a pokud je ten znak nenulovy (\0 je konec retezce), tak se pokracuje provedenim prikazu v tele cyklu s novyma hodnotama

{} je telo cyklu a nedela nic, nebot znak jiz zkopirovan byl, tak nic delat neni treba

s++, t++ je iteracni krok, ktery se provede na zaver cyklu, abychom dostali nove hodnoty pro testovani v podmince. Tady zvetsime s (cili posuneme ukazatel na dalsi znak source, carka je operator zapomenuti, co je od ni vlevo se zahodi a vyraz bude mit hodnotu vpravo, coz je t++, cili posunuti cile a vzhledem k tomu, ze for nijak nezajima hodnota toho tretiho vyrazu, tak se zahodi taky

Nacez samozrejme nasleduje opet vyhodnoceni podminky a pokud je prirazovany znak \0 (konec retezce), tak jeho zapsanim cyklus konci (cimz je zaroven zajisteno, ze i ten cilovy zkopirovany retezec bude radne ukoncen znakem \0)

---

Pokud te to zajima vic, projdi si C++, protoze v tom se Arduino programuje, i kdyz se to autori snazi vsemozne skryvat pred uzivateli, "aby je nevydesili" :lol: :roll:

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Komunikace Arduino-Nextion

Příspěvek od ondraN » 19 říj 2019, 07:41

K tomu předchozímu použití for bych jen dodal, že je to dobrý návod na psaní blbě čitelného kódu. Formálně je sice správně, ale čitelnost, co to vlasně dělá je :?

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Komunikace Arduino-Nextion

Příspěvek od gilhad » 19 říj 2019, 09:06

Jasne ze to neni vhodny priklad pro zacatecniky v Arduinu, jak programovat, na druhou stranu je to jeden z prikladu v Ccku, co vsechno jde napsat a jak to udelat minimalisticky. Clovek po tom sahne, kdyz bud setri kazdy byte a takt, nebo je to pro nej notoricky znamy obrat (a nejspis si to zabali do makra). (A pro mnohe starsi programatory to notoricky znamy a dobre citelny obrat je - i kdyz spis jeste ve tvaru

Kód: Vybrat vše

for (;*t++=*s++;){};
ktery je svym zpusobem jeste nazornejsi)

Tady slo o myslenkove cviceni ukazat, ze jsou konstrukce, kde prazdny blok ma svuj smysl - nic vic - proto je to taky samostatne.

Doporuceny postup je v prispevku predtim, stejne jako ukazka, proc se spravne odsazovani vyplati a ze else if je naprosto legitimni obrat, jen ma vyznam jiny, nez mu prisuzoval puvodni tazatel.

mato
Příspěvky: 49
Registrován: 18 říj 2019, 20:24
Reputation: 0

Re: Komunikace Arduino-Nextion

Příspěvek od mato » 19 říj 2019, 10:59

Dobré dopoledne přeji....,
tak jsem to "trošku" překopal. Funguje to,ALE.....!!!
Není to 100%.Třeba 10x to vyhodnotí příchozí zprávu dobře po 11 to
tu příchozí zprávu nevezme. Musím znova tlačítko zap/vyp.
Jenom ještě objasním mou myšlenku jak by to mělo fungovat
Pokud na senzoru pohybu je pohyb=zapni LED
Pokud přepnu tlačítko na displeji=zapni LED
Pokud je tlačítko na displeji zapnuté =zapni LED - bez ohledu na senzor pohybu
Pokud tlačítko na displeji vypnu=vypni LED - ale už s ohledem na senzor pohybu,pokud na senzoru pohyb nech LED svítit
Ve finále by toho mělo být v projektu více,ale teď zkouším postupně základní věci na NEXTIU.
(jeden projekt takto už mám s LCD,teď jsem to chtěl vyzkoušet se snad lepším displejem)

Kód: Vybrat vše

// Nextion LCD displej
// navody.arduino-shop.cz

// připojení potřebné knihovny
#include <SoftwareSerial.h>
// nastavení čísel propojovacích pinů
#define RX 7
#define TX 8
#define LEDka 13
#define Pin_pohyb 9
boolean stav=false;//kontroluje skutečný stav na LEDce resp.stav příchozí zprávy
//String zprava="";
// vytvoření objektu swSerial z knihovny s nastavenými piny
SoftwareSerial swSerial(RX, TX);

void setup() {
  // zahájení komunikace po softwarové sériové lince
  swSerial.begin(9600);
  swSerial.setTimeout(100);
  // nastavení LED diody jako výstupu
  // a zapsání základního stavu
  pinMode(LEDka, OUTPUT);
  digitalWrite(LEDka, LOW);
  pinMode(Pin_pohyb, INPUT);  //senzor pohybu
  digitalWrite(Pin_pohyb, LOW);
   //nastavení objektů displeje do základního stavu
   swSerial.print("A.b0.picc=39");SerialFFF();swSerial.print("A.b1.picc=39");SerialFFF();
   swSerial.print("A.b2.picc=39");SerialFFF();swSerial.print("A.b3.picc=39");SerialFFF();
   swSerial.print("A.bt0.val=0");SerialFFF();swSerial.print("A.bt1.val=0");SerialFFF();
   swSerial.print("A.bt2.val=0");SerialFFF();swSerial.print("A.bt3.val=0");SerialFFF();
}

void loop() {
 
     if(digitalRead(Pin_pohyb) == HIGH){
     digitalWrite(LEDka, HIGH);
     swSerial.print("A.b0.picc=96");        // do b0 nahraje obrazek 
     SerialFFF();
     swSerial.print("A.n1.val=");
     swSerial.print(digitalRead(Pin_pohyb)); 
     SerialFFF();
    }else if(digitalRead(Pin_pohyb) == LOW && stav==true)
     {
     digitalWrite(LEDka, HIGH);
     swSerial.print("A.b0.picc=39");        // do b0 nahraje obrazek 
     SerialFFF();
     swSerial.print("A.n1.val=");
     swSerial.print(digitalRead(Pin_pohyb)); 
     SerialFFF();
     } else {                          // if (digitalRead(Pin_pohyb) == LOW ) {
     digitalWrite(LEDka, LOW);
     swSerial.print("A.b0.picc=39");        // do b0 nahraje obrazek 
     SerialFFF();
     swSerial.print("A.n1.val=");
     swSerial.print(digitalRead(Pin_pohyb)); 
     SerialFFF();
      }

// kontrola příchozí zprávy
String zprava=swSerial.readString();
if(zprava== "svetlo1vyp"){
  digitalWrite(LEDka, LOW);
   stav=false;
   //delay(100);
  }
 else if(zprava== "svetlo1zap"){
    digitalWrite(LEDka,HIGH);
     stav=true;
    // delay(100);
  }
 }

void SerialFFF(void)
  {
    swSerial.write(0xff);
    swSerial.write(0xff);
    swSerial.write(0xff);
    delay(100);
  }
Dle toho co jsem vypozoroval to spolehlivost ovlivňují hlavně hodnoty.....,v setupu

Kód: Vybrat vše

swSerial.setTimeout(100)
; a delay ve void

Kód: Vybrat vše

SerialFFF(void)
Kontrola příchozí zprávy mi takto funguje mnohem spolehlivěji,než

Kód: Vybrat vše

swSerial.available()
proč netuším.....!!!
Přeji hezký den

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Google [Bot] a 6 hostů