Aiuto programmazione NodeMCU ESP8266

Ciao a tutti!
Vorrei realizzare un progetto con il mio NodeMCU ESP8266 con 4 relè e 4 led di verifica, nel senso programmare l’esp con il protocollo MQTT di Adafruit per comandare 4 relè e associato anche un LED di stato. Compilato il tutto e caricato nell’esp non va :confused:
Vi metto di seguito il codice che ho utilizzato:

/*
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!");
}

Spero mi possiate aiutare :smiley:

Vi allego anche la foto del progetto:

ciao :slight_smile:

dovresti specificare cos'è che non va di preciso, perchè detto così non possiamo esserti di aiuto in modo concreto.

PS: hai verificato cosa ti scrive sul monitor seriale? si connette alla tua rete wireless?

MD

MatteoDerrico:
ciao :slight_smile:

dovresti specificare cos'è che non va di preciso, perchè detto così non possiamo esserti di aiuto in modo concreto.

PS: hai verificato cosa ti scrive sul monitor seriale? si connette alla tua rete wireless?

MD

Hai ragione scusami, si sul monitor seriale scrive che si connette al wifi e mostra il suo indirizzo IP e si connette anche al server MQTT, ma dando i comandi direttamente dal sito di Adafruit secondo la configurazione, tipo: "Attiva_rele_1" non fa nulla, e così per tutti gli altri comandi. ed in più sull'ESP rimane acceso il LED blu che c'è a bordo

Ho risolto, errore mio nell’invio del codice MQTT ed inoltre ho riscritto il codice come segue

/*
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

    *** BUONA SPERIMENTAZIONE ;-) ***    
    _________________________________
*/


#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 del WiFi
#define WLAN_PASS       "..........." //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    "........." //Username creato su Adafruit
#define AIO_KEY         "..............." //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/RELE1Feed");  //"RELE1Feed" è il nome del feed creato sul sito adafruit
Adafruit_MQTT_Subscribe Rele_2Feed = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/RELE2Feed");  //"RELE2Feed" è il nome del feed creato sul sito adafruit
Adafruit_MQTT_Subscribe Rele_3Feed = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/RELE3Feed");  //"RELE3Feed" è il nome del feed creato sul sito adafruit
Adafruit_MQTT_Subscribe Rele_4Feed = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/RELE4Feed");  //"RELE4Feed" è 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("OTTIMO! Wi-FI Connesso!");
  Serial.println("L'indirizzo 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) {
      Serial.print(F("Dati ricevuti : "));
      Serial.println((char *)Rele_1Feed.lastread);
      digitalWrite(RELE_1, (int)Rele_1Feed.lastread);

      if(!strcmp((char *)Rele_1Feed.lastread, "RELE1_ON")) Attiva_rele_1();
      if(!strcmp((char *)Rele_1Feed.lastread, "RELE1_OFF")) Disattiva_rele_1();
    }
    if (subscription == &Rele_2Feed) {
      Serial.print(F("Dati ricevuti : "));
      Serial.println((char *)Rele_2Feed.lastread);
      digitalWrite(RELE_2, (int)Rele_2Feed.lastread);

      if(!strcmp((char *)Rele_2Feed.lastread, "RELE2_ON")) Attiva_rele_2();
      if(!strcmp((char *)Rele_2Feed.lastread, "RELE2_OFF")) Disattiva_rele_2();
    }
    if (subscription == &Rele_3Feed) {
      Serial.print(F("Dati ricevuti : "));
      Serial.println((char *)Rele_3Feed.lastread);
      digitalWrite(RELE_3, (int)Rele_3Feed.lastread);

      if(!strcmp((char *)Rele_3Feed.lastread, "RELE3_ON")) Attiva_rele_3();
      if(!strcmp((char *)Rele_3Feed.lastread, "RELE3_OFF")) Disattiva_rele_3();
    }
    if (subscription == &Rele_4Feed) {
      Serial.print(F("Dati ricevuti : "));      
      Serial.println((char *)Rele_4Feed.lastread);
      digitalWrite(RELE_4, (int)Rele_4Feed.lastread);

      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!");
}