Jump to content
  • Sign Up
Støtt hjemmeautomasjon.no!
  • Fermate
    Fermate

    ESP32/MQTT Relé styring

    Her er kode for å styre et relé

    (Det er jo ikke store koden som skal til for å skru en pinne av og på men jeg tar den med alikevel)
     

    Sitat
    // Relays
    #define relay1Pin          GPIO_NUM_26
     
    // *********************************************************************
    void setup() {
     
       // Relays
      pinMode(relay1Pin,OUTPUT);
     
    }
     
    // *********************************************************************
    void loop() {
       digitalWrite(relay2Pin, LOW); // Turn off
       digitalWrite(relay2Pin, HIGH); // Turn on
      }
     

     

    Litt om reléer
    Når en bruker et relé er det enten for å styre en stor strøm med en liten strøm eller en høy spenning med en lav spenning (eller begge deler).

    Prisippet er at en eller flere fysiske kontakter er koblet mekanisk til en spole slik at når spolen får strøm lukkes (eller åpnes) kontaktene.
     

    Jeg er vant til at reléer tegnes omtrent slik:

    image.png

    Her er 1 og 6 spolen. Kontakt 7 er normalt koblet til 3 når reléet ikke er aktivert og kobles til kontakt 2 når spolen får strøm.

    Vi sier at kontakt 3 er "Normally Closed" (og er oftemerket NC) og kontakt 2 er "Normally Open" (merket NO).
    Nr 7 kan være merket COM.
    Reléet kan ha flere par kontakter slik som 4,5 og 8 og som veksler samtidig med de andre.

     

    Poenget er at det er en fysisk (elektrisk) avstand mellom spolen og kontaktene slik at spolen kan ha en lav spenning mens kontaktene kan styre en høy strøm/spenning.

     

    Hvor høy spenning (Volt) kontaktene tåler sier noe om hvor godt isolert de er, og hvor mye strøm (Ampere) de tåler sier hva de tåler før kontaktene brenner av. Sørg for at reléet du velger tåler minst den spenningen og strømmen du trenger.

     

    Spolen er oftest anngitt med hvilken spening den må ha for å aktiveres.

    Helst skulle vi visst hvor mye strøm den trakk (eller hvilken motstand den hadde) men det er ikke alltid tilgjengelig.


    En diode i parallell

    Når du endrer spenningen i en spole genererer den en spenning motsatt vei. Denne spenningen vil kunne ødelegge elektronikk som er tilkoblet så derfor kobler en ofte en diode "motsatt vei" over spolen. Denne dioden "kortslutter" denne strømmen fra spolen og skal altså kobles slik at "pilen" på dioden (vanligvis merket med en ring fysisk) peker mot pluss-delen av spolen.

     

    image.png image.png

     


    Spolestrøm

    Har vi et relé som trekker mindre enn de 20mA som en pinne på ESP32en tåler vil vi kunne koble den rett på mikriprosessoren, men i de fleste tilfeller trekker spolen mer enn dette og krever mer enn 3.3V så da må vi inn med en transistor.
    Dette gir også muligheten for at reléet kan drives fra en høyere spenning som 5V eller kanskje 12V.

    image.png

     

    Nesten hvilken som helst NPN transistor kan brukes. Google litt rundt (eller spør ChatGPT) for å finne en passende verdi på R1.

     

    Ferdige Relé moduler

    Det er mye enklere å kjøpe en ferdig relémodul. Denne har både Diode og transistor på kretskortet og noen ganger også en optokobler.

     

    Om du kjøper en modul som skal ha 3.3V er jo alt greit men om du kun får tak i en på 5V kan du bruke den også om du allerede har 5V som du mater ESP32en med. Dersom modulen har en strap der du kan velge om den skal få strøm fra mikroprosessoren eller eksternt er det flott. Da bare fjerner du strappen og kobler 5V til JDVCC, IN1 til GND på ESP32en og VCC til GPIO pinnen.
    (Eller 5V til JDVCC, IN1 til GPIO pinnen og VCC til 3.3V på ESP32en)

     

    image.png

     

    Er relé modulen 12V eller 24V og du har disse spenningene av andre grunner i prosjektet ditt kobler du på samme måte.

     

    Jeg hadde noen billige moduler fra Aliexpress som dessverre ikke hadde denne strappen og jeg måtte inn med en transistor for å drive dem. Du finner beregningene i "garasjeport prosjektet" mitt her på forumet:


    image.png
     

    Det er jo ikke store koden som skal til for å skru en pinne av og på med MQTT men jeg tar den med alikevel:

     

    Sitat
    #include <EspMQTTClient.h>
     
    #define ONBOARD_LED  2 // Onboard LED
     
    // Relays
    #define relay1Pin          GPIO_NUM_26
    #define relay2Pin          GPIO_NUM_33
     
    //MQTT
    EspMQTTClient MQTTclient(
      "ThePromisedLAN", // SSID
      "Hallelujah!", // WiFi Password
      "192.168.1.2",  // MQTT Broker server ip
      "",   // MQTTUsername Can be omitted if not needed
      "",   // MQTTPassword Can be omitted if not needed
      "relayClient",     // Client name that uniquely identify your device
      1883              // The MQTT port, default to 1883. this line can be omitted
    );
     
    // *********************************************************************
    void setup() {
       Serial.begin(115200);
     
      // Set pin mode for test LED
      pinMode(ONBOARD_LED ,OUTPUT);
      digitalWrite(ONBOARD_LED ,HIGH);
     
      MQTTclient.setKeepAlive(60);
      MQTTclient.enableOTA("pwd");
     
      // Relays
      pinMode(relay1Pin,OUTPUT);
      pinMode(relay2Pin,OUTPUT);
     
      digitalWrite(relay1Pin,LOW); // Turn off
      digitalWrite(relay2Pin,LOW); // Turn off
    }
     
    // *********************************************************************
    void loop() {
        MQTTclient.loop();
     
        // Onboard LED Status
        if (MQTTclient.isMqttConnected()) {
         digitalWrite(ONBOARD_LED ,LOW);
        } else {
         digitalWrite(ONBOARD_LED ,HIGH);
        }
      }
     
    // ********************** SUBS ***********************************************
    void onConnectionEstablished()
     {
     Serial.println("onConnectionEstablished");
     MQTTclient.publish("relayClient/status", "started"); // You can activate the retain flag by setting the third parameter to true
     
      MQTTclient.subscribe("relayClient/ActivateRelay1", [](const String & payload) {
        Serial.println("relay1 ON");
       digitalWrite(relay1Pin, HIGH);  
      });
     
      MQTTclient.subscribe("relayClient/DeactivateRelay1", [](const String & payload) {
        Serial.println("relay1 OFF");
        digitalWrite(relay1Pin, LOW);
      });
     
      MQTTclient.subscribe("relayClient/Relay2", [](const String & payload) {
       Serial.print("Relay2 Command: ");
       Serial.println(payload);
       if (payload.toInt()==0) {
          digitalWrite(relay2Pin, LOW); // Turn off
        } else {
         digitalWrite(relay2Pin, HIGH); // Turn on
        }
      });
     
     
      }

     

    Disclaimer:
    Om du skal styre 230V med reléet ditt må du huske at du må være elektriker for å koble 230V.
    Hvis ikke kan huset ditt brenne ned og du får ingen ting fra forsikringsselskapet.
    Hjemmeautomasjon.no skal ikke ha noe ansvar for slike ting.

    User Feedback

    Recommended Comments

    There are no comments to display.



    Join the conversation

    You can post now and register later. If you have an account, sign in now to post with your account.

    Guest
    Add a comment...

    ×   Pasted as rich text.   Paste as plain text instead

      Only 75 emoji are allowed.

    ×   Your link has been automatically embedded.   Display as a link instead

    ×   Your previous content has been restored.   Clear editor

    ×   You cannot paste images directly. Upload or insert images from URL.




×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.