Salve a tutti sono neofita sia di questo forum che del mondo Arduino. Di elettronica qualcosa ne mastico ma ho importanti lacune.
Come ho scritto nel titolo avrei problemi e dubbi riguardo i2c.
Ho un sistema costituito da un esp12e collegato ad un arduino nano e ad un sensore BMP180(rileva temperatura, pressione atmosferica e altitudine) tutto su un bus i2c.
L' idea di funzionamento è la seguente:
- L' esp12 ha principalmente la funzione di connettersi ad internet e stabilire una connessione mqtt con un broker.
- Arduino Nano riceve i dati e in base ad una condizione (il dato è un booleano) va a leggere o meno tramite sempre i2c il sensore.
- Il valore del sensore viene poi passato all' esp che lo spara al server.
Il collegamento perciò è :
ESP(master)-----Nano(slave di esp, ma master di bmp)-----BMP180(slave)
Sono utilizzate due resistenze di pull up da 4k7, e siccome l'esp lavora a 3v3 anche un level shifter collegato sul bus i2c.
Lo sketch funziona, il problema è che dopo circa 1 oretta l arduino nano si blocca. Credo che sia causato dal i2c. Non saprei se possa essere fisico o software, allego il mio sketch:
Sketch semplificato caricato sull' esp8266:
#include <Wire.h>
byte x = 0;
int cont=0;
void setup()
{
Wire.begin();
Serial.begin(9600);
}
void loop()
{
Read();
delay(1000);
Write(cont);
delay(1000);
if(cont==100){
cont=0;
}
cont=cont+10;
}
void Read(){
Wire.requestFrom(8,1); // request 1 bytes(number) from slave device #8
int i =Wire.read()*10;
Serial.print("Read value: ");Serial.print(i);Serial.println();
}
void Write(int c){
Wire.beginTransmission(8); // transmit to device #8
Wire.write(c); // sends one byte
Wire.endTransmission(); // stop transmitting
}
Sketch caricato sull'arduino nano
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP085_U.h>
Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085);
int pressure;
void setup()
{
Serial.begin(9600);
Serial.println("Pressure Sensor Test"); Serial.println("");
if(!bmp.begin())
{
/* There was a problem detecting the BMP085 ... check your connections */
Serial.print("Ooops, no BMP085 detected ... Check your wiring or I2C ADDR!");
while(1);
}
Wire.begin(8); // join i2c bus with address #8
Wire.onReceive(receiveEvent); // register event
Wire.onRequest(requestEvent);
}
void loop(){
sensors_event_t event;
bmp.getEvent(&event);
/* Display the results (barometric pressure is measure in hPa) */
pressure=event.pressure;
if (pressure){
/* Display atmospheric pressue in hPa */
Serial.print("Pressure: ");
Serial.print(event.pressure);
Serial.println(" hPa");
}else{
Serial.println("Sensor error");
}
delay(1000);
}
void requestEvent(){
Wire.write(pressure/10);
}
void receiveEvent(int nnn){
int x= Wire.read();
Serial.print("Valore Ricevuto ");Serial.print(x);Serial.println();
}
Mi sorge un dubbio...
In un bus i2c posso avere un dispositivo come arduino nano che sia uno slave dell'esp ma si comporti da master col sensore?
Grazie a tutti per l'attenzione.
3g3hh3