Go Down

Topic: NodeMCU ESP 8266 problemi con più dispositivi I2C (Read 1 time) previous topic - next topic

As_Needed

Aug 30, 2018, 01:21 am Last Edit: Aug 30, 2018, 06:07 am by As_Needed
Salve a tutti! Non scrivo nel forum da un po' di tempo :D E guarda caso ho cominciato a scrivere per via di un problema con la NodeMCU :D
Magari questo non è proprio esattamente il forum per chiedere cose riguardo alla NodeMCU, però volevo postare qui in caso qualcuno sapesse qualcosa a riguardo.
In pratica sto facendo una stazione meteo wifi, e praticamente per ora sto testando un RTC DS3231 e un BMP180. Il problema che riscontro è che singolarmente posso usare i due sensori senza problemi, ma quando li connetto in parallelo, ho problemi. Ho trovato online che poteva essere un problema di librerie, che c'è un Wire.begin, che non ci dovrebbe essere e bisogna chiamarlo solo una volta, ma sinceramente non mi funziona questa soluzione. Pure le pull up interne non risolvono il problema.
Non ho descritto ancora che tipo di problema ha: va in una specie di boot mode e mi da cose strane nella seriale

Code: [Select]
load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
vbb28d4a3
~ld

 ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
vbb28d4a3
~ld



Comunque questo è il mio codice che uso:

Code: [Select]

#include <ESP8266WiFi.h>
#include <Wire.h>
#include <DS3232RTC.h>
#include <TimeLib.h>
#include <Adafruit_BMP085.h>


Adafruit_BMP085 bmp;
const char* ssid     = "Nome connessione"; // Your ssid
const char* password = "Password"; // Your Password
IPAddress ip(10, 0, 0, 9); //set static ip
IPAddress gateway(10, 0, 0, 138); //set getteway
IPAddress subnet(255, 255, 255, 0);//set subnet
WiFiServer server(80);

byte giornoSalvato; // variabile per memorizzare lo stato del giorno attuale
byte meseSalvato; // variabile per memorizzare lo stato del mese attuale
unsigned int annoSalvato; // variabile per memorizzare lo stato dell'anno attuale
float minTemp;
float maxTemp;

void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.println();

  maxTemp = -100; //temperatura massima giornaliera
  minTemp = 100; //temperatura minima giornaliera
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.config(ip, gateway, subnet);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi is connected");
  server.begin();
  Serial.println("Server started");
  Serial.println(WiFi.localIP());


  giornoSalvato = day();
  meseSalvato = month();
  annoSalvato = year();
  Wire.pins(4, 5); // NodeMCU v1.0  SDA=>D2  SCL=>D1
  Wire.begin();
  setSyncProvider(RTC.get); // si prende l'ora attuale dell'RTC
  // Initialize the sensor (it is important to get calibration values stored on the device).
  bmp.begin();

}
void loop() {
  float pressurehpa = bmp.readPressure() / 100;
  float tp = bmp.readTemperature();


  if (tp < minTemp)
  {
    minTemp = tp;
  }

  if (tp > maxTemp)
  {
    maxTemp = tp;
  }

  if (giornoSalvato != day())
  {
    giornoSalvato = day();
    maxTemp = tp;
    minTemp = tp;
  }

  WiFiClient client = server.available();
  /*
    client.println("HTTP/1.1 200 OK");
    client.println("Content-Type: text/html");
    client.println("Connection: close");  // the connection will be closed after completion of the response
    client.println("Refresh: 10");  // update the page after 10 sec
    client.println();
    client.println("<!DOCTYPE HTML>");
    client.println("<html>");
    client.print("<p style='text-align: center;'><span style='font-size: x-large;'><strong>Digital Thermometer</strong></span></p>");
    client.print("<p style='text-align: center;'><span style='color: #0000ff;'><strong style='font-size: large;'>Temperature= ");
    client.print(bmp.readTemperature(),1);
    client.println("*C");
    client.print("<p style='text-align: center;'><span style='color: #0000ff;'><strong style='font-size: large;'>Pressure at level sea = ");
    client.print(pressurehpa,1);
    client.println("hPa");
    client.print("</p>");
    client.println("</html>");
  */

  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("Connection: close");
  client.println();
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");
  client.print(year());
  client.print("/");
  client.print(month());
  client.print("/");
  client.print(day());
  client.print("/");
  client.print("  ");
  client.print(hour());
  client.print(":");
  client.print(minute());
  client.print(":");
  client.print(second());
  client.print("&v0=-37.938906&v0=145.129615&v0=Clayton South(VIC)&v0=52m s.l.m.&v0=");
  client.print(tp, 1);
  client.print("&v0=");
  client.print("UMIDITA");
  client.print("&v0=");
  client.print(pressurehpa, 1);
  client.print("&v0=");
  client.print("ND");
  client.print("&v0=");
  client.print("ND");
  client.print("&v0=");
  client.print("ND");
  client.print("&v0=");
  client.print(minTemp, 1);
  client.print("&v0=");
  client.print(maxTemp, 1);
  client.print("&v0=");
  client.print("ND");
  client.print("&v0=");
  client.print("ND");
  client.println("</html>");
}


