Close

nahodný výstup z Nextion display

Úvodní stránka Fórum Vaše projekty Arduino nahodný výstup z Nextion display

Aktuálně je na stránce zobrazeno 7 příspěvků - 1. až 7. (celkem z 7)
  • Autor
    Příspěvky
  • #7922
    KuldaCz
    Účastník

    Zdraví potřeboval bych od vás radu ohledně Nextion displaye . Vytvářím přihlašovací konzoly na Nextion dysplay a kontrola se provádí přes arduino uno. ůj problem je , že když zmáčknu tlačítko na dysplaji aby odeslalo kod s textem , tak je 1 ku 50 šance , že kod který dojde do arduina je správný a zbytek je špatně přeložený kod, který by vůbec neměl vycházet. Jo a ten Nextion dysplay je čínská verze.
    Takhle by měl vypadat výstup :
    70 233
    A takhle vypadá většino:

    Éšú˙˙˙
    ˙˙˙
    .¦˙˙˙
    ¸™3˙˙˙
    ý˙˙˙
    ô˙˙˙
    

    A tohle je jen malý vytržek.

    #7925
    Zbyšek Voda
    Správce

    Dobrý den,
    máte dobře nastavenou rychlost komunikace v sériovém monitoru?
    Kdyžtak sem prosím nasdílejte kód a zkusíme to nějak pořešit.

    #7930
    KuldaCz
    Účastník

    Dobrá , zde je můj kod:

    #include <SoftwareSerial.h> 
    #include <Nextion.h>
    #include <SPI.h>
    #include <SD.h>
    
    SoftwareSerial nextion(8, 7);// Nextion TX to pin 8 and RX to pin 7 of Arduino
    
    Nextion myNex(nextion, 9600);
    
    File sd, lok, zk;
    String loged;
    
    void setup() {
      Serial.begin(9600);
      SD.begin(4);
      myNex.init();
    }
    
    void loop() {
      String heslo = myNex.listen();
      
      sd = SD.open("prih.txt");  
      loged = sd.read();
      sd.close();
     
      if(heslo !=""){ // kontrola jestly nekdo něco zmáčknul
            Serial.println(heslo);
          
          zk = SD.open("zk.txt", FILE_WRITE);
          zk.println(heslo);
          zk.close();
          
          if(heslo == "70 233"){
            SD.remove("prih.txt");
            if(!SD.exists("prih.txt")){
              lok = SD.open("log.txt", FILE_WRITE);
              sd = SD.open("prih.txt", FILE_WRITE);
              loged = '1';
              sd.print("1");
              lok.println("233");
              myNex.sendCommand("va0.val=11");
              sd.close();
              lok.close();          
              }       
          }
      }
    
      //Kontrola přihlášenosti
      if(loged=="1"){
        myNex.sendCommand("pr.val=1");
      }else{
        myNex.sendCommand("pr.val=0");       
        }
      
    }
    #7934
    Zbyšek Voda
    Správce

    Dobrý den, napadá mě, že by problém mohl být v porovnání:
    heslo !=""
    Jazyk C++ má totiž řetězce implementované jako objekty – vy používáte objekt String. A u nich je potíž, že nejdou jednoduše porovnávat jako primitivní datové typy. Dojde totiž k porovnání jejich refenrencí a ne jejich hodnot (aspoň myslím).

    Takže u

    String s1 = "A";
    String s2 = "A";

    myslím neplatí rovnost s1 == s2.

    Vy tedy porovnáváte objekt heslo, který je typu String s prázdným řetězcem „“. Dojde k porovnání referencí (něco jako adresa v paměti). Ty dva se ve vašem případě nikdy rovnat nebudou, tedy bude podmínka heslo !="" vždy true.

    K porovnávání hodnot řetězců se používá metody equals – viz https://www.arduino.cc/en/Reference/StringEquals

    Tento problém s porovnáváním řetězců tam pak máte několikrát.

    Snad to pojede 🙂

    #7935
    KuldaCz
    Účastník

    Nechápejte to špatně , ale to o čem vy píšete nemá s tím nic společné , to jen kontroluje , jestli přichází nějaká zpráva , nebo jestli je to jen prázdný nonsense.

    #9726
    fundump
    Účastník

    Dobry den prajem.

    Ja som zacal pouzivat tieto Nextion displaye, objednavam ich od vyrobcu a cenovo su rovnako na tom ako z ciny (ebay …)

    Vela veci este neviem ale kazdopadne mi to bezi na seriovej komunikacii o rychlosti 115200.

    Ked som skusal pomalsiu rychlost, tak mi to nefungovalo spravne. Tak neviem ci som aspon trochu poradil.

    S pozdravom fundump

    #9745
    posjirka
    Účastník

    rozhodně se jedná o chybu bu´d v:
    – nastavení rychlosti seriove linky
    – nastavení serial monitoru (ukončovací znaky … NewLine, CR, …)
    – knihovny SW seriové linky.

    Nejspáíš to bude to varinata 1 nebo 3. Dělá mi to taky u komunikace s GSM modulem a te´d jsem to na nějákou dobu odložil. mezitím jsem se dozvěděl, že SoftwareSerial není úplně ideální a je lepší použít její novější verzi/odnož.:
    https://github.com/sirleech/NewSoftSerial

    zkus tuto knihovnu, nebo si sniž rychlost komunikaci na 9600 Bd (hlavně si to nastav na to LCD jinak je ti to prd platné. Otázka zní jestli to jde)

    Jinak bys musel použít jinou desku (MEGA), která má 2 seriové linky (UART) přímo HW integrované v desce, takže nemuíš nic simulovat. Už hodně dlouho přemýšlím nad deskou METABOARD, která by měla být Arduino kmpatibilní (né 100%, protože má jiné zapojení ) a využívá V-USB pro programování a komunikaci, zatím co HW UART má volný pro jiné aplikace. Pro tebe by o bylo ideální řešení. Bohužel nemám vyzkoušeno 🙁

Aktuálně je na stránce zobrazeno 7 příspěvků - 1. až 7. (celkem z 7)
  • Pro reakci na toto téma se musíte přihlásit.