Orologio led con due schede arduino uno...aiuto?

Salve a tutti ragazzi, io vado in prima superiore e oggi sono andato da dei ragazzi di 4 per chiedergli aiuto su come creare il mio orologio led con arduino, dato che con il collegamento di due schede arduino uno tramite il metodo I2C non ero riuscito. Insieme siamo riusciti a trovare una soluzione ma a quanto pare ho sbagliato qualcosa nello sketch XD
Ho provato a riguardarci con l’aiuto di un mio amico ma non sono riuscito perciò speravo in voi… lo sketch della prima scheda (master) è questo:

//MASTER

int pin1=1;
int pin2=2;
int pin3=3;
int pin4=4;
int pin5=5;
int pin6=6;
int pin7=7;
int pin8=8;
int pin9=9;
int pin10=10;
int pin11=11;
int pin12=12;
int pin13=13;
int pausa5min=300000;
int pausa1ora=3600000;
int pausa=299995;
int pausa2=5;
int ora=0;
int minuti=0;

void setup() {
  
  pinMode (pin1, OUTPUT);
  pinMode (pin2, OUTPUT);
  pinMode (pin3, OUTPUT);
  pinMode (pin4, OUTPUT);
  pinMode (pin5, OUTPUT);
  pinMode (pin6, OUTPUT);
  pinMode (pin7, OUTPUT);
  pinMode (pin8, OUTPUT);
  pinMode (pin9, OUTPUT);
  pinMode (pin10, OUTPUT);
  pinMode (pin11, OUTPUT);
  pinMode (pin12, OUTPUT);
 
 ora=9;
 minuti=15;
}

   void loop()
{
  scriviminuti();
}

void scriviminuti() {
  
 {
  minuti=minuti+1;
  minuti=(1<=minuti<13);
  
   if (minuti==1) {
     digitalWrite (pin13, HIGH);
     delay (pausa2);
     digitalWrite (pin13, LOW);
     digitalWrite (pin1, HIGH); 
   }
   else if (minuti==2) {
     digitalWrite (pin13, HIGH);
     delay (pausa2);
     digitalWrite (pin13, LOW);
     digitalWrite (pin1, LOW);
     digitalWrite (pin2, HIGH);
  }
  else if (minuti==3) {
     digitalWrite (pin13, HIGH);
     delay (pausa2);
     digitalWrite (pin13, LOW);
     digitalWrite (pin2, LOW);
     digitalWrite (pin3, HIGH);
  }
  else if (minuti==4) {
     digitalWrite (pin13, HIGH);
     delay (pausa2);
     digitalWrite (pin13, LOW);
     digitalWrite (pin3, LOW);
     digitalWrite (pin4, HIGH);
  }
  else if (minuti==5) {
     digitalWrite (pin13, HIGH);
     delay (pausa2);
     digitalWrite (pin13, LOW);
     digitalWrite (pin4, LOW);
     digitalWrite (pin5, HIGH);
  }
  else if (minuti==6) {
     digitalWrite (pin13, HIGH);
     delay (pausa2);
     digitalWrite (pin13, LOW);
     digitalWrite (pin5, LOW);
     digitalWrite (pin6, HIGH);
  }
  else if (minuti==7) {
     digitalWrite (pin13, HIGH);
     delay (pausa2);
     digitalWrite (pin13, LOW);
     digitalWrite (pin6, LOW);
     digitalWrite (pin7, HIGH);
  }
  else if (minuti==8) {
     digitalWrite (pin13, HIGH);
     delay (pausa2);
     digitalWrite (pin13, LOW);
     digitalWrite (pin7, LOW);
     digitalWrite (pin8, HIGH);
  }
  else if (minuti==9) {
     digitalWrite (pin13, HIGH);
     delay (pausa2);
     digitalWrite (pin13, LOW);
     digitalWrite (pin8, LOW);
     digitalWrite (pin9, HIGH);
  }
  else if (minuti=10) {
     digitalWrite (pin13, HIGH);
     delay (pausa2);
     digitalWrite (pin13, LOW);
     digitalWrite (pin9, LOW);
     digitalWrite (pin10, HIGH);
  }
  else if (minuti==11) {
     digitalWrite (pin13, HIGH);
     delay (pausa2);
     digitalWrite (pin13, LOW);
     digitalWrite (pin10, LOW);
     digitalWrite (pin11, HIGH);
  }
  else if (minuti==12) {
     digitalWrite (pin13, HIGH);
     delay (pausa2);
     digitalWrite (pin13, LOW);
     digitalWrite (pin11, LOW);
     digitalWrite (pin12, HIGH);
  }
  
  delay (pausa5min);
  
 }
  minuti=0;
  scriviora();
}

   void scriviora()  {
     
     {
     
    ora=ora+1;
     
     ora=(1<=ora<13);
  
   if (ora==1) {
     digitalWrite (pin12, LOW);
     digitalWrite (pin1, HIGH); 
   }
   else if (ora==2) {
     digitalWrite (pin1, LOW);
     digitalWrite (pin2, HIGH);
  }
  
  else if (ora==3) {
     digitalWrite (pin2, LOW);
     digitalWrite (pin3, HIGH);
  }
  
  else if (ora==4) {
     digitalWrite (pin3, LOW);
     digitalWrite (pin4, HIGH);
  }
  
  else if (ora==5) {
     digitalWrite (pin4, LOW);
     digitalWrite (pin5, HIGH);
  }
  
  else if (ora==6) {
     digitalWrite (pin5, LOW);
     digitalWrite (pin6, HIGH);
  }
  
  else if (ora==7) {
     digitalWrite (pin6, LOW);
     digitalWrite (pin7, HIGH);
  }
  
  else if (ora==8) {
     digitalWrite (pin7, LOW);
     digitalWrite (pin8, HIGH);
  }
  
  else if (ora==9) {
     digitalWrite (pin8, LOW);
     digitalWrite (pin9, HIGH);
  }
  
  else if (ora==10) {
     digitalWrite (pin9, LOW);
     digitalWrite (pin10, HIGH);
  }
  
  else if (ora==11) {
     digitalWrite (pin10, LOW);
     digitalWrite (pin11, HIGH);
  }
  
  else if (ora==12) {
     digitalWrite (pin11, LOW);
     digitalWrite (pin12, HIGH);
  }
     
    }
    
    ora=0;
    
   }

