logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ESP8266] Jak zapobiec wielokrotnemu wywołaniu kodu po naciśnięciu przycisku?

mienki 13 Lip 2018 15:53 1131 2
REKLAMA
  • #1 17327107
    mienki
    Poziom 10  
    Posty: 89
    Witam,


    Mam problem z przerwaniem na ESP8266.

    Chodzi o zrobienie układu podłączonego do WIFI oraz możliwie jak najszybciej (po naciśnięciu przycisku) wysyłającego komendę do serwera mqtt.

    Chcę, aby po naciśnięciu przycisku wykonał się kawałek kodu jeden raz.
    Tymczasem wykonuje się on kilka razy.
    Czy wystarczy, jeśli użyje INPUT_PULLUP oraz kondensator pomiędzy stykami switcha?
    Pin z ESP8266 podłączony switchem do GND i równolegle do styków switcha kondensator elektrolitowy.

    Dziękuję za pomoc.


    #include <ESP8266WiFi.h>
    #include <PubSubClient.h>
    
    const char* ssid = "XXX";
    const char* password = "XXX";
    
    const char* mqtt_server = "192.168.1.200";  //adres rpi na ktorym dziala mosquitto
    const char* mqttUser = "mosquitto";
    const char* mqttPassword = "mosquitto1";
    const int mqttPort = 1883;
    
    const int buttonPin = 2;
    volatile byte buttonState = LOW;
    
    unsigned long aktualnyCzas = 0; 
    
    WiFiClient espClient;
    PubSubClient client(espClient);
    
     
    void setup() {
    
      pinMode(buttonPin, INPUT);
      pinMode(buttonPin, INPUT_PULLUP);
      
      
      Serial.begin(115200);
      Serial.println("----");
      
      WiFi.begin( ssid, password );
      
        while (WiFi.status() != WL_CONNECTED) 
        {
           delay(1); 
        }    
        client.setServer(mqtt_server, mqttPort);
       
        while (!client.connected())
        { 
          if (client.connect("Przycisk2", mqttUser, mqttPassword )) 
          { 
              
          } 
          else 
          { 
          }
        } 
    
      attachInterrupt(digitalPinToInterrupt(buttonPin), sendmqtt, FALLING);  
    }
     
    void sendmqtt() {
      
    buttonState = 1;
    }
    
    
     
    void loop() {
      client.loop();
      if (buttonState == 1)
              {
              detachInterrupt(buttonPin);
              buttonState=0;
              client.publish("ha/switch1", "ON");
              aktualnyCzas = millis();
              Serial.println(aktualnyCzas);
              attachInterrupt(digitalPinToInterrupt(buttonPin), sendmqtt, FALLING);  
              }
      
    }
  • REKLAMA
  • #2 17328547
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1460
    Na marginesie: w większości systemów by mi się nie podobało odłączanie/dołączanie handlera przerwań w pętli. Jak ja rozumiem, ustawia się to podczas startu.
    BYĆ MOŻE algorym jednego cyklu tzreba by uwarunkować.

    Nie znam ESP8266
  • #3 17329329
    krzbor
    Poziom 29  
    Posty: 1735
    Pomógł: 40
    Ocena: 1046
    Równolegle do switcha należy dodać kondensator 100nF. Oczywiście podciąganie też powinno być.
REKLAMA