Nextion und dual state button

Hi, ich versuche seit geraumer Zeit eine Leuchte per dual state button über den Nextion ein und auszuschalten, das ganze ohne die Nextion Library, ein PWM signal liegt an für die beiden zustände, aber bekomm immer wieder fehler, auch ein Text soll zu Testzwecken angezeigt werden ob an oder aus, was mach ich hier nur falsch

#include <FrequencyTimer2.h>

int Pin10 = 10;

void setup()
{
  pinMode(Pin10, OUTPUT);
  analogWriteResolution(8);
  analogWriteFrequency(Pin10, 100);
  Serial1.begin(9600);
}
void serialEvent()
{
  char effekt = Serial.read();

}

void loop() {
  switch (zustand) {
    case '00 00 00 00'  : {
        analogWrite(Pin10, 26);

        Serial1.print("t0.txt=");
        Serial1.write(0x22);
        Serial1.print("Licht aus");
        Serial1.write(0x22);
        Serial1.write(0xff);
        Serial1.write(0xff);
        Serial1.write(0xff);
        break;
      }
   case '01 00 00 00'  : {
        analogWrite(Pin10, 229);

        Serial1.print("t0.txt=");
        Serial1.write(0x22);
        Serial1.print("Licht an");
        Serial1.write(0x22);
        Serial1.write(0xff);
        Serial1.write(0xff);
        Serial1.write(0xff);
        break;
      }
  }
}

Wie lautet die Fehlermeldung?

Gruß

Gregor

gregorss:
Wie lautet die Fehlermeldung?

Gruß

Gregor

Arduino: 1.8.10 (Windows 10), TD: 1.49, Board: “Teensy 3.2 / 3.1, Serial, 96 MHz (overclock), Faster, US English”

C:\archiv\Arduino\arablink\Licht\Licht.ino:20:10: warning: character constant too long for its type