lo sketch della seconda scheda (Slave), che riceve istruzioni dal master:

//SLAVE

int pin1=1;
int pin2=2;
int pin3=3;
int pin4=4;
int pin5=5;
int pin6=6;
int pin7=7;
int pin8=8;
int pin9=9;
int pin10=10;
int pin11=11;
int pin12=12;
int pin13=13;
int minuti=0;

void setup()  {
  
  pinMode (pin1, OUTPUT);
  pinMode (pin2, OUTPUT);
  pinMode (pin3, OUTPUT);
  pinMode (pin4, OUTPUT);
  pinMode (pin5, OUTPUT);
  pinMode (pin6, OUTPUT);
  pinMode (pin7, OUTPUT);
  pinMode (pin8, OUTPUT);
  pinMode (pin9, OUTPUT);
  pinMode (pin10, OUTPUT);
  pinMode (pin11, OUTPUT);
  pinMode (pin12, OUTPUT);
  pinMode (pin13, INPUT);
  
}

void loop () {
  
  ReadMaster();
  
}

void ReadMaster() {
  
    {
      minuti=(1<=minuti<13);
     
     if (pin13==HIGH) {
      minuti=minuti+1;
      }
     else {
     
     }
   
   
     if (minuti==1) {
       digitalWrite (pin12, LOW);
     digitalWrite (pin1, HIGH); 
   }
  else if (minuti==2) {
     digitalWrite (pin1, LOW);
     digitalWrite (pin2, HIGH);
  }
  
  else if (minuti==3) {
     digitalWrite (pin2, LOW);
     digitalWrite (pin3, HIGH);
  }
  
  else if (minuti==4) {
     digitalWrite (pin3, LOW);
     digitalWrite (pin4, HIGH);
  }
  
  else if (minuti==5) {
     digitalWrite (pin4, LOW);
     digitalWrite (pin5, HIGH);
  }
  
  else if (minuti==6) {
     digitalWrite (pin5, LOW);
     digitalWrite (pin6, HIGH);
  }
  
  else if (minuti==7) {
     digitalWrite (pin6, LOW);
     digitalWrite (pin7, HIGH);
  }
  
  else if (minuti==8) {
     digitalWrite (pin7, LOW);
     digitalWrite (pin8, HIGH);
  }
  
  else if (minuti==9) {
     digitalWrite (pin8, LOW);
     digitalWrite (pin9, HIGH);
  }
  
  else if (minuti==10) {
     digitalWrite (pin9, LOW);
     digitalWrite (pin10, HIGH);
  }
  
  else if (minuti==11) {
     digitalWrite (pin10, LOW);
     digitalWrite (pin11, HIGH);
  }
  
  else if (minuti==12) {
     digitalWrite (pin11, LOW);
     digitalWrite (pin12, HIGH);
  }
  
    }
    
    minuti=0;
    
}

