Go Down

Topic: Modulo Wi-Fi ESP8266 (Read 544643 times) previous topic - next topic

acuplush

#2805
Feb 03, 2019, 05:28 pm Last Edit: Feb 03, 2019, 06:52 pm by acuplush
sto facendo delle prove caricando un mio programma che si collega ad adafruit, ma guardando il seriale mi succedono delle cose strane, voi sapete aiutarmi?

codice:

Code: [Select]
#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
//#include <RCSwitch.h> //libreria rf433

//#define pulsal 5 //pulsante salita
//#define puldis 3 //pulsante discesa
#define intervallo 120000  //tempo tra 2 letture di segnale wifi in millisecondi (MODIFICABILE A PIACIMENTO)
char* ricevuto = "" ;
int comando;
int segnale;
int programmazione; //cifra usata per programmazione
char statoriposo = 100; //cifra che non corrisponde a nessun caso per fermare i cicli
int tempomov = 22000; //durata movimento tapparelle
int tempomezzomov = 13000; //durata movimento tapparelle
int tempoprog = 1000; //durata pressione in programmazione
unsigned long iniziomov;
int flags = 0;
int flagd = 0;
unsigned long tempinterval; //intervallo tra 2 letture di segnale wifi
String controllo;

//RCSwitch mySwitch = RCSwitch();



/************************* WiFi Access Point *********************************/

#define WLAN_SSID       "*******"
#define WLAN_PASS       "**************"

/************************* Adafruit.io Setup *********************************/

#define AIO_SERVER      "io.adafruit.com"
#define AIO_SERVERPORT  1883                   // use 8883 for SSL
#define AIO_USERNAME    "************"
#define AIO_KEY         "**************"

/************ Global State (you don't need to change this!) ******************/

// Create an ESP8266 WiFiClient class to connect to the MQTT server.
WiFiClient client;

Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);

/****************************** Feeds ***************************************/
// impostazioni feed in ricezione o trasmissione
Adafruit_MQTT_Subscribe DomoticaCentrale = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/domotica_centrale");
Adafruit_MQTT_Publish StatoConnessione = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/stato-connessione");
Adafruit_MQTT_Publish SegnaleWifi = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/segnale-wifi");
/*************************** Sketch Code ************************************/


void MQTT_connect();

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);     // Initialize the LED_BUILTIN pin as an output
//  pinMode(pulsal, INPUT_PULLUP);
 // pinMode(puldis, INPUT_PULLUP);
 // mySwitch.enableTransmit(7); //trasmettitore collegato al pin 7
  Serial.begin(9600);
  delay(10);
  digitalWrite(LED_BUILTIN, LOW);
  WiFi.begin(WLAN_SSID, WLAN_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);

  }
  //  Serial.println("WiFi connected");
  // Serial.println("IP address: "); Serial.println(WiFi.localIP());

  // Setup MQTT subscription for onoff feed.
  mqtt.subscribe(&DomoticaCentrale);
}

uint32_t x = 0;

void loop() {

  MQTT_connect();

  if (millis() > (tempinterval + intervallo)) { //lettura segnale ogni TOT millisecondi impostati nel setup
    long rssi = WiFi.RSSI();
    segnale = int (rssi);
    // Serial.print (segnale);
    SegnaleWifi.publish(segnale);
    tempinterval = millis();
  }

  //-----------------------------

 

  //------------------------------------------------

  Adafruit_MQTT_Subscribe *subscription;
  while ((subscription = mqtt.readSubscription(5000))) {
    if (subscription == &DomoticaCentrale) {
      ricevuto = ((char*)DomoticaCentrale.lastread);
      controllo = String(ricevuto);
      if (    ('#' == controllo[0])
              && ('@' == controllo[4])
              && (controllo[1] == controllo[2])
              && (controllo[2] == controllo[3])  )
      {
        comando = int (controllo[1]);
        Serial.println ("ricevuto ");
        Serial.print (ricevuto);
        Serial.println ("controllo ");
        Serial.print (controllo);
        Serial.println ("comando ");
        Serial.print (comando);
       
        //Serial.print(inviato);
      }
    }
  }

  //------------------------------------------------

  switch (comando) {


     

   

    case 3: //chiusura cucina
      digitalWrite(LED_BUILTIN, HIGH);   // Turn the LED on (Note that LOW is the voltage level
      delay(500);                      // Wait for a second
      digitalWrite(LED_BUILTIN, LOW);  // Turn the LED off by making the voltage HIGH
      delay(500);
     
      comando = statoriposo;
      break;

    case 4: //apertura cucina
      digitalWrite(LED_BUILTIN, HIGH);   // Turn the LED on (Note that LOW is the voltage level
      delay(500);                      // Wait for a second
      digitalWrite(LED_BUILTIN, LOW);  // Turn the LED off by making the voltage HIGH
      delay(500);
     
      comando = statoriposo;
      break;

   

    case 19: //accensione/spegnimento led cucina
      digitalWrite(LED_BUILTIN, HIGH);   // Turn the LED on (Note that LOW is the voltage level
      delay(500);                      // Wait for a second
      digitalWrite(LED_BUILTIN, LOW);  // Turn the LED off by making the voltage HIGH
      delay(500);
     
      break;

 
  }

  //------------------------------------------------



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

// Function to connect and reconnect as necessary to the MQTT server.
// Should be called in the loop function and it will take care if connecting.
void MQTT_connect() {
  int8_t ret;

  // Stop if already connected.
  if (mqtt.connected()) {
    return;
  }

  // Serial.print("Connecting to MQTT... ");

  uint8_t retries = 3;
  while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
    // Serial.println(mqtt.connectErrorString(ret));
    //Serial.println("Retrying MQTT connection in 5 seconds...");
    mqtt.disconnect();
    delay(5000);  // wait 5 seconds
    retries--;
    if (retries == 0) {
      // basically die and wait for WDT to reset me
      while (1);
    }
  }
  StatoConnessione.publish("Domotica Connessa");

}





