Arduino: luci in sequenza
Salve a tutto , ho in mente di realizzare un progetto e ho bisogno di aiuto per quanto riguarda il codice in Arduino .
Mi spiego : In casa ho una gradinata di circa 20 scale , rifacendo adesso il pavimento sto mettendo delle luci sui gradini , del tipo calpestabili . Quello che voglio fare è :
appena arrivo al primo gradino , attraverso una coppia di fotocellule si accende la luce del primo gradino e a intervalli regolari di circa 1s si accende il secondo e poi il terzo , cosi via fino all'ultimo gradino . Nel fare questa sequenza di luci dal terzo gradino in poi il primo inizia a spegnersi . In pratica rimarranno accesi 3 gradini che percorreranno tutta la gradinata fino alla fine .
Fin qui nessun problema , utilizzo un arduino ,demultiplexer e n relay .
Il problema è invece che voglio che questa operazione deve essere fatta anche se le scale vengono percore al senso contrario . Ovviamente il codice sarebbe lo stesso ma ciò che mi ha bloccato è il fatto che non riesco a far fare questa sequenza al mio arduino uno anche contemporaneamente . Questo perché Arduino inizia una sequenza ad esempio UP e non ascolta più input finché non finisce tale sequenza .
Quello che chiedo è un aiuto per far si che questa sequenza si avvii in qualsiasi momento uno passi attraverso la fotocellula , sia se una persona sta per salire le scale e allo stesso momento un'altra persona sta per scendere , sia se una persona si trova a metà gradinata salendo le scale e un'altra persona sta ora iniziando a salire le scale
Posto un esempio di codice ipotizzando 5 led come se fossero 5 delle scale .
Mi spiego : In casa ho una gradinata di circa 20 scale , rifacendo adesso il pavimento sto mettendo delle luci sui gradini , del tipo calpestabili . Quello che voglio fare è :
appena arrivo al primo gradino , attraverso una coppia di fotocellule si accende la luce del primo gradino e a intervalli regolari di circa 1s si accende il secondo e poi il terzo , cosi via fino all'ultimo gradino . Nel fare questa sequenza di luci dal terzo gradino in poi il primo inizia a spegnersi . In pratica rimarranno accesi 3 gradini che percorreranno tutta la gradinata fino alla fine .
Fin qui nessun problema , utilizzo un arduino ,demultiplexer e n relay .
Il problema è invece che voglio che questa operazione deve essere fatta anche se le scale vengono percore al senso contrario . Ovviamente il codice sarebbe lo stesso ma ciò che mi ha bloccato è il fatto che non riesco a far fare questa sequenza al mio arduino uno anche contemporaneamente . Questo perché Arduino inizia una sequenza ad esempio UP e non ascolta più input finché non finisce tale sequenza .
Quello che chiedo è un aiuto per far si che questa sequenza si avvii in qualsiasi momento uno passi attraverso la fotocellula , sia se una persona sta per salire le scale e allo stesso momento un'altra persona sta per scendere , sia se una persona si trova a metà gradinata salendo le scale e un'altra persona sta ora iniziando a salire le scale
Posto un esempio di codice ipotizzando 5 led come se fossero 5 delle scale .
- Codice: Seleziona tutto
int led1=1;
int led2=2;
int led3=3;
int led4=4;
int led5=5;
int fc1=A0; //fotocellula UP
int fc2=A1; //fotocellula DOWN
int fc1state;
int fc2state;
int t =1000;
void setup(){
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(led3,OUTPUT);
pinMode(led4,OUTPUT);
pinMode(led5,OUTPUT);
Serial.begin(9600);
}
void loop() {
fc1state=analogRead(fc1);
fc2state=analogRead(fc2);
if(fc1state<500)
up();
if(fc2state<500)
down();
}
void up(){
digitalWrite(led1,HIGH);
delay(t);
digitalWrite(led2,HIGH);
delay(t);
digitalWrite(led3,HIGH);
digitalWrite(led1,LOW);
delay(t);
digitalWrite(led4,HIGH);
digitalWrite(led2,LOW);
delay(t);
digitalWrite(led5,HIGH);
digitalWrite(led3,LOW);
delay(t);
digitalWrite(led4,LOW);
delay(t);
digitalWrite(led5,LOW);
}
void down(){
digitalWrite(led5,HIGH);
delay(t);
digitalWrite(led4,HIGH);
delay(t);
digitalWrite(led3,HIGH);
digitalWrite(led5,LOW);
delay(t);
digitalWrite(led2,HIGH);
digitalWrite(led4,LOW);
delay(t);
digitalWrite(led1,HIGH);
digitalWrite(led3,LOW);
delay(t);
digitalWrite(led2,LOW);
delay(t);
digitalWrite(led1,LOW);
}


inizio sequenza UP , inizio sequenza down