Per ora non mi vengono in mente altre informazioni da fornire, se avete domande chiedete pure!

Un'altra cosa è che i dispositivi hanno diversi indirizzi:

Scanning (SDA : SCL) - GPIO4 : GPIO5 - I2C device found at address 0x57  !
I2C device found at address 0x68  !
I2C device found at address 0x77  !

Non so perché ne trova tre comunque

Ho trovato questo online:

The I2C address of the DS3231 is 0x68. 0x57 is the I2C address of the AT24C32 EEPROM on your ZS-042 RTC module
MY PWS!
http://forum.arduino.cc/index.php?topic=413560.0
http://meteoflaminia.zapto.org:4600

gpb01

Ciao As_Needed, come anche tu dici ...
...  questo è il forum di Arduino.cc dove si fornisce assistenza per problemi relativi a problematiche che coinvolgono Arduino, i suoi collegamenti e la sua programmazione.

Quindi, ben vengano domande che riguardano moduli ESP8266 collegati ad Arduino, ma domande per moduli che nulla hanno a che vedere con Arduino, prodotti da altri produttori che hanno semplicemente utilizzato/sfruttato l'IDE per sviluppare un loro "core" e facilitare la programmazione delle loro schede, come le schede NodeMcu, sarebbe bene che, almeno in prima battuta, venissero poste al produttore. ;)

Grazie.

Guglielmo

P.S.: Ciò non toglie che, se qualcuno avesse la risposta al tuo quesito, sicuramente cercherà di aiutarti ;)
Search is Your friend ... or I am Your enemy !

docdoc

Beh io non ho una NodeMCU ma googlando un poco io ho trovato alcune cose, tipo QUESTA pagina di GitHub.


Vedi se ti chiarisce il comportamento.
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

PaoloP

Qui trovi qualche info --> https://arduino-esp8266.readthedocs.io/en/latest/boards.html#rst-cause
Comunque la causa più frequente di reset improvviso degli ESP è il calo di corrente. Assicurati che possa fornirgli sempre almeno 300mA per superare anche le fasi di picco. (consumi)

docdoc

Comunque la causa più frequente di reset improvviso degli ESP è il calo di corrente.
Non sappiamo bene quale NodeMCU stia usando esattamente, e non ci ha dato lo schema delle connessioni, ma il messaggio "rst cause:2" indica secondo me una cosa specifica: il reset pin. Lo ha portato a 3.3V con una resistenza da 10k?
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

As_Needed

Ciao As_Needed, come anche tu dici ...
...  questo è il forum di Arduino.cc dove si fornisce assistenza per problemi relativi a problematiche che coinvolgono Arduino, i suoi collegamenti e la sua programmazione.

Quindi, ben vengano domande che riguardano moduli ESP8266 collegati ad Arduino, ma domande per moduli che nulla hanno a che vedere con Arduino, prodotti da altri produttori che hanno semplicemente utilizzato/sfruttato l'IDE per sviluppare un loro "core" e facilitare la programmazione delle loro schede, come le schede NodeMcu, sarebbe bene che, almeno in prima battuta, venissero poste al produttore. ;)

Grazie.

Guglielmo

P.S.: Ciò non toglie che, se qualcuno avesse la risposta al tuo quesito, sicuramente cercherà di aiutarti ;)
Ciao Guglielmo :) Capisco esattamente ;)
MY PWS!
http://forum.arduino.cc/index.php?topic=413560.0
http://meteoflaminia.zapto.org:4600

