- LiTime Speicher und Akkus         
Ergebnis 1 bis 10 von 10

Thema: Hilfe bei einem Code Teil

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    25.03.2018
    Beiträge
    9

    Frage Hilfe bei einem Code Teil

    Hallo zusammen,

    vorweg, ich bin Anfänger was die Programmierung eines NodeMCU-Boards angeht!

    Ich habe folgenden Code, welcher auch bereits super funktioniert!

    Code:
    #include <RCSwitch.h>
    
    int led = 5;     // LED pin (D1)
    int button = 16; // push button is connected (D0)
    int temp = 0;    // temporary variable for reading the button pin status
    
    RCSwitch mySwitch = RCSwitch();
    
    void setup() {
      Serial.begin(9600);
      pinMode(led, OUTPUT);   // declare LED as output
      pinMode(button, INPUT); // declare push button as input
      mySwitch.enableTransmit(0); //Daten PIN D3 für das Sender Modul
      // Optional set protocol (default is 1, will work for most outlets)
      mySwitch.setProtocol(1);
    
      // Optional set pulse length.
      mySwitch.setPulseLength(759);
    }
    
    void loop() {
      temp = digitalRead(button);
         
         if (temp == LOW) {
            digitalWrite(led, LOW);
            Serial.println("bereit zum senden!");
            delay(1000);
         }
         if (temp == HIGH) {   
            digitalWrite(led, HIGH);
            /* Binärcode für die Klingel (433MHZ) */
            mySwitch.send("010010010100000101000001");
            Serial.println("Signal wurde gesendet");
            delay(500);
           }
    }
    Jetzt würde ich gerne wenn das Signal von einem zweiten Taster an einem anderen Pin gesendet wird, einen anderen Binärcode senden!

    Hab also 2 Taster, welche jeweils einen anderen Binärcode senden sollen!

    Hoffe ihr könnt mir helfen.

    Vielen Dank.

    Lieben Gruß, littlekenny

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Code:
    #include <RCSwitch.h>
    
    int led = 5;       // LED pin (D1)
    int button_1 = 16; // push button is connected (D0) 
    int button_2 = 5;    // müste wohl D1 sein ???   wo der button dran hängt hier den entsprechendn Wert eintragen
    int temp = 0;      // temporary variable for reading the button pin status
    
    
    void setup() {
      Serial.begin(9600);
      pinMode(led, OUTPUT);   // declare LED as output
      pinMode(button_1, INPUT); // declare push button as input   ersten button
      pinMode(button_2, INPUT); // declare push button as input   zweiter button
      mySwitch.enableTransmit(0); //Daten PIN D3 für das Sender Modul
      // Optional set protocol (default is 1, will work for most outlets)
      mySwitch.setProtocol(1);
    
      // Optional set pulse length.
      mySwitch.setPulseLength(759);
    }
    
    
    void loop() {
    
         temp = digitalRead(button_1);   // hier fragst Du den ersten Button ab, der Status landet in temp
         
         if (temp == LOW) {
            digitalWrite(led, LOW);
            Serial.println("bereit zum senden!");
            delay(1000);
         } else    // ansonsten kann er nur High sein
         {
            digitalWrite(led, HIGH);
            /* Binärcode für die Klingel (433MHZ) */
            mySwitch.send("010010010100000101000001");
            Serial.println("Signal wurde gesendet");
            delay(500);
          }
    
         temp = digitalRead(button_2);   // hier fragst Du den zweiten Button ab, der Status landet wieder in temp
         
         if (temp == LOW) {
            digitalWrite(led, LOW);
            Serial.println("bereit zum senden!");
            delay(1000);
         } else    // ansonsten kann er nur High sein
         {
            digitalWrite(led, HIGH);
            /* Binärcode für die Klingel (433MHZ) */
            mySwitch.send("010010010100000101000001");
            Serial.println("Signal wurde gesendet");
            delay(500);
          }
    
    }
    das ist nur ganz grob wie es sein könnte, aber nicht wirklich gut....

    In deinem Programm sendet er eigentlich IMMER, weil ja der Button entweder high oder low ist.
    Eigentlich gibt es ja nur Sinn zu senden wenn der Button gedrückt wird und dann auch nur einmal.
    Man sollte also dann nix mehr tun, bis der Button wieder losgelassen wurde.
    Und dann noch nen Moment warten, weit die Tasten meistens Prellen (mehrfach Auslösung) während der Kontakt
    schließt oder sich öffnet.
    Geändert von Siro (29.03.2018 um 16:30 Uhr)

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    25.03.2018
    Beiträge
    9
    Vielen Dank für deine Hilfe. Probiere es nachher mal aus.

    Wie könnte es denn besser aussehen? Bin leider nicht so fit im Programmieren!

    Vielen Dank.

    Lieben Gruß, littlekenny

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Hallo littlekenny,

    Viele Wege führen zum Ziel, deshalb hier mal eine Möglichkeit:

    Pseudocode:

    wenn Taste gedrückt ist dann
    Zaehler = Zahler +1 ansonsten Zaehler = 0
    wenn Zaehler = 20 dann Aktion ausführen

    Das Programm prüft also ob die Taste gedrückt ist
    wenn ja, wird ein Zaehler hochgezählt,
    wenn nicht, dann wird der Zaehler auf 0 gesetzt.
    Wenn der Zaehlerstand einen bestimmten Wert erreicht, dann soll etwas ausgelöst werden,
    aber nur einmal. Zum Beispiel das Senden
    Wenn die Taste weiter gedrückt gehalten wird, zaehlt der Zaehler immer weiter hoch,
    aber es wird nichts mehr ausgeführt.

    Jetzt kommt das Problem: diese kleinen Prozessoren sind "sau schnell"
    der Zaehler wird vermutlich hundertausende Male hochzählen bis Du die Taste
    wieder losgelassen hast. Das wäre kein Problem, dann muss man halt der Abfragewert entsprechend hoch setzen, das ist aber eine schlechte Lösung.

    Eleganter machen wir das jetzt so.

    Wir packen in unsere Hauptschliefe eine Verzögerung von z.B "einer" Millisekunde
    Nun wissen wir, das der Zaehler maximal jede Millisekunde hochlaufen kann.
    Somit haben wir eine recht präzisen Wert für die Abfrage.
    Das Prellen einer Taste, wo der Schaltkontakt grade schließt dauert so 20ms (bei schlechten Tasten)
    Also ist unser Abfragewert mit 20 recht gut gewählt.
    Wir müssen nun mindestens die Taste 20ms gedrückt halten, bis etwas ausgelöst wird.

    Im Code würde das nun so aussehen.
    Code:
    int button_1;
    int button_2;
    int zaehler_b1;
    int zaehler_b2;
    int status;
    
    void loop(void)
    {
    
      status = digitalRead(button_1);
      if (status == 0)    // wenn Taste gedrückt ist (pin ist low)
      {
        zaehler_b1++;           // eins hochzaehlen
        if (zaehler_b1 == 20)   // wurde die Taste mindestens 20ms gedrückt dann
        {
          // senden
        }
      } else zaehler_b1 = 0;    // Taste wurde losgelassen, also zaehler auf 0 setzen
    
      status = digitalRead(button_2);
      if (status == 0)    // wenn Taste gedrückt ist (pin ist low)
      {
        zaehler_b2++;
        if (zaehler_b2 == 20)   // wurde die Taste mindestens 20ms gedrückt dann
        {
          // senden
        }
      } else zaehler_b2 = 0;    // Taste wurde losgelassen, also zaehler auf 0 setzen
    
      delay(1);    // nur 1 Millisekunde warten
    
    }
    Geändert von Siro (29.03.2018 um 21:46 Uhr)

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    25.03.2018
    Beiträge
    9
    Vielen Dank.

    Hat perfekt gepasst!

    Im ganzen sieht es jetzt so aus.

    Code:
    #include <RCSwitch.h>
    
    int led = 5;       // LED pin (D1)
    int button_1 = 16; // Push Button 1 ist an Pin (D0)
    int button_2 = 13; // Push Button 2 ist an Pin (D7)
    int zaehler_b1;
    int zaehler_b2;
    int status;
    
    RCSwitch mySwitch = RCSwitch();
    
    void setup() {
      Serial.begin(9600);
      pinMode(led, OUTPUT);   // LED als Ausgang deklarieren
      pinMode(button_1, INPUT); // Button 1 als Eingangssignal deklarieren
      pinMode(button_2, INPUT); // Button 2 als Eingangssignal deklarieren
      mySwitch.enableTransmit(0); //Daten PIN D3 für das Sender Modul
      // Optional Protokol (Standart ist 1)
      mySwitch.setProtocol(1);
    
      // Optional - Impulslänge festlegen.
      mySwitch.setPulseLength(759);
    }
    
    void loop(void)
    {
    
      status = digitalRead(button_1);
      if (status == 0)          // wenn Taste gedrückt ist (pin ist low)
      {
        zaehler_b1++;           // eins hochzaehlen
        if (zaehler_b1 == 20)   // wurde die Taste mindestens 20ms gedrückt dann
        {
            /*Status LED geht an*/
            digitalWrite(led, HIGH);
            /* Binärcode für die Klingel wird gesendet(433MHZ) */
            mySwitch.send("000000000");
            Serial.println("Signal 1 wurde gesendet");
            /*Status LED geht wieder aus*/
            digitalWrite(led, LOW);
        }
      } else zaehler_b1 = 0;    // Taste wurde losgelassen, also zaehler auf 0 setzen
    
      status = digitalRead(button_2);
      if (status == 0)    // wenn Taste gedrückt ist (pin ist low)
      {
        zaehler_b2++;
        if (zaehler_b2 == 20)   // wurde die Taste mindestens 20ms gedrückt dann
        {
            /*Status LED geht an*/
            digitalWrite(led, HIGH);
            /* Binärcode für die Klingel (433MHZ) */
            mySwitch.send("000000000");
            Serial.println("Signal 2 wurde gesendet");
            /*Status LED geht wieder aus*/
            digitalWrite(led, LOW);
        }
      } else zaehler_b2 = 0;    // Taste wurde losgelassen, also zaehler auf 0 setzen
    
      delay(1);    // nur 1 Millisekunde warten
    
    }
    Gruß, littlekenny

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    25.03.2018
    Beiträge
    9
    Hallo zusammen,

    habe hier doch noch ein kleines Problem....

    Wenn der Button zu lang gedrückt wird, durchläuft es die gesamte Schleife und sendet beide Signale gleichzeit, obwohl der Button 2 nicht gerückt wird!?

    Hier nochmal der Code:
    Code:
    #include <RCSwitch.h>
    
    int led = 5;       // LED pin (D1)
    int button_1 = 15; // Push Button 1 ist an Pin (D8)
    int button_2 = 13; // Push Button 2 ist an Pin (D7)
    int zaehler_b1;
    int zaehler_b2;
    int status;
    
    RCSwitch mySwitch = RCSwitch();
    
    void setup() {
      Serial.begin(9600);
      pinMode(led, OUTPUT);   // LED als Ausgang deklarieren
      pinMode(button_1, INPUT); // Button 1 als Eingangssignal deklarieren
      pinMode(button_2, INPUT); // Button 2 als Eingangssignal deklarieren
      mySwitch.enableTransmit(0); //Daten PIN D3 für das Sender Modul
      // Optional Protokol (Standart ist 1)
      mySwitch.setProtocol(1);
    
      // Optional - Impulslänge festlegen.
      mySwitch.setPulseLength(759);
    }
    
    void loop(void)
    {
    
      status = digitalRead(button_1);
      if (status == 0)          // wenn Taste gedrückt ist (pin ist low)
      {
        zaehler_b1++;           // eins hochzaehlen
        if (zaehler_b1 == 20)   // wurde die Taste mindestens 20ms gedrückt dann
        {
            /*Status LED geht an*/
            digitalWrite(led, HIGH);
            /* Binärcode für die Klingel wird gesendet(433MHZ) */
            mySwitch.send("000000000");
            Serial.println("Signal 1 wurde gesendet");
            /*Status LED geht wieder aus*/
            digitalWrite(led, LOW);
        }
      } else zaehler_b1 = 0;    // Taste wurde losgelassen, also zaehler auf 0 setzen
    
      status = digitalRead(button_2);
      if (status == 0)    // wenn Taste gedrückt ist (pin ist low)
      {
        zaehler_b2++;
        if (zaehler_b2 == 20)   // wurde die Taste mindestens 20ms gedrückt dann
        {
            /*Status LED geht an*/
            digitalWrite(led, HIGH);
            /* Binärcode für die Klingel (433MHZ) */
            mySwitch.send("000000000");
            Serial.println("Signal 2 wurde gesendet");
            /*Status LED geht wieder aus*/
            digitalWrite(led, LOW);
        }
      } else zaehler_b2 = 0;    // Taste wurde losgelassen, also zaehler auf 0 setzen
    
      delay(1);    // nur 1 Millisekunde warten
    
    }
    Vielen Dank für eure Hilfe

Ähnliche Themen

  1. Ein Teil zum Einrasten - Wie bei einem Schrank
    Von Dj EKI im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 4
    Letzter Beitrag: 08.02.2018, 13:28
  2. Manchester Code von einem PIN dekodieren / HMS100T
    Von frank-wob im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 04.10.2012, 17:39
  3. Hilfe bei Code
    Von AndreasMüler im Forum Software, Algorithmen und KI
    Antworten: 4
    Letzter Beitrag: 29.06.2010, 12:22
  4. Hilfe bei Programmierung von einem Menü mit einem 3310 Disp.
    Von sc00p im Forum Software, Algorithmen und KI
    Antworten: 0
    Letzter Beitrag: 19.06.2008, 15:29
  5. Brauche Hilfe bei ASM-Code
    Von sebastianh im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 3
    Letzter Beitrag: 14.03.2005, 21:33

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test