A me utilizzando questi sketch uploddati sulle relative schede mi si accendono solamente i led corrispondenti all’ora 11 e 55 minuti…non riesco proprio a capire :disappointed_relieved:
Grazie a tutti per l’aiuto

[EDIT] aggiunto CODE TAGs. Uwe [/EDIT]

Dovresti modificare il post precedente e includere il codice nei teg CODE come spiegato al punto 7 → http://forum.arduino.cc/index.php?topic=149082.0

Questo

 minuti=(1<=minuti<13);

non è un comando C valido.
Quale sarebbe il suo scopo?

Certo che anche i ragazzi di 4° sono messi bene a programmazione. :sweat_smile:

Ho fatto qualche modifica al master senza cambiare la logica del programma e il flusso.
C’è sicuramente qualcosa di strano che dovrai correggere.

//MASTER

const int pin1 = 1;
const int pin2 = 2;
const int pin3 = 3;
const int pin4 = 4;
const int pin5 = 5;
const int pin6 = 6;
const int pin7 = 7;
const int pin8 = 8;
const int pin9 = 9;
const int pin10 = 10;
const int pin11 = 11;
const int pin12 = 12;
const int pin13 = 13;
const unsigned long pausa5min = 300000;
const unsigned long pausa1ora = 3600000;
const unsigned long pausa = 299995;
const int pausa2 = 5;
byte ora = 0;
byte minuti = 0;

void setup()
{
	pinMode (pin1, OUTPUT);
	pinMode (pin2, OUTPUT);
	pinMode (pin3, OUTPUT);
	pinMode (pin4, OUTPUT);
	pinMode (pin5, OUTPUT);
	pinMode (pin6, OUTPUT);
	pinMode (pin7, OUTPUT);
	pinMode (pin8, OUTPUT);
	pinMode (pin9, OUTPUT);
	pinMode (pin10, OUTPUT);
	pinMode (pin11, OUTPUT);
	pinMode (pin12, OUTPUT);
	pinMode (pin13, OUTPUT);

	ora = 9;
	minuti = 15;
}

void loop()
{
	minuti++;
	minuti = constrain(minuti, 1, 12);
	scriviminuti();
	delay (pausa5min);
	minuti = 0;
	ora++;
	ora = constrain(ora, 1, 12);
	scriviora();
	ora = 0;
}

void scriviminuti()
{
	switch (minuti)
	{
		case 1:
			digitalWrite (pin13, HIGH);
			delay (pausa2);
			digitalWrite (pin13, LOW);
			digitalWrite (pin1, HIGH);
		case 2:
			digitalWrite (pin13, HIGH);
			delay (pausa2);
			digitalWrite (pin13, LOW);
			digitalWrite (pin1, LOW);
			digitalWrite (pin2, HIGH);
		case 3:
			digitalWrite (pin13, HIGH);
			delay (pausa2);
			digitalWrite (pin13, LOW);
			digitalWrite (pin2, LOW);
			digitalWrite (pin3, HIGH);
		case 4:
			digitalWrite (pin13, HIGH);
			delay (pausa2);
			digitalWrite (pin13, LOW);
			digitalWrite (pin3, LOW);
			digitalWrite (pin4, HIGH);
		case 5:
			digitalWrite (pin13, HIGH);
			delay (pausa2);
			digitalWrite (pin13, LOW);
			digitalWrite (pin4, LOW);
			digitalWrite (pin5, HIGH);
		case 6:
			digitalWrite (pin13, HIGH);
			delay (pausa2);
			digitalWrite (pin13, LOW);
			digitalWrite (pin5, LOW);
			digitalWrite (pin6, HIGH);
		case 7:
			digitalWrite (pin13, HIGH);
			delay (pausa2);
			digitalWrite (pin13, LOW);
			digitalWrite (pin6, LOW);
			digitalWrite (pin7, HIGH);
		case 8:
			digitalWrite (pin13, HIGH);
			delay (pausa2);
			digitalWrite (pin13, LOW);
			digitalWrite (pin7, LOW);
			digitalWrite (pin8, HIGH);
		case 9:
			digitalWrite (pin13, HIGH);
			delay (pausa2);
			digitalWrite (pin13, LOW);
			digitalWrite (pin8, LOW);
			digitalWrite (pin9, HIGH);
		case 10:
			digitalWrite (pin13, HIGH);
			delay (pausa2);
			digitalWrite (pin13, LOW);
			digitalWrite (pin9, LOW);
			digitalWrite (pin10, HIGH);
		case 11:
			digitalWrite (pin13, HIGH);
			delay (pausa2);
			digitalWrite (pin13, LOW);
			digitalWrite (pin10, LOW);
			digitalWrite (pin11, HIGH);
		case 12:
			digitalWrite (pin13, HIGH);
			delay (pausa2);
			digitalWrite (pin13, LOW);
			digitalWrite (pin11, LOW);
			digitalWrite (pin12, HIGH);
	}
}

