I2C

Saluti a tutti.

Dopo diversi tentativi per ottenere un collegamento stabile con nRF24 sto valutando la possibilità di utilizzare per la trasmissione dei dati (considerato anche che la distanza è inferiore ai 100 mt) il protocollo I2C.

Grazie ai vari tutorials presenti in rete mi è sembrato intuitivo e di semplice utilizzo.

ERRORE!

I guai sono iniziati quando ho cercato di inviare allo slave un array. In rete non sono riuscito a trovare alcunché di comprensibile per il mio livello di conoscenza.

Qualcuno ha già risolto il problema e potrebbe indicarmi la strada corretta?

Allego gli ultimi sketch elaborati (non funzionanti!!), l'errore è nella definizione dei dati da inviare, ma proprio non sono riuscito a capire come variarli.

Grazie anticipatamente.

#include <Wire.h>

int v_Trasmetti[3];
char car;
String stringa;
int v_a;
int v_b;
int v_c;

void setup() {
  Serial.begin(9600);
  Wire.begin();
}

void loop() {
  if (Serial.available()) {
    stringa = "";
    do {
      if (Serial.available()) {
        car = Serial.read();
        if (car != '\n')
          stringa += car;
      }
    } while (car != '\n'); // carattere speciale per '\n'

    if (stringa == "a") {
      v_a = 1;
      v_b = 2;
      v_c = 3;
    }
    invia();
  }
}

void invia() {
  v_Trasmetti [0] = v_a;
  v_Trasmetti [1] = v_b;
  v_Trasmetti [2] = v_c;

  Wire.beginTransmission(7);
  Wire.write(&v_Trasmetti, sizeof(v_Trasmetti));
  Wire.endTransmission();
  delay(500);
}
#include <Wire.h>

int v_a;
int v_b;
int v_c;
int v_ricevuto[3];

void setup() {
  Serial.begin(9600);
  Wire.begin(7);
  Wire.onReceive(ricevi);
}

void loop() {
  delay(1000);
}

void ricevi() {

  while (Wire.available()) {
    Wire.read(&ricevuto, sizeof(ricevuto));
  }
  
  v_a = ricevuto[0];
  v_b = ricevuto[1];
  v_c = ricevuto [2];

  Serial.print(v_a);
  Serial.print(" - ");
  Serial.print(v_b);
  Serial.print(" - ");
  Serial.println(v_c);
}

I2C funziona mica per distanze da 100m.

Grazie uwefed.

Ero convinto che arrivasse fino a ca. 200 mt! Errore mio.

Dovrei trasferire da un Uno a 2 Mega delle semplici istruzioni. Ho provato lo nRF24l01 con risultati troppo incerti.

Cosa mi consiglieresti di utilizzare? La distanza lineare che dovrei raggiungere è di ca. 100 mt, in linea d'aria ca. 70 mt. (scusa in anticipo se non sono passato nella sezione Hardware)

Saluti.

Non so se funziona per lunghe distanze, però per l'inviare l'array ho fatto così

Master

#include <Wire.h>

int array[] = {200, 250, 500, 000, 000, 000};


void setup() {
  
Wire.begin();
Serial.begin(9600);
}
  
  void loop() {
Wire.beginTransmission(3);

    Wire.write(stepsMatrix2,6);
  
   Wire.endTransmission();

  
  }

I valori raggiungono massimo 255 (e devo capire come mandare un valore superiore a 255, se qualcuno lo sa , ascolto volentieri)

per lo slave ho fatto così

#include <Wire.h>


void setup() {

Serial.begin(9600);
Wire.begin(3);
Wire.onReceive(ricevi);
}
  
  void loop() {
  
    delay(100);
  }

  void ricevi(){
 while(Wire.available()>0){
    int long a = Wire.read();
    Serial.println(a);
 }

  }

così invia e riceve i valori dell'array.

Il mio problema è come inviare i valori di una matrice, se qualcuno sa come fare, ri-ascolto volentirei :slight_smile: )