Go Down

Topic: I2C master e slave contemporaneamente blocca Arduino nano (Read 768 times) previous topic - next topic

3g3hh3

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:
Code: [Select]
#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


Code: [Select]
#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... :smiley-roll-sweat:
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

fabio22

Benvenuto. Essendo il tuo primo post, nel rispetto del regolamento, ti chiediamo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato REGOLAMENTO... Grazie.

Go Up