-->
Page 1 of 2

Programming help NodeMCU ESP8266

PostPosted: Sun Jan 26, 2020 10:03 am
by sparviero79
Hello everyone!
I would like to carry out a project with my NodeMCU ESP8266 with 4 relays and 4 verification LEDs, in the sense of programming the ESP with Adafruit's MQTT protocol to control 4 relays and also associated with a status LED. Compiled everything and loaded in the esp does not go
I put below the code I used:

Code: Select all/*
Questo script è stato creato da Francesco Lombardo
e serve per poter comandare 4 Relè grazie al NodeMCU 1.0 (ESP8266 ESP-12E) e AdaFruit.io
che è un server MQTT OnLine al quale ci si può registrare
andando all'indirizzo: https://io.adafruit.com/
I pin utilizzati per attivare i relè sono i numeri 5,4,0,2 che corrispondono
sulla scheda a D1,D2,D3,D4 ed inoltre sono stati associato anche dei pin per
attivare dei led per verificarne lo stato di attivazione dei relè, ed i pin
utilizzati per i LED sono: 14,12,13,15 che corrispondono sull scheda a D5,D6,D7,D8.
Ho anche associato il servizio AdaFruit a IFTTT e GoogleAssistant per poter comandare
i Relè ache a distanza usando la voce
*/


#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
#define RELE_1 05   //Numero del 1^ pin di attivazione che comanda il relè 1
#define RELE_2 04   //Numero del 1^ pin di attivazione che comanda il relè 2
#define RELE_3 00   //Numero del 1^ pin di attivazione che comanda il relè 3
#define RELE_4 02   //Numero del 1^ pin di attivazione che comanda il relè 4
#define PIN_LED1 14 //Numero di pin del LED di identificazione attivazione del 1^ rele
#define PIN_LED2 12 //Numero di pin del LED di identificazione attivazione del 2^ rele
#define PIN_LED3 13 //Numero di pin del LED di identificazione attivazione del 3^ rele
#define PIN_LED4 15 //Numero di pin del LED di identificazione attivazione del 4^ rele
#define WLAN_SSID       "NOME WIFI" //Nome del WiFi
#define WLAN_PASS       "PASSWORD WIFI" //La password della connessione wifi
#define AIO_SERVER      "io.adafruit.com" //Indirizzo del server MQTT
#define AIO_SERVERPORT  1883 //per il protocollo SSL usare la porta 8883
#define AIO_USERNAME    "NOME UTENTE" //Username creato su Adafruit
#define AIO_KEY         "PRIVATE KEY DI ADAFRUIT" //IO_key creata su Adafruit


WiFiClient client;

Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
Adafruit_MQTT_Subscribe Rele_1Feed = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/RELE_1");  //"RELE_1" è il nome del feed creato sul sito adafruit
Adafruit_MQTT_Subscribe Rele_2Feed = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/RELE_2");  //"RELE_2" è il nome del feed creato sul sito adafruit
Adafruit_MQTT_Subscribe Rele_3Feed = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/RELE_3");  //"RELE_3" è il nome del feed creato sul sito adafruit
Adafruit_MQTT_Subscribe Rele_4Feed = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/RELE_4");  //"RELE_4" è il nome del feed creato sul sito adafruit

void MQTT_connect();

void setup() {
  Serial.begin(115200);
  delay(10);

  pinMode(RELE_1, OUTPUT);
  pinMode(RELE_2, OUTPUT);
  pinMode(RELE_3, OUTPUT);
  pinMode(RELE_4, OUTPUT);
  pinMode(PIN_LED1, OUTPUT);
  pinMode(PIN_LED2, OUTPUT);
  pinMode(PIN_LED3, OUTPUT);
  pinMode(PIN_LED4, OUTPUT);
  digitalWrite(RELE_1, LOW);
  digitalWrite(RELE_2, LOW);
  digitalWrite(RELE_3, LOW);
  digitalWrite(RELE_4, LOW);
  digitalWrite(PIN_LED1, LOW);
  digitalWrite(PIN_LED2, LOW);
  digitalWrite(PIN_LED3, LOW);
  digitalWrite(PIN_LED4, LOW);

  Serial.println(); Serial.println();
  Serial.print("Connessione alla rete Wi-FI ");
  Serial.println(WLAN_SSID);

  WiFi.begin(WLAN_SSID, WLAN_PASS); 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print("*");
  }
  Serial.println();

  Serial.println("Wi-FI Connesso!");
  Serial.println("IP del modulo ESP8266 : ");
  Serial.println(WiFi.localIP());


  mqtt.subscribe(&Rele_1Feed);
  mqtt.subscribe(&Rele_2Feed);
  mqtt.subscribe(&Rele_3Feed);
  mqtt.subscribe(&Rele_4Feed);
}

