NodeMCU ESP 8266 problemi con più dispositivi I2C

Salve a tutti! Non scrivo nel forum da un po' di tempo :smiley: E guarda caso ho cominciato a scrivere per via di un problema con la NodeMCU :smiley:
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

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:

#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

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. :wink:

Grazie.

Guglielmo

P.S.: Ciò non toglie che, se qualcuno avesse la risposta al tuo quesito, sicuramente cercherà di aiutarti :wink:

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.

Qui trovi qualche info --> Boards — ESP8266 Arduino Core 3.1.1-26-g734defb8 documentation
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)

PaoloP:
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?

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. :wink:

Grazie.

Guglielmo

P.S.: Ciò non toglie che, se qualcuno avesse la risposta al tuo quesito, sicuramente cercherà di aiutarti :wink:

Ciao Guglielmo :slight_smile: Capisco esattamente :wink:

Comunque, grazie per le risposte fornite. Proverò a dare un'occhiata a quei link. :wink:

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

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

As_Needed:
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.

Proverò allora :wink:
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

As_Needed:
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.

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.

Ne avevo ordinate un paio

Le resistenze le compri due per volta? :o
E quanto cavolo te le fa pagare il tuo fornitore? :wink:

Un paio era un modo di dire :smiley:

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.

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

PaoloP:
Però se spegni tutto o mandi l'ESP in deepsleep perdi l'orario. :confused:

Non avevo provato la deepsleep mode ancora :smiley: , ma per ora comunque nel mio caso è alimentato constantemente. Comunque anche se spengo il modulo, una volta riacceso l'orario lo recupera subito.

Ciao,
il nodemcu funziona solo come master i2c e non sun iona da slave.

Per questo compra Arduino nano e facci sapere se ti funziona

Ho fatto delle prove di nuovo, con tutti e due i sensori collegati e lo schema con l rst alto e niente , anche stavolta va in boot mode :confused: Mi sa che per ora opterò per l NTP
L'unica cosa che non ho messo è il condensatore tra massa e VCC, ma non credo cambi qualcosa a questo punto, anche perché il problema sembrava essere sul rst, certo il condensatore è pure contro le interferenze.. non ho condensatori per provare comunque ecco perché non l'ho messo :smiley:

Cippa149:
Ciao,
il nodemcu funziona solo come master i2c e non sun iona da slave.

Per questo compra Arduino nano e facci sapere se ti funziona

Non ho capito cosa intendi

Il codice per far funzionare l'ESP8266 come slave I2C non è stato ancora implementato nel core (Add I2C slave support by mrnerdhair · Pull Request #3287 · esp8266/Arduino · GitHub)
L'ESP8266 e quindi la NodeMCU come slave I2C non funziona.

Tutto chiaro
Però non centra con il far funzionare due dispositivi I2C no ?