errore su seriale:

Code: [Select]

Soft WDT reset

ctx: cont
sp: 3ffffd70 end: 3fffffd0 offset: 01b0

>>>stack>>>
3fffff20:  00000009 3fff0194 00000000 4020c743 
3fffff30:  40104d40 00c9d7d8 3ffeed54 00000000 
3fffff40:  3ffee550 3ffeed54 3ffe85e8 3ffeed54 
3fffff50:  3fffdad0 3ffeef34 40204c8c 3fffefb0 
3fffff60:  402015a2 00001388 00001388 40201597 
3fffff70:  3fffdad0 3ffeebc8 00000000 4020289a 
3fffff80:  4022de57 00000000 3ffeef2d 4020290a 
3fffff90:  3ffef52c 40202ee0 000001f4 40201597 
3fffffa0:  3fffdad0 00000000 3ffeecf4 3ffeef34 
3fffffb0:  3fffdad0 00000000 3ffeef2d 40204d18 
3fffffc0:  feefeffe feefeffe 3ffe85e8 40100739 
<<<stack<<<
?)⸮H!⸮⸮

zoomx

L'ESP8266 ha un solo core che si occupa anche del WiFi.
Quello che ti succede è che il codice nel loop da qualche parte ci mette troppo tempo e il chip va in reset a causa del Watchdog.

Oppure perché sei in questo pezzo di codice


Code: [Select]
    if (retries == 0) {
      // basically die and wait for WDT to reset me
      while (1);
    }

che, appunto, fa intervenire il Watchdog


acuplush

L'ESP8266 ha un solo core che si occupa anche del WiFi.
Quello che ti succede è che il codice nel loop da qualche parte ci mette troppo tempo e il chip va in reset a causa del Watchdog.

Oppure perché sei in questo pezzo di codice


Code: [Select]
    if (retries == 0) {
      // basically die and wait for WDT to reset me
      while (1);
    }

che, appunto, fa intervenire il Watchdog


grazie, ho confrontato il mio codice con quello esempio della libreria ed ho scoperto di aver spostato una parte del "codice base" in un altro punto, forse è quello il problema perchè ora non mi da più quell'errore.
in ogni modo ho deciso di riscriverlo da capo perchè stavo facendo delle modifiche ma mi sa che l'ho solo incasinato.

una domanda sola prima di cominciare:
ora non andrò più ad utilizzare la seriale e mi servono 2 pin per dei pulsanti (che vorrei mettere in input_pullup) e un pin in OUT per trasmettere tramite modulo RF.
per evitare di fare danni, l'OUT per RF è meglio se lo metto nel pin rx del seriale (lo dichiaro come 3?)?
così se metto  l'esp nel convertitore per fare delle prove ho il tx libero da configurazione e posso usarlo con la seriale, giusto?
e gpo0 e gpo2 (quindi dichiarati 0 e 2) in input_pullup mi potrebbero creare problemi in un avvio standard o avvio in programmazione?

chiedo per sicurezza prima di fulminare qualcosa.

grazie :)


zoomx

Se usi i livelli giusti non ci sono problemi. C'è un'istruzione apposta per usare il solo pin TX e avere l'RX libero per altri usi, vedi qui
http://esp8266.github.io/Arduino/versions/2.3.0/doc/reference.html

acuplush

Se usi i livelli giusti non ci sono problemi. C'è un'istruzione apposta per usare il solo pin TX e avere l'RX libero per altri usi, vedi qui
http://esp8266.github.io/Arduino/versions/2.3.0/doc/reference.html
Leggendo il tuo link ho visto che è già integrata una serial1 su gpio2. (tanto a me basta TX)
Quindi se io disattivo serial e attivo serial1 per inviare i miei comandi ad Arduino, questa seriale viene "sporcata" anche da cose tipo l'errore del post precedente o è solo per quello che decido di mandare io?
Grazie