void scriviora()
{
	switch(ora)
	{
		case 1:
			digitalWrite (pin12, LOW);
			digitalWrite (pin1, HIGH);
		case 2:
			digitalWrite (pin1, LOW);
			digitalWrite (pin2, HIGH);
		case 3:
			digitalWrite (pin2, LOW);
			digitalWrite (pin3, HIGH);
		case 4:
			digitalWrite (pin3, LOW);
			digitalWrite (pin4, HIGH);
		case 5:
			digitalWrite (pin4, LOW);
			digitalWrite (pin5, HIGH);
		case 6:
			digitalWrite (pin5, LOW);
			digitalWrite (pin6, HIGH);
		case 7:
			digitalWrite (pin6, LOW);
			digitalWrite (pin7, HIGH);
		case 8:
			digitalWrite (pin7, LOW);
			digitalWrite (pin8, HIGH);
		case 9:
			digitalWrite (pin8, LOW);
			digitalWrite (pin9, HIGH);
		case 10:
			digitalWrite (pin9, LOW);
			digitalWrite (pin10, HIGH);
		case 11:
			digitalWrite (pin10, LOW);
			digitalWrite (pin11, HIGH);
		case 12:
			digitalWrite (pin11, LOW);
			digitalWrite (pin12, HIGH);
	}
}