As_Needed

#6
Aug 30, 2018, 11:13 am Last Edit: Aug 30, 2018, 11:22 am by As_Needed
Comunque, grazie per le risposte fornite. Proverò a dare un'occhiata a quei link. ;)

Comunque la versione che sto usando è la NodeMCU v1.0
Lo schema delle connessioni è un semplice 3.3V dei due dispositivi connessi, e GND in comune e le linee I2C sono connesse in parallelo tra i due dispositivi. Nessuna resistenza sul pin di reset.

Comunque non credo sia un problema di corrente, perché i due dispositivi ne usano molta poca


P.S. Sto guardando i link ma niente mi viene da pensare sia il caso mio mm
MY PWS!
http://forum.arduino.cc/index.php?topic=413560.0
http://meteoflaminia.zapto.org:4600

As_Needed

#7
Aug 30, 2018, 11:33 am Last Edit: Aug 30, 2018, 11:54 am by As_Needed
Piccolo aggiornamento, sembra il problema, capita anche se voglio semplicemente mandare l'ora online
senza connettere il BMP180

Quindi sembra che sbaglio qualcos'altro

Praticamente riesco a fare funzionare l'RTC solo offline e non online
Quindi alla fine mi viene da pensare veramente che potrebbe essere un problema di corrente..
Ma sinceramente mi sembra strano sia un problema di corrente
Anche perché pure se disconnetto l'RTC va in boot mode
Potrebbe essere qualcosa tra le librerie wifi e l'RTC a questo punto
MY PWS!
http://forum.arduino.cc/index.php?topic=413560.0
http://meteoflaminia.zapto.org:4600

docdoc

Lo schema delle connessioni è un semplice 3.3V dei due dispositivi connessi, e GND in comune e le linee I2C sono connesse in parallelo tra i due dispositivi. Nessuna resistenza sul pin di reset.
Veramente nella pagina che ti ha linkato PaoloP trovo questo schema:


Secondo questo schema e secondo me, il RST deve stare high, altrimenti fluttua ed avrà un comportamento instabile.

Prova a fare questa modifica.

Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

As_Needed

#9
Aug 30, 2018, 09:48 pm Last Edit: Aug 30, 2018, 09:53 pm by As_Needed
Proverò allora ;)
Comunque dici che è anche buono mettere fisicamente le pull up sulle linee SDA e SCL
invece della pullup interna ?

Purtroppo adesso non ho resistenze per provare, incredibile ma vero, comunque dici 4.7k vanno bene comunque ? Ne avevo ordinate un paio
MY PWS!
http://forum.arduino.cc/index.php?topic=413560.0
http://meteoflaminia.zapto.org:4600

docdoc

Comunque dici che è anche buono mettere fisicamente le pull up sulle linee SDA e SCL
invece della pullup interna ?
Non so dirti per questa in particolare, ma generalmente è la stessa cosa.

Quote
Purtroppo adesso non ho resistenze per provare, incredibile ma vero, comunque dici 4.7k vanno bene comunque ?
Hm, provvisoriamente si ma in genere meglio da 10k.

Quote
Ne avevo ordinate un paio
Le resistenze le compri due per volta?  :o
E quanto cavolo te le fa pagare il tuo fornitore? ;)
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

As_Needed

MY PWS!
http://forum.arduino.cc/index.php?topic=413560.0
http://meteoflaminia.zapto.org:4600

As_Needed

Piccolo aggiornamento, ma non riguardo al problema in specifico. Per ora ho usato un NTP server per avere la data e l'ora, quindi non userò al momento l'RTC.
MY PWS!
http://forum.arduino.cc/index.php?topic=413560.0
http://meteoflaminia.zapto.org:4600

PaoloP

Però se spegni tutto o mandi l'ESP in deepsleep perdi l'orario.  :smiley-confuse:

As_Needed

Però se spegni tutto o mandi l'ESP in deepsleep perdi l'orario.  :smiley-confuse:
Non avevo provato la deepsleep mode ancora :D , ma per ora comunque nel mio caso è alimentato constantemente. Comunque anche se spengo il modulo, una volta riacceso l'orario lo recupera subito.
MY PWS!
http://forum.arduino.cc/index.php?topic=413560.0
http://meteoflaminia.zapto.org:4600

Go Up