Ciao a tutti,
sono nuovo in Arduino, so gestire gli ingressi e le uscite anche analogiche, cicli while, for, condizioni if else e quant altro. Raramente anche gli interrupt.
Dovrei costruire un programmino che svolge determinate operazioni (alzare o abbassare un' uscita in funzione di un ingresso, qualche calcolo matematico), ma siccome l' arduino dovrà restare al lavoro anche per anni, vorrei che in tutto questo un LED lampeggi per indicarmi non solo che l' arduino è vivo, ma anche che il quarzo funziona.
Quindi la mia domanda è: come posso fare per svolgere un programma, con tutti i suoi delay e quant altro, mentre indipendentemente da tutto un led lampeggia 1 secondo ON e 1 OFF ?
Grazie a tutti
ok, più o meno ho capito, anche se credevo esistesse un metodo più "veloce", nel senso con meno codice. poi lo provo e vedo se riesco, in sostanza il mio programma è abbastanza complesso e non so sove inserire il codice "mio"
const int ledPin = 13; // the number of the LED pin
int ledState = 0; // ledState used to set the LED
unsigned long previousMillis = 0; //will store last time LED was updated
unsigned long interval = 1000; //interval at which to blink (milliseconds)
void setup() {
pinMode(ledPin, OUTPUT); //set the digital pin as output:
}
void loop() {
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis; //save the last time you blinked the LED
//if the LED is off turn it on and vice-versa:
ledState ^= 1;
digitalWrite(ledPin, ledState);
}
--> inizio a scrivere il mio codice a partire da qua?
}
Anche, basta che non è dentro l'if di controllo di millis() E' un semplice if d'altronde e qualche variabile, diciamo un po' complesso da digerire, ma niente di veramente complicato
E' la prima volta che vedo ledState ^= 1 quell' apice. significa INVERSIONE DI STATO LOGICO? (se prima era high passa a low o viceversa?)
Quando devo far lampeggiare un LED io di solito faccio una roba del genere:
digitalWrite(ledPin,!digitalRead(ledPin));
Magari non sarà né elegante né velocissima, però funziona, non richiede nessuna variabile d'appoggio e quello che fa si capisce al volo (per chi è un po' arrugginito come me è una gran bella cosa).
ciao!
pippettiello:
Quando devo far lampeggiare un LED io di solito faccio una roba del genere:digitalWrite(ledPin,!digitalRead(ledPin));
Magari non sarà né elegante né velocissima, però funziona, non richiede nessuna variabile d'appoggio e quello che fa si capisce al volo (per chi è un po' arrugginito come me è una gran bella cosa).
ciao!
come fai a leggere da una porta (ledPin) che è impostata in OUTPUT ????? se si può, a che serve allora dichiarare quali sono le porte di input e quali quelle di output?
io già sono sballato di mio, poi con questi trip mentali...
digitalRead() su un pin impostato in OUTPUT ritorna il valore che il pin ha attualmente. L'ultimo che si è impostato con digitalWrite(), insomma.
Anche se effettivamente funziona, non è che mi piacca molto, meglio mantenere lo stato attuale in una variabile in memoria.
con tutti i suoi delay
Ciao, occhio che i delay posti nel codice mandano a ramengo anche la millis(); Il delay essendo bloccante impedisce al codice di scorrere e quindi di confrontare ciclicamente le variabili di millis. Devi eliminare i delay e temporizzare tutto usando la millis();
Una alternativa può essere impostare il watchdog a 1 secondo in modalità interrupt e dentro la ISR invertire lo stato del pin del led.
L'opzione 1 rimane in ogni caso da preferire.
SukkoPera:
Anche se effettivamente funziona, non è che mi piacca molto, meglio mantenere lo stato attuale in una variabile in memoria.
Ciao sukko,
scusa, non per far polemica, lungi da me... sono il penultimo arrivato
Ma perché non ti piace? In fin dei conti è il metodo normale di manipolazione dei registri: lo leggi, lo modifichi e lo riscrivi.
A me sembra così comodo...
@konig87
"io già sono sballato di mio, poi con questi trip mentali... :-D"
Scusami, non volevo complicarti la vita. A me sembrava una buona idea.
Ciao.
Segui pure il consiglio di doppiozero