lunedì 4 luglio 2016

Tutorial: Luce temporizzata con comando locale, usando millis.

Difficoltà Media
Come temporizzare un'uscita di arduino?                                                            
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.


 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