Comunicazione di 2 Arduino, uno ha pulsanti e led, mentre l'altro un LCD

Salve, vorrei iniziare dicendo che il "programma di base" è fatto, ma vorrei collegare uno schermo LCD ad un altro Arduino(per mancanza di pin al primo).
So che per collegare 2 Arduino si può collegare in modo seriale, ma il problema è il programma , non riesco proprio a capire come si deve scrivere .
Il programma qui sotto l'ho fatto pensando di usare un solo Arduino con un LCD I2C ma per mancanza di componenti lo devo fare con un LCD separato.
PS: se si può migliorare il programma sarei lieto di saperlo.
Grazie in anticipo

[code]
#include <LiquidCrystal.h>
#define LED_B1 6
#define LED_B2 7
#define LED_B3 8
#define LED_B4 9
#define PUL1 3
#define PUL2 4
#define PUL3 5
int valpul1 = 0;
int valpul2 = 0;
int valpul3 = 0;
int vecchio_valpul1 = 0;
int vecchio_valpul2 = 0;
int vecchio_valpul3 = 0;
#define B1 10
#define B2 11
#define B3 12
#define B4 13
int cocktail_1 = 0;
int cocktail_2 = 0;
int cocktail_3 = 0;
int stato1 = 0;
int stato2 = 0;
int stato3 = 0;

int backLight = 13;    
int x=0;
int timer=0;
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2); //modificare pin


void setup(){

pinMode(LED_B1, OUTPUT);
pinMode(LED_B2, OUTPUT);
pinMode(LED_B3, OUTPUT);
pinMode(LED_B4, OUTPUT);
pinMode(PUL1, INPUT);
pinMode(PUL2, INPUT);
pinMode(PUL3, INPUT);
pinMode(B1, OUTPUT);
pinMode(B2, OUTPUT);
pinMode(B3, OUTPUT);
pinMode(B4, OUTPUT);

}
void loop()
{
  pinMode(backLight, OUTPUT);
digitalWrite(backLight, HIGH); 
lcd.begin(16,2);          
lcd.clear();
lcd.setCursor(5, 0);
  x=0;
lcd.print("Cocktail1");
  while(x<16){
    lcd.scrollDisplayLeft();
    delay(300);
    x++;
  }
  lcd.clear();
  lcd.setCursor(5, 0);
  x=0;
  lcd.print("Cocktail2");
  while(x<16){
    lcd.scrollDisplayLeft();
     delay(300);
    x++;
  }
  lcd.clear();
  lcd.setCursor(5, 0);
  x=0;
    lcd.print("Cocktail3");
  while(x<16){
    lcd.scrollDisplayLeft();
     delay(300);
    x++;
  }
  delay(1000);

        
//programma Pulsanti Bottiglie
valpul1 = digitalRead(PUL1);
valpul2 = digitalRead(PUL2);
valpul3 = digitalRead(PUL3);

if((valpul1 == HIGH) && (vecchio_valpul1 == LOW)){
stato1 = 1 - stato1;
}
else if(valpul1 == LOW) {
  stato1 = 0;
  }
vecchio_valpul1 = valpul1;

if((valpul2 == HIGH) && (vecchio_valpul2 == LOW)){
stato2 = 1 - stato2;
}
else if(valpul2 == LOW) {
  stato2 = 0;
  }
vecchio_valpul2 = valpul2;

if((valpul3 == HIGH) && (vecchio_valpul3 == LOW)){
stato3 = 1 - stato3;
}
else if(valpul3 == LOW) {
  stato3 = 0;
  }
vecchio_valpul3 = valpul3;

//programma esecutivo
if(stato1 == 1){
  timer=100;
   lcd.clear();
  lcd.setCursor(5, 0);
    lcd.print("Cocktail1");
digitalWrite(cocktail_1,1);
digitalWrite(LED_B1, HIGH);
digitalWrite(B1, HIGH);
  delay (1000);
  digitalWrite(LED_B1, LOW);
  digitalWrite(B1, LOW);
digitalWrite(LED_B2, HIGH);
digitalWrite(B2, HIGH);
  delay (500);
  digitalWrite(LED_B2, LOW);
  digitalWrite(B2, LOW);
  delay(100);
  timer=0;
}

if(stato2 == 1) {
  timer=100;
   lcd.clear();
  lcd.setCursor(5, 0);
    lcd.print("Cocktail2");
digitalWrite(cocktail_2,1);
digitalWrite(LED_B2, HIGH);
digitalWrite(B2, HIGH);
  delay (1000);
  digitalWrite(LED_B2, LOW);
  digitalWrite(B2, LOW);
digitalWrite(LED_B3, HIGH);
digitalWrite(B3, HIGH);
  delay (500);
  digitalWrite(LED_B3, LOW);
  digitalWrite(B3, LOW);
  delay(100);
  timer=0;
}
if(stato3 == 1){
  timer=100;
   lcd.clear();
  lcd.setCursor(5, 0);
    lcd.print("Cocktail3");
digitalWrite(cocktail_3,1);
digitalWrite(LED_B4, HIGH);
digitalWrite(B4, HIGH);
  delay (1000);
  digitalWrite(LED_B4, LOW);
  digitalWrite(B4, LOW);
digitalWrite(LED_B2, HIGH);
digitalWrite(B2, HIGH);
  delay (500);
  digitalWrite(LED_B2, LOW);
  digitalWrite(B2, LOW);
  delay(100);
  timer=0;
}
}

[/code]

Guarda che con lo sketch che hai messo è più che sufficiente un unico Arduino anche con LCD parallelo.

... non solo, ma se si usa un LCD di quelli con l'interfaccia I2C, si occupano solo DUE pin invece di tutti i pin occupati dagli LCD classici e ... il costo è ormai praticamente lo stesso (volendo, possedendo già il LCD parallelo, basta comprare solo la schedina adattatrice per I2C).


Guglielmo

So che il programma è buono così com'è ,ma il problema e che lo devo provare su Tinkercad e non ci sono ne gli schermi LCD I2C ne le schede adattatrice per I2C. Per questo volevo sapere come modificare il programma in base a questo.

chrito:
vorrei collegare uno schermo LCD ad un altro Arduino(per mancanza di pin al primo)

Puoi usare anche i pin A0..A5 come ingressi/uscite digitali, quindi ci sono pin a sufficienza anche per l'LCD normale :wink: È da vedere se Tinkercad permette di usarli. Al posto di chiamarli A0..A5 si possono anche usare i numeri 14..19

Seconda cosa il codice va indentato per renderlo leggibile agli altri (se non si vuole fare a mano basta un CTRL+T sull'IDE).

Terza più complessa, hai valutato l'ordine di esecuzione delle istruzioni e i tempi che impiegano? Perché mi sembra che i pulsanti vengono letti una volta ogni circa 15 secondi. È quello che volevi fare?

chrito:
So che il programma è buono così com'è

Oddio... buono mi sembra un parolone con tutti quei delay() bloccanti ;D :smiley: ;D