Comunicazione tra arduini con I2C - trasmissione numeri

Buongiorno a tutti,

Ho un problema, simile a quello di "albepancio", di trasmissione con I2C dei numeri superiori a 10 che non vorrei (o meglio non sono riuscito) a risolvere neppure con una stringa.

Qualcuno può indicarmi dove sbaglio? Allego i due files.

Master

#include <Wire.h>

int suono = 0;
char conta;

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

void loop() {
  if (Serial.available()) {
      int input = Serial.read();
      suono = input;      
      Serial.println(suono);
    }

    vai();
    suono = 0;
}

void vai() {
  if (suono > 0) {
    Serial.println(suono);
    Wire.beginTransmission(7);
    Wire.write(suono);
    Wire.endTransmission();
  }
  suono = 0;
}

Slave

#include <Wire.h>
#include <LiquidCrystal.h>

#define BUTTON A0
#define BACKLIGHT 10

String v_testo;
int X = 0;
int X_old = 0;
int ripeti = 0;

int strLength = v_testo.length();
boolean blacklightStatus = false;
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

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

  Wire.onReceive(ricevi);

  pinMode( BACKLIGHT, OUTPUT );

  digitalWrite( BACKLIGHT, LOW );

  lcd.begin(16, 1);
  digitalWrite( BACKLIGHT, HIGH );
}

void loop() {
  if (X > 0) {
    X_old = X;
    lcd.setCursor(16, 0);
    testo();
    Serial.println(v_testo);
    int strLength = v_testo.length();
    Serial.println(strLength);
    
    while (X == X_old) {
      lcd.println(v_testo); // mi stampa su LCD la stringa
      for (int pCounter = 0; pCounter < strLength; pCounter++) {
        // scroll one position left:
        lcd.scrollDisplayLeft();
        //       wait a bit:
        delay(400);
        ricevi();
        if (X != X_old) {
          pCounter = strLength + 1;
          lcd.clear();
        }
      }
    }
  }
}

void ricevi() {

  int input = 0;
  while (Wire.available()) {
    input = Wire.read();
    X = (input - 48);
    Serial.println(X);
    Serial.println(input);
  }
}

void testo() {

  switch (X)  {

    case 4:
      v_testo = "Sistema acceso. ";
      break;

    case 5:
      v_testo = "Sistema spento";
      break;

    case 6:
      v_testo = " 2 minuti inizio tiri poi una volee di prova di 6 frecce 1 turno ";
      break;

    case 7:
      v_testo = " 2 minuti inizio tiri poi gara di 6 frecce 1 turno";
      break;

    case 8:
      v_testo = "Gara di 6 frecce 1 turno";
      break;

    case 9:
      v_testo = "2 minuti inizio tiri poi una volee di prova di 6 frecce 2 turni";
      break;

    case 10:
      v_testo = "2 minuti inizio tiri poi gara di 6 frecce 2 turni";
      break;

    case 11:
      v_testo = "Gara di 6 frecce 2 turni";
      break;

    case 27:
      v_testo = "2 minuti inizio tiri poi prima volee di prova di 3 frecce 1 turno";
      break;

    case 20:
      v_testo = "Seconda volee di prova di 3 frecce 1 turno";
      break;

    case 21:
      v_testo = "Gara di 3 frecce 1 turno";
      break;

    case 23:
      v_testo = "2 minuti inizio tiri poi prima volee di prova di 3 frecce 2 turni";
      break;

    case 24:
      v_testo = "Seconda volee di prova di 3 frecce 2 turni";
      break;

    case 25:
      v_testo = "Gara di 3 frecce 2 turni";
      break;

    case 12:
      v_testo = "2 minuti inizio tiri O.R.";
      break;

    case 13:
      v_testo = "O.R. Gara";
      break;

    case 22:
      v_testo = "2 minuti inizio tiri poi gara di 3 frecce 1 turno";
      break;

    case 26:
      v_testo = "2 minuti inizio tiri poi gara di 3 frecce 2 turni";
      break;

    case 14:
      v_testo = "Volee di recupero - 1 freccia";
      break;

    case 15:
      v_testo = "Volee di recupero - 2 frecce";
      break;

    case 16:
      v_testo = "Volee di recupero - 3 frecce";
      break;

    case 17:
      v_testo = "Volee di recupero - 4 frecce";
      break;

    case 18:
      v_testo = "Volee di recupero - 5 frecce";
      break;

    case 19:
      v_testo = "Volee di recupero - 6 frecce";
      break;

    case 31:
      v_testo = "Prova tempi - 120 sec";
      break;

    case 30:
      v_testo = "Prova tempi - 240 sec";
      break;

  }
}

Grazie anticipatamente per eventuali suggerimenti.

Enrico

Scusate NON HC12 ma I2C!!!

se modifichi il primo post puoi modificare anche il titolo :slight_smile:

enrico24:
Ho un problema, simile a quello di "albepancio", di trasmissione con I2C dei numeri superiori a 10 che non vorrei (o meglio non sono riuscito) a risolvere neppure con una stringa.

Un singolo byte trasmesso su seriale o i2c trasporta un valore numerico tra 0 e 255.

Mi sembra che il problema stia nell'interpretazione dei dati di partenza (in arrivo sulla prima seriale), che non sono un valore numerico "diretto" contenuto in un solo byte, ma una stringa di caratteri ASCII (presumibilmente seguita dai byte di fineriga).

L'intera stringa deve essere quindi ricevuta e convertita nel valore numerico 0..255 che rappresenta.

Ma prima di tutto bisogna sapere esattamente come sono i dati in arrivo (quanti byte, fineriga ecc).

Ad esempio se sono stringhe separate da fineriga potrebbe bastare questo:

byte s = 0;  // stato ricezione stringa
byte valore; // valore ricevuto 0..255

void loop()
{
    while(Serial.available)
    {
        byte rx = Serial.read();
        bool eUnNumero = rx>='0' && rx<='9';
        if(s==0 && eUnNumero)      { valore = rx;  s = 1; }
        else if(s==1 && eUnNumero) valore = valore*10 + rx;
        else if(s==1)              { elabora(valore); s = 0; }
    }
}


void elabora(byte v)
{
    ....
}

Grazie Claudio, spiegazione esauriente (come sempre!) = problema risolto.

Salati e buona serata.