case ‘00 00 00 00’ : {

^

C:\archiv\Arduino\arablink\Licht\Licht.ino:32:10: warning: character constant too long for its type

case ‘01 00 00 00’ : {

^

Licht: In function ‘void serialEvent()’:
Licht:14: warning: unused variable ‘zustand’
char zustand = Serial.read();

^

Licht: In function ‘void loop()’:
Licht:19: error: ‘zustand’ was not declared in this scope
switch (zustand) {

^

Deine Fehlermeldung stimmt mit deinem Sketch nicht überein.

Und die Meldung sagt doch genau, was du falsch gemacht hast.

also das ist der sketch zur Fehlermeldung, ja ich seh das er sagt "character constant too long for its type

case '01 00 00 00' : {"

aber wie werte ich das aus was aus dem Nextion über serial hereinkommt aus, also für 01 00 00 00 licht ein, und für 00 00 00 00 licht aus, bzw die richtige pwm zuordne

Da gibt es doch hier im Forum schon genug Informationen zu. Bin jetzt mobil und kann nicht weiter verlinken.

Einfach mal hier suchen.

Medolino73: aber wie werte ich das aus was aus dem Nextion über serial hereinkommt aus, also für 01 00 00 00 licht ein, und für 00 00 00 00 licht aus, bzw die richtige pwm zuordne

Das ist doch nicht die normale Antwort des Nextion. Da fehlen doch die 3 Mal 0xFF hinten dran.

Gruß Tommy

komischerweise gibt er das so aus

Sowas ist natürlich Blödsinn:

case '00 00 00 00'

Einfache Anführungszeichen sind für einzelne Zeichen. Nicht für String oder Arrays. Mit switch/case kann man auch nur Datentypen abfragen die in Integer konvertierbar sind

Das ist auch genau was die Fehlermeldung sagt:

character constant too long for its type

Das muss man halt auch mal durchlesen und drüber nachdenken. Googlen kann man diese Fehlermeldung auch

void serialEvent()
{
  char effekt = Serial.read();
}

Das ist semantisch Unsinn. Mit read() liest man ein Byte aus. Du musst mehrere auslesen

Außerdem schreibst du das in eine lokale Variable die dann gleich verworfen wird. Auch das meckert der Compiler an. Für dieses Projekt scheint die sehr viel Grundlagen-Wissen zu fehlen

Medolino73: komischerweise gibt er das so aus

Das ist das, was dein Nextion sendet, aber nicht, was deine Serielle empfängt.

wie finde ich den das heraus was am Arduino ankommt ??

Lass den SerialEvent weg und baue eine ganz normale Leseroutine und gib Dir die eingelesenen Werte als HEX aus. An welchem Serial hast Du denn das Nextion und welchen Arduino benutzt Du?

Gruß Tommy

nutze eigentlich das Teensy 3.2 zu testzwecken, und das Nextion ist am Serial1 angeschlossen,
hab mal mit HTerm ausgelesen und da kommen Ascii codes an, hab auch mal den Sketch abgeändert, aber funktioniert noch nicht, bin mir auch nicht sicher ob das der Richtige weg ist mit Switch case, um den Dual State Button auszuwerten

#include <FrequencyTimer2.h>

int Pin10 = 10;

void setup()
{
  pinMode(Pin10, OUTPUT);
  analogWriteResolution(8);
  analogWriteFrequency(Pin10, 100);
  Serial1.begin(9600);
}

void loop() {

  if (Serial1.available() > 0) {
    int zustand = Serial1.read();
    switch (zustand) {
      case '00'  :
        analogWrite(Pin10, 26);
        Serial1.print("t0.txt=");
        Serial1.write(0x22);
        Serial1.print("Licht aus");
        Serial1.write(0x22);
        Serial1.write(0xff);
        Serial1.write(0xff);
        Serial1.write(0xff);
        break;

      case '01'  :
        analogWrite(Pin10, 229);
        Serial1.print("t0.txt=");
        Serial1.write(0x22);
        Serial1.print("Licht an");
        Serial1.write(0x22);
        Serial1.write(0xff);
        Serial1.write(0xff);
        Serial1.write(0xff);
        break;

    }
  }
}

Du willst den 3. Schritt vor dem 1. Schritt tun.

Lass Dir es doch erst mal ausgeben:

  if (Serial1.available() > 0) {
    char zustand = Serial1.read();
    Serial.println(zustand,HEX);
  }

Da müsste dann etwas kommen mit 3 mal FF hinten dran.

Gruß Tommy

Du verstehst immer noch nicht was read() macht und was ein char ist

Tommy56:
Du willst den 3. Schritt vor dem 1. Schritt tun.

Lass Dir es doch erst mal ausgeben:

  if (Serial1.available() > 0) {

char zustand = Serial1.read();
    Serial.println(zustand,HEX);
  }



Da müsste dann etwas kommen mit 3 mal FF hinten dran.

Gruß Tommy

also das kommt jetzt richtig an, nur untereinnander, vielleicht kann ich den Schalterzustand direkt im Nextion einen Buchstaben z.b. zuweisen, würde für mich die geschichte einfacher machen

Man kann Texte auch als Texte (in Codetags) hier posten. Als Bild ist es sehr suboptimal.

Das ist nicht die normale Antwort vom Nextion. Da hast Du wohl schon bei dessen Bearbeitung im Nextioneditor was versaut.

Gruß Tommy

Im Nextion steht eigentlich nur print bt0.val unter Touch Press Event, das er halt den Zustand sendet,
es sei den ich nehm anstatt “print” das “get”, dann sieht das ganze so aus 71 00 00 00 00 FF FF FF

code bringt jetzt auch kein Fehler, aber funktioniert noch nicht

#include <FrequencyTimer2.h>

int Pin10 = 10;

void setup()
{
  pinMode(Pin10, OUTPUT);
  analogWriteResolution(8);
  analogWriteFrequency(Pin10, 100);
  Serial1.begin(9600);
}

void loop() {

  if (Serial1.available() > 0) {
    char zustand = Serial1.read();
    switch (zustand) {
      case '71 00 00 00 00 FF FF FF'  :
        analogWrite(Pin10, 26);
        Serial1.print("t0.txt=");
        Serial1.write(0x22);
        Serial1.print("Licht aus");
        Serial1.write(0x22);
        Serial1.write(0xff);
        Serial1.write(0xff);
        Serial1.write(0xff);
        break;

      case '71 01 00 00 00 FF FF FF'  :
        analogWrite(Pin10, 229);
        Serial1.print("t0.txt=");
        Serial1.write(0x22);
        Serial1.print("Licht an");
        Serial1.write(0x22);
        Serial1.write(0xff);
        Serial1.write(0xff);
        Serial1.write(0xff);
        break;

    }
  }
}

71 00 00 00 00 FF FF FF sieht doch schon viel besser aus. Suche mal hier im Forum, da gibt es eine fertige Einleseroutine dafür. Dann schaust Du in die Doku und merkast, dass 0x71 der Code für einen numerischen Wert ist.

0x71
    8   Numeric Data Enclosed   0x71 0x01 0x02 0x03 0x04 0xFF 0xFF 0xFF
Returned when get command to return a number
4 byte 32-bit value in little endian order.
(0x01+0x02*256+0x03*65536+0x04*16777216)
data: 67305985

Wenn es das ist, was Du suchst, dann brauchst Du doch nur die Info auszulesen

Ich hätte gedacht (aber ich kann mich irren): Eigentlich willst Du doch ein Touchereignis haben oder habe ich Dich falsch verstanden?

0x65
    7   Touch Event 0x65 0x00 0x01 0x01 0xFF 0xFF 0xFF
Returned when Touch occurs and component’s
corresponding Send Component ID is checked
in the users HMI design.
0x00 is page number, 0x01 is component ID,
0x01 is event (0x01 Press and 0x00 Release)

Gruß Tommy

ja genau darum geht es, bei dem Taster also bei dem Button, wenn man drauf drückt geht die Lampe an und die val ändert sich auf 01, wenn wiederholt drauf drücken, geht die Lampe aus und das val ändert sich auf 00, mehr soll er nicht machen also wäre für Licht an 71 01 00 00 00 FF FF FF und für Licht aus 71 00 00 00 00 FF FF FF