Dopo un po di sbattimento ho pensato a questo.. (ho incluso dei serial print per seguire passo passo l'evoluzione del codice)
int contatore;
int stato;
void setup(){
pinMode(6, OUTPUT);
stato = 0;
void loop(){
if(readString.startsWith("GET /manda_impulso")) {
Serial.println("stato inziale");
Serial.println(stato);
if (stato == 0) {
contatore = millis()+600;
digitalWrite(6, HIGH);
stato++;
Serial.println("stato dopo uscita alta");
Serial.println(stato);
Serial.println("tempo (millis)");
Serial.println(millis());
Serial.println("tempo incrementato (contatore)");
Serial.println(contatore);
}
}
if (stato == 1) {
if (millis()<contatore) {
digitalWrite(6, LOW);
stato--;
Serial.println("stato dopo uscita bassa");
Serial.println(stato);
}
}
Dal serial monitor esce questo:
GET /manda_impulso HTTP/1.1
stato inziale
0
stato dopo uscita alta
1
tempo (millis)
11309
tempo incrementato (contatore)
11864
stato dopo uscita bassa
0
Quindi la logica fila, il codice sembra fare quello che serve, ma il risultato non si vede...
E' come se fosse che quel ritardo di 600 millisecondi non venga preso in considerazione.
Infatti la cosa assurda è che se metto 600, 1000, o 60000 non cambia nulla,o meglio cambia solo sul serialmonitor, ma il led che uso per simulare l'impulso resta acceso per pochissimo.. diciamo che si accende e si spegne subito dopo, indifferentemente dall'intervallo di tempo che gli fornisco...
Mi sa che il millis non funziona così. Come se quel 600 non lo riconoscesse come una pausa...
Mi sapete dire come mai?
P.S.
Ripensandoci meglio, e pensando alla natura multistasking del millis(), forse credo che sia naturale che così non possa funzionare...
Scrivendo una cosa del genere:
if(readString.startsWith("GET /manda_impulso")) {
digitalWrite(5, HIGH);
delay(600);
digitalWrite(5, LOW);
}
Funziona perchè il delay() è proprio un interrupt, che apunto interrompe completamente il loop.
Dall'altro lato il millis, non interrompe niente di per se, conta e basta, quindi mentre lui conta, il loop va avanti, setta immediatamente lo stato=1 perchè l'uscita è andata alta, e non aspetta i 600 ms...
Questo if : if (millis()<contatore) {
doveva fare appunto quello, ma mi sa che non lo fa .
Che dite?
Ci sto sbattendo la testa da un po di tempo..
Voi dite che è semplice..
Ma a me non sembra proprio.