Guardandi i Tuoi sketch: alcuni consigli:
Sketch Master:

  • Hai dimenticato di definire il pin 13 con pinMode(). Se non lo definisci é un entrata, ma non fidarti di questo. Usa sempre pinMode().
  • minuti=(1<=minuti<13); non ha senso (come lo disse giá Paolo. Devi spiegarci Tu cosa vuoi fare. Noi non riusciamo ad indovinarlo.
    Penso che voi avere numeri da 0 a 11; allora devi scrivere
    if(minuti>11) minuti=0;
    Meglio usare i valori da 0 a 11 e non da 1 a 12 perché i minuti e le ore vanno da 0 a 59.
  • delay (pausa5min); usa millis() per gestire i tempi.
  • ora=(1<=ora<13); giá detto
  • dove é la comunicazione col slave?
    Al posto di fare questo codice denominato spagetticode (si dice in tedesco) cerca di usare le array. Cosí puoi acorciare di tanto il codice. esempio:
int LED[]={1,2,3,4,5,6,7,8,9,10,11,12,13};   // creo un array con 12 elementi (indice da 0 a 11) con i piedini dei LED 
...
void scriviora()  {    // ora va da 0 a 12
digitalwrite(LED[ora],HIGH);
if (ora == 0) digitalwrite(LED[11],low);
else  digitalwrite(LED[(ora-1)],low);

Questa funzione fa la stessa cosa che la tua funzione scriviora().

slave:

 if (pin13==HIGH) {
      minuti=minuti+1;

Questo conta velocemente su perché vede piú volte il pin 13 HIGH.
Devi usare una variabile e incrementare i minuti solo quando c’é un cambio da LOW a HIGH:

int stato13=0;

if ((pin13==HIGH)&&stato13 ==0)    // Incrementa minuti solo quando il pin 13 é high e la variabile é 0
  {
  minuti=minuti+1;
  stato13=1;                                           // mette la variable a 1 per non incrementare nelle seguenti pasaggi di questa condizione.
  }
if ((pin13==LOW)&&stato13 ==1)     // mette la variable a 0 poter vedere il prossimo passaggio LOW-HIGH
  {
  stato13=0;
  }

Ciao Uwe

@PaoloP:

lo scopo di minuti=(1<=minuti<13); era il comando che doveva fare in modo che nella funzione void scriviminuti doveva far si che quando minuti diveniva uguale a 13, i minuti ritornavano a 0 e il giro ricominciava, o almeno, quello doveva essere l’idea…

Grazie mille per lo sketch che mi hai passato ma sorge un nuovo problema…ora gli unici led che si accendono sono quelli corrispondenti alle ore 12, però secondo me come hai fatto tu ti sei un po’ complicato la vita perchè quello di cui ho bisogno è che il master ogni 5 minuti mandi un impulso allo slave, lo slave lo riceva e nell’arco di un ora (12 impulsi) tenga il conto e in base a quanti impulsi ha ricevuto accende i vari pin. ad esempio: se sono le 7 e 15 vorrà dire che allo slave sono arrivati 3 impulsi da quando si è riazzerato (cioè allo scoccare dei 60 minuti) perciò lo slave accenderà il pin 3. Quello che voglio fare io è assegnare a una variabile x un valore 0 e fare in modo che ogni 5 minuti che passano la variabile aumenti di 1, però il conto del tempo ho bisogno che lo tenga il master perchè: se 3 led accesi rappresentano la lancetta lunga e 2 la lancetta corta, io ho fatto in modo che i 2 che rappresentano le ore siano collegati a un pin e l’altro ad un pin separato. Se vuoi contattarmi privatamente puoi mandare l’amicizia su skipe, sono mangiafuoco98

@Uwefed:

Ti ringrazio per la risposta. Molto interessante la gestione con l’array. La comunicazione con lo slave avviene quando tramite il pin13 mando un valore HIGH allo slave (il pin 13 è collegato al 13 dello slave che se noti è definito come input) e nel momento in cui lo slave riceve un valore HIGH incrementa la variabile x di 1 e in questo modo tiene il conto di quante volte sono passati 5 minuti nell’arco dell’ora. Una volta che la variabile x dello slave raggiunge 12 deve riazzerarsi per poi ripartire da capo il giro, o almeno…quella era l’idea…
Se vuoi contattarmi privatamente puoi mandare l’amicizia su skipe, sono mangiafuoco98

Grazie a tutti, ciao Uwe

Ciao mangiafuoco99

Ti ho indicato la via, sei Tu che devi percorrerla. Credo che sia la via dove impari di piú.

Scriverti i Sketch non Ti fa imparare. Evito contatti personali perché cosí avrai solo risposte da me e non da tutti. Non sono un mago nella programmazione e non é detto che io trovo a soluzione migliore per risolvere il problema. Percui preferisco la comunicazione sul forum leggibile e participabile a tutti.

Il problema principale perché i 2 Arduini non comunicano é che non hai definito il pin 13 del Arduino Master come uscita. Un altro problema che vrrá fuori é che usi il pin 1 per i LED. Questo pin é usato per la comunicazione seriale e percui per l' upload dello Sketch. I pin analogici possono essere usati come Pin digitali e percui usa il PIN A0 (col numero 14).

Ciao Uwe

ti ringrazio uwe per i suggerimenti. Proverò a metterli in pratica e a cercare di risolvere i problemi uno per volta... Ci potrò lavorare solo la prox settimana e credo che avrò bisogno di qualche altro consiglio se sarai così gentile da aiutarmi XD Grazie ancora di avermi suggerito alcune parti dello sketch ;) Ciao Uwe

Io ho semplicemente riscritto in modo più corretto il codice che avevi postato. A parte il constrain che ho inserito interpretando male il tuo codice, non ho cambiato la logica del tuo programma.

Non mi piace discutere privatamente di questi argomenti, molto meglio il forum dove più persone posso risponderti affrontando il problema in modo diverso e dando varie soluzioni.

Per effettuare una rotazione il codice è

if (minuti > 12) minuti = 1;

e se io usassi questa formula per mantenere la variabile x tra 1 e 12? secondo voi potrebbe andare?

if (minuti>=1 && minuti<=12)

mangiafuoco99:
e se io usassi questa formula per mantenere la variabile x tra 1 e 12? secondo voi potrebbe andare?

if (minuti>=1 && minuti<=12)

mah… è il “concetto” di base che devi afferrare ]:smiley:
se x non vuoi che superi 12 e ti sta bene che prende il valore zero
if (minuti > 12) x = 0 ;
se x non vuoi che va sotto l’uno e ti sta bene che prende il valore 1

if (minuti<1) x = 1 ;