steve-cr

Secondo me dovresti lasciare liberi quei pin. Piuttosto usa l'ingresso analogico dove puoi connettere diversi pulsanti (anche più di 5) con diverse resistenze e da li sapere che pulsante è stato premuto...
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

acuplush

Secondo me dovresti lasciare liberi quei pin. Piuttosto usa l'ingresso analogico dove puoi connettere diversi pulsanti (anche più di 5) con diverse resistenze e da li sapere che pulsante è stato premuto...
Che pin lasciare liberi? Quelli del seriale?
Le mie opzioni sono 2:

Come dici tu usare gpo2 con le 2 resistenze per i pulsanti e gpo0 per il modulo rf

O continuare come sono ora che l'esp pensa solo ad inviare i comandi del broker via seriale ad Arduino (il quale fà tutto il resto).
Per quello chiedo se serial1 è un canale completamente libero per me o si possono infirtrare anche le librerie con i loro messaggi

La seconda opzione mi sarebbe più semplice perché non dovrei stravolgere l'impianto

zoomx

@steve-cr
Ha un modulo ESP01, per titrare fuori l'ingresso analogico serve una saldatura direttamente sul piedino piccino del chip.

@acuplush
non so se l'altra uscita è utilizzabile senza avere in mezzo i messaggi di debug. Fai prima con uno sketch di prova.

terribiledavide

Ciao, ho acquistato questo modulo Wi-Fi (modello ESP-01) che vorrei utilizzare per leggere dei dati in un file prelevato online, registrando le informazioni numeriche presenti in variabili numeriche da trattare in seguito.

Sono fermo ai collegamenti, leggendo in giro sembra che vada a 3.3V, e ho acquistato anche un convertitore logico bidirezionale che dovrebbe risolvere il problema (?), questo:


Ho poi resistenze 10k, breadboard, tanti fili (f/f, m/f, m/m) e arduino UNO.

Mi è possibile con questi provare ad utilizzare il modulo prima di procedere a saldature? E sopratutto, in che modo devo collegare il tutto? Ogni guida che trovo utilizza diversi componenti, si concentrano su aggiornamento firmware o altro, e gli schemi sono sempre diversi.

Grazie per qualsiasi indicazione!
ciao, scusate se mi intrometto nel discorso.

sto cercando di interfacciare un esp12F con un modulo WINGONEER 5PCS 5V MAX485 / RS485 modulo TTL a RS-485 MCU Development Board  e tra i due componenti ho inserito un shift level come quello postato in questa discussione.

purtroppo non riesco a leggere i dati dal modulo ma non saprei che verifiche fare per capire dove sbaglio.

In più questo modulo necessita anche di un ulteriore pin DE/RE, che io ho fatto transitare sul secondo canale del shif level tra i pin TX1-->TX0


allego un schema percheè magari cosi è un pò incasinato come discorso



zoomx

Io prima farei qualche test con un convertitore USB-seriale collegato al modulo TTL-485

testato

Sul discorso medsaggi di boot sulla seriale, nom di possono disabilitare, porto puoi switchare la seriale verso altri pin, e in questo modo non avrsi i messaggi al boot
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

steve-cr

@steve-cr
Ha un modulo ESP01, per titrare fuori l'ingresso analogico serve una saldatura direttamente sul piedino piccino del chip.

Mooolto piccino!
Non avevo capito si trattasse di un ESP01. Scusa.
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

zoomx

Ma non c'è mica da scusarsi! Con tutte queste pagine ti era sfuggito, è facile che capiti!

La saldatura dovrebbe essere fattibile, io l'ho fatta per collegare il GPIO16 al reset in modo da utilizzare la modalità sleep su un ESP01. Non sono scarsissimo ma non ho neanche una grande esperienza, diciamo che forse sarei nella media.

MrAlar

Buongiorno, volevo inanzitutto ringraziarvi per il materiale e l'esperienze che riuscite a condividere, avrei dei quesiti da porvi riguardo le limitazioni di alcuni pin del nodemcu v2
Vista la mia scarsa esperienza... non riesco a comprendere la fattibilità del mio progetto, già preesistente sull'uno, ma che oggi mi trovo costretto a riportare su node.
Avrei quindi da inserire sul node: relè (4 pin), pulsanti momentanei (4pin), lcd+rtc (2pin), modulo bt (2pin).
Dalla vostra esperienza con il node, pensate che sia possibile connettere tutti i moduli? Magari scegliendo i pin più corretti alle loro funzioni ?
Vi ringrazio tantissimo!

gpb01

#2819
Feb 28, 2019, 11:38 am Last Edit: Feb 28, 2019, 11:38 am by gpb01
>MrAlar:  Buongiorno,  essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione tutto il su citato REGOLAMENTO ... Grazie. :)

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. ;)
Search is Your friend ... or I am Your enemy !

Go Up