Ciao a tutti, questo è il mio primo post, sto giocando con Arduino da pochi giorni e scrivo perchè ho qualche dubbio su quello che ho scritto.
Ho utilizzato Arduino 2009 con ATmega328, il codice funziona e fa quello che volevo facesse: si tratta di un semaforo doppio (all'incrocio fra due strade) con il verde acceso per 14 secondi, il giallo per 2 e il rosso per 14 per un totale di 30 secondi a loop; i semafori sono due e sono sincronizzati per evitare incidenti. La durata totale l'ho impostata a 18 ore - come se di notte ad una certa ora staccasse (da qui l'uso del count che "spegne" l'esecuzione del codice) e si accendesse il giallo lampeggiante nelle restanti sei ore (insomma come un semaforo simile alla realtà).
/*
SEMAFORO DOPPIO:
S1 VERDE & S2 ROSSO
S1 GIALLO & S2 ROSSO
S1 ROSSO & S2 VERDE
S1 ROSSO & S2 GIALLO
loop
*/
//S1
#define ledGreen1 11
#define ledYellow1 12
#define ledRed1 13
//S2
#define ledGreen2 8
#define ledYellow2 9
#define ledRed2 10
int count=0;
void setup() {
//SEMAFORO 1
pinMode(ledGreen1, OUTPUT);
pinMode(ledYellow1, OUTPUT);
pinMode(ledRed1, OUTPUT);
//SEMAFORO 2
pinMode(ledGreen2, OUTPUT);
pinMode(ledYellow2, OUTPUT);
pinMode(ledRed2, OUTPUT);
}
void loop()
{
if(count<=2160)
{ //18 ORE * 60 MINUTI *2CICLI/MINUTO = 2160 CICLI
digitalWrite(ledGreen1, HIGH); //S1 VERDE
digitalWrite(ledRed2, HIGH); //S2 ROSSO
delay(14000);
digitalWrite(ledGreen1, LOW);
digitalWrite(ledYellow1, HIGH); //S1 GIALLO
digitalWrite(ledRed2, HIGH); //S2 ROSSO
delay(2000);
digitalWrite(ledRed2, LOW);
digitalWrite(ledYellow1, LOW);
digitalWrite(ledRed1, HIGH); //S1 ROSSO
digitalWrite(ledGreen2, HIGH); //S2 VERDE
delay(14000);
digitalWrite(ledRed1, HIGH); //S1 RIMANE ALTRI DUE SECONDI SUL ROSSO
digitalWrite(ledGreen2, LOW); //S2 SPEGNE IL VERDE...
digitalWrite(ledYellow2, HIGH); //S2 ACCENDE IL GIALLO PER DUE SECONDI
delay(2000);
digitalWrite(ledRed1, LOW); //S1 SPEGNE IL ROSSO, FINE LOOP -> VERDE (START LOOP)
digitalWrite(ledYellow2, LOW); //S2 SPEGNE IL GIALLO, FINE LOOP -> ROSSO (START LOOP)
count++;
}
}
domande:
1-come si potrebbe scrivere il codice in maniera più fluida e meno grezza come ho fatto io?
2-ho letto nel forum che spesso e volentieri è meglio usare millis piuttosto che delay, è possibile farlo anche in questo esempio considerando che l'intervallo di tempo per i tre led non è lo stesso? facendo due #define magari in questa maniera?
#define time1 14000 //Intervallo di tempo ROSSO E VERDE
#define time2 2000 //Intervallo di tempo ROSSO E GIALLO
long previousMills = 0;
.
.
void loop()
{
if (millis() - previousMills > time1 ){
previousMills = millis();
//Se il LED è spento lo accende e viceversa
if (value == LOW)
value = HIGH;
else
value = LOW;
digitalWrite(ledPin1, value);
}
void loop()
{
if (millis() - previousMills > time2 ){
previousMills = millis(); //Tiene in memoria l'ultimo lampeggio
if (value == LOW)
value = HIGH;
else
value = LOW;
digitalWrite(ledPin2, value);
}
quello di sopra è solo una idea, dovrei capire come adattarlo al mio problema, devo ancora capire come ragiona il millis() rispetto al delay col quale non ho problemi
p.s: la parte finale del codice sarebbe la seguente
if((count>2160)&&(count<218160))
{ //6 ORE * 60 MINUTI *60CICLI/MINUTO =216000 CICLI IN SEI ORE
digitalWrite(ledYellow1, HIGH); // set the LED on
digitalWrite(ledYellow2, HIGH); // set the LED on
delay(500); // wait for a second
digitalWrite(ledYellow1, LOW); // set the LED on
digitalWrite(ledYellow2, LOW); // set the LED on
delay(500);
count++;
}
questa simula il giallo lampeggiante da mezzo secondo per sei ore a partire dalla fine delle 18 ore di verde, giallo, rosso
grazie per l'attenzione
so che potrei suscitare le vostre risate ma sono alle prime armi, abbiate pietà, ogni suggerimento è bene accetto
Tsu