uint32_t x=0;

void loop() {

  MQTT_connect();

  Adafruit_MQTT_Subscribe *subscription;
 
  while ((subscription = mqtt.readSubscription(5000))) {
   
    if (subscription == &Rele_1Feed)
    if (subscription == &Rele_2Feed)
    if (subscription == &Rele_3Feed)
    if (subscription == &Rele_4Feed) {
     
      Serial.print(F("Dati ricevuti : "));
      Serial.println((char *)Rele_1Feed.lastread);
      Serial.println((char *)Rele_2Feed.lastread);
      Serial.println((char *)Rele_3Feed.lastread);
      Serial.println((char *)Rele_4Feed.lastread);
      digitalWrite(RELE_1, (int)Rele_1Feed.lastread);
      digitalWrite(RELE_2, (int)Rele_2Feed.lastread);
      digitalWrite(RELE_3, (int)Rele_3Feed.lastread);
      digitalWrite(RELE_4, (int)Rele_4Feed.lastread);

      if(!strcmp((char *)Rele_1Feed.lastread, "RELE1_ON")) Attiva_rele_1();
      if(!strcmp((char *)Rele_1Feed.lastread, "RELE1_OFF")) Disattiva_rele_1();
      if(!strcmp((char *)Rele_2Feed.lastread, "RELE2_ON")) Attiva_rele_2();
      if(!strcmp((char *)Rele_2Feed.lastread, "RELE2_OFF")) Disattiva_rele_2();
      if(!strcmp((char *)Rele_3Feed.lastread, "RELE3_ON")) Attiva_rele_3();
      if(!strcmp((char *)Rele_3Feed.lastread, "RELE3_OFF")) Disattiva_rele_3();
      if(!strcmp((char *)Rele_4Feed.lastread, "RELE4_ON")) Attiva_rele_4();
      if(!strcmp((char *)Rele_4Feed.lastread, "RELE4_OFF")) Disattiva_rele_4();
     
    }
   
  }

  if(! mqtt.ping()) {
    mqtt.disconnect();
  }
}

void Attiva_rele_1() {
  digitalWrite(RELE_1, HIGH);
  digitalWrite(PIN_LED1, HIGH);
}
void Attiva_rele_2() {
  digitalWrite(RELE_2, HIGH);
  digitalWrite(PIN_LED2, HIGH);
}
void Attiva_rele_3() {
  digitalWrite(RELE_3, HIGH);
  digitalWrite(PIN_LED3, HIGH);
}
void Attiva_rele_4() {
  digitalWrite(RELE_4, HIGH);
  digitalWrite(PIN_LED4, HIGH);
}

void Disattiva_rele_1() {
  digitalWrite(RELE_1, LOW);
  digitalWrite(PIN_LED1, LOW);
}
void Disattiva_rele_2() {
  digitalWrite(RELE_2, LOW);
  digitalWrite(PIN_LED2, LOW);
}
void Disattiva_rele_3() {
  digitalWrite(RELE_3, LOW);
  digitalWrite(PIN_LED3, LOW);
}
void Disattiva_rele_4() {
  digitalWrite(RELE_4, LOW);
  digitalWrite(PIN_LED4, LOW);
}

void MQTT_connect() {
  int8_t ret;

  if (mqtt.connected()) {
    return;
  }

  Serial.print("Connessione al server MQTT... ");

  uint8_t retries = 3;
  while ((ret = mqtt.connect()) != 0) {
       Serial.println(mqtt.connectErrorString(ret));
       Serial.println("Tentativo di connessione tra 5 secondi...");
       mqtt.disconnect();
       delay(5000); 
       retries--;
       if (retries == 0) {
         while (1);
       }
  }
  Serial.println("MQTT connesso!");
}


I hope you can help me
I also attach the photo of the project:

Image

Re: Programming help NodeMCU ESP8266

PostPosted: Mon Jan 27, 2020 2:34 pm
by Bonzo
Assuming you have had the Nodemcu working at some point; I would start with something simple and get one relay working. You can then expand the code and hardware to the four relays.

Re: Programming help NodeMCU ESP8266

PostPosted: Wed Jan 29, 2020 4:06 am
by QuickFix
...it looks like you're trying to power the 4 relay PCB's / modules from the NodeMCU, which is a terrible idea.
The (JQC3F) relays themselves draw around 120mA each when active and together with the current the NodeMCU will draw, this might be too much for the AMS1117 which can only supply around 800mA. :idea:

Re: Programming help NodeMCU ESP8266

PostPosted: Wed Jan 29, 2020 6:13 am
by sparviero79
Yes, in fact, I immediately took a step back. I have powered the relays separately and the NodeMCU with USB. I have corrected the code and now it is ok