Buongiorno, ho creato questo semplice codice per temporizzare lo spegnimento di alcune luci accese tramite un sensore di presenza.
Ho usato il comando Millis per identificare l'istante di accensione delle luci, il problema è che la durata non è mai costante, varia anche di qualche secondo tra una volta e l'altra, quindi più del 20% 30%
Non capisco se sia un problema di codice oppure della scheda Arduino 3, adesso dovrebbe arrivarmi un'altra scheda e proverò
Vi allego il codice:
// Costanti:
const int Sensor1Pin = 2; // pin di ingresso sensore 1
const int Sensor2Pin = 3; // pin di ingresso sensore 2
const int Sensor3Pin = 4; // pin di ingresso sensore 3
const int intervallo = 12000; //intervallo di accensione faro dopo allarme (millisecondi)
// Variabili:
int FaroPin[] {10, 11, 12}; // pin di uscita dei fari
int Statoallarme[] {LOW, LOW, LOW}; // stato dei sensori
int cella = 0; // indicizzazione array Statoallarme e Millisensore
unsigned long Millisensor[] {0, 0, 0}; //istante di rivelazione allarme sensori
void setup() {
// inizializza Sensorpin come input:
pinMode(Sensor1Pin, INPUT);
pinMode(Sensor2Pin, INPUT);
pinMode(Sensor3Pin, INPUT);
// inizializza Faropin come output:
pinMode(FaroPin[0], OUTPUT);
pinMode(FaroPin[1], OUTPUT);
pinMode(FaroPin[2], OUTPUT);
}
void loop() {
// leggi stato ingresso sensori fino a quando non si verifica un allarme oppure fino a quando non è in atto ritardo accensione faro:
do {
Statoallarme[0] = digitalRead(Sensor1Pin);
Statoallarme[1] = digitalRead(Sensor2Pin);
Statoallarme[2] = digitalRead(Sensor3Pin);
} while (Statoallarme[0] == LOW & Statoallarme[1] == LOW & Statoallarme[2] == LOW & FaroPin[0] == LOW & FaroPin[1] == LOW & FaroPin[2] == LOW);
// verifica quali sensori sono in allarme e accendi faro
delay(20);
for (cella = 0 ; cella < 3 ; cella++) {
// assegna alla variabile Millis il tempo attuale
unsigned long Millis = millis();
if (Statoallarme[cella] == HIGH) {
// assegna alla variabile Millis[cella] l'istante di inizio allarme
Millisensor[cella] = Millis;
// accendi faro in allarme
digitalWrite (FaroPin[cella], HIGH);
}
// verifica se è passato l'intervallo di accensione del faro
if (Millis - Millisensor[cella] >= intervallo)
// spegni faro
digitalWrite (FaroPin[cella], LOW);
}
}
grazie