![]() |
Difficoltà Media |
Come utilizzare l'istruzione millis?
Spesso il miglior modo per apprendere è fissarsi un obiettivo, un progetto.
In questo tutorial realizzeremo un temporizzatore. Cosa possiamo fare ?
Per esempio comandare un relè che attiva una luce a tempo oppure un sistema di irrigazione.
Cosa occorre oltre la buona volontà, vediamo:
Elenco del materiale occorrente utilizzando ARDUINO:
- n°1 Scheda ARDUINO 2009 / UNO (acquistabile qui)
- n°1 Breadbord bella capiente (acquistabile qui)
- n°1 Relè a 5Vdc di tensione bobina tipo OMRON G5LA-14 (acquistabile qui)
- n°1 Pulsanti tattili switch (acquistabili qui)
- n°1 Resistenze da 1.5K
- n°2 Resistenze da 1K
- n°1 Transistor BC337
- n°1 Diodi 1N4148
- Cavi vari colori per breadboard
- n°1 Cavo USB
Elenco del materiale occorrente utilizzando ETABETA EDI:
- n°1 Scheda EtaBeta IDEA
- n°1 Cavo USB
Come prima cosa realizziamo i collegamenti elettrici come da figura 1 per chi usa Arduino.
![]() |
Figura 1 |
Per ETA BETA EDI non occorre far nulla se non abilitare 1 switch button (BTN1) ed 1 relè (REL1) configurando i dip switch DS1 e DS2 come in figura 2:
![]() |
Figura 2 |
Fatto?
Perfetto! Ora possiamo dedicarci alla scrittura del nostro sketch.
Una precisazione, perché usare l'istruzione "millis" e non un bel mitico "delay" per ritardare il comando del relè?
Il comando "delay" è un vero e proprio blocco dove il codice si ferma in quel punto senza che accada nulla , il micro durante il delay non fa nulla se non aspettare. Questo è un male perchè nella condizione d'attesa tutto quello che succede fuori al micro non interessa.
Faccio un esempio per rendere l'idea: Supponiamo di usare il nostro micro per creare un sistema di fotocellule dove la durata d'apertura del cancello è data da un delay da 10000 (10"). Con questo delay tutto ciò che passa davanti alle fotocellule non viene considerato ed è un rischio enorme da evitare. Mentre con il comando millis ciò non avviene il codice gira bello veloce con un loop da gran premio. Basta solo scandire i secondi e con qualche if possiamo creare le condizioni d'attesa che vogliamo in tutta tranquillità.
Passiamo ad analizzare il codice completo leggendo i commenti.
Una precisazione, perché usare l'istruzione "millis" e non un bel mitico "delay" per ritardare il comando del relè?
Il comando "delay" è un vero e proprio blocco dove il codice si ferma in quel punto senza che accada nulla , il micro durante il delay non fa nulla se non aspettare. Questo è un male perchè nella condizione d'attesa tutto quello che succede fuori al micro non interessa.
Faccio un esempio per rendere l'idea: Supponiamo di usare il nostro micro per creare un sistema di fotocellule dove la durata d'apertura del cancello è data da un delay da 10000 (10"). Con questo delay tutto ciò che passa davanti alle fotocellule non viene considerato ed è un rischio enorme da evitare. Mentre con il comando millis ciò non avviene il codice gira bello veloce con un loop da gran premio. Basta solo scandire i secondi e con qualche if possiamo creare le condizioni d'attesa che vogliamo in tutta tranquillità.
Passiamo ad analizzare il codice completo leggendo i commenti.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | /* Tutorial Luce Temporizzata con comando locale e remoto via web * * http://etabetastudio.blogger.com * * Pinto Massimo - Chistian Acqua */ const int buttonPin = 5; // pin dello switch button const int ledPin = 13; // pin del led di segnalazione const int relPin = 13; // pin del rele int buttonState = 0; // stato switch int ledrelon = 0; //stato led e rele unsigned long conteggio = 120000; // durata temorizzazioni in millisecondi unsigned long previsioneMillis=0; // variabili di inizio e fine conteggio unsigned long correntiMillis=0; // variabili di inizio e fine conteggio void setup(){ Serial.begin(9600); // inizializziamo la seriale pinMode(ledPin, OUTPUT); //inizializziamo i pin pinMode(relPin, OUTPUT); //inizializziamo i pin pinMode(buttonPin, INPUT);//inizializziamo i pin digitalWrite(ledPin, LOW);//inizializziamo i pin } void loop(){ unsigned long correntiMillis = millis(); // memorizziamo il valore di millis buttonState = digitalRead(buttonPin); catturiamo lo stato dello switch button // Se lo Switch button è alto if (buttonState == HIGH) { Serial.println("bottone giu"); // facciamo un po di stampe per capire cosa succede ledrelon = 1; // abilitiamo l'ingresso alla condizione successiva previsioneMillis = correntiMillis + conteggio; // creiamo il valore di off sommando i millis catturati prima + il tempo impostato di off Serial.print("correntiMillis: "); // facciamo un po di stampe per capire cosa succede Serial.println(correntiMillis); // facciamo un po di stampe per capire cosa succede Serial.print("previsioneMillis: "); // facciamo un po di stampe per capire cosa succede Serial.println(previsioneMillis); // facciamo un po di stampe per capire cosa succede } if(ledrelon == 1){ digitalWrite(ledPin, HIGH); // accendiamo il led digitalWrite(relPin, HIGH); // eccitiamo il rele delay(500); // questo delay non è fondamentale serve a leggere le stampe sul serial monitor Serial.print("correntiMillis: "); Serial.println(correntiMillis); if (correntiMillis >= previsioneMillis) { delay(10); digitalWrite(ledPin, LOW); // raggiunto il tempo di spegnimento tutto va giù digitalWrite(relPin, LOW); ledrelon = 0; // reimpostiamo ledrelon per iniziare nuvamente un ciclo } } } |
Buon test a tutti.
Nessun commento:
Posta un commento