sabato 25 giugno 2016

TUTORIAL: Comando relè a distanza via web

Comando a distanza dei relè iniziamo ad impostare il progetto.

Difficoltà Media

Ed ecco un progettino molto simpatico , che oltre ad avere uno scopo didattico è anche molto utile. Spesso capita di essere fuori casa e
si ha la necessità di accendere o spegnere qualcosa come un irrigatore, il riscaldamento o semplicemente le luci per simulare la nostra presenza. Come fare? Semplice possiamo in breve tempo realizzare un oggetto che possa soddisfare le nostre esigenze utilizzando Arduino oppure la nostra piattaforma EtaBeta IDEA ,con una ethernet shield .

Elenco del materiale occorrente utilizzando ARDUINO:
  • n°1 Scheda ARDUINO 2009 / UNO (acquistabile qui)
  • n°1 Shield Arduino Ethernet (acquistabile qui)
  • n°1 MicroSD da inserire nella Ethernet Shield
  • n°1 Breadbord bella capiente (acquistabile qui)
  • n°2 Relè a 5Vdc di tensione bobina tipo OMRON G5LA-14 (acquistabile qui)
  • n°2 Pulsanti tattili switch (acquistabili qui)
  • n°2 Resistenze da 1.5K
  • n°4 Resistenze da 1K
  • n°2 Transistor BC337
  • n°2 Diodi 1N4148
  • Cavo vari colori per breadboard
  • n°1 Cavo di rete LAN
  • n°1 Cavo USB
Elenco del materiale occorrente utilizzando ETABETAIDEA:
  • n°1 Scheda EtaBeta IDEA
  • n°1 Shield Arduino Ethernet (acquistabile qui)
  • n°1 MicroSD da inserire nella Ethernet Shield
  • n°1 Cavo di rete LAN
  • n°1 Cavo USB
Per chi utilizza Arduino iniziamo a collegare tutti i componenti che ci occorrono sulla breadboard come da schema:


Figura 1




Mentre con ETABETA IDEA occorre solo abilitare 2 switch button ed i 2 relè configurando i dip switch DS1 e DS2 come in foto:

Figura 2

Prima di tutto bisogna analizzare in dettaglio il progetto, mentre con la board studio EtaBeta IDEA abbiamo tutto l'occorrente per poter iniziare a scrivere il nostro bel firmware, con Arduino dobbiamo cimentarci in qualche collegamento elettronico. 

Seguiamo i collegamenti come in Figura 1 posizionando prima i due pulsanti che ci permetteranno di azionare localmente i relè sulla breadboard con le rispettive resistenze di  pull-down da 1KOhm che permettono di rendere stabile il libello logico di segnale alla pressione del pulsante, poi posizioniamo i due relè. 

Per il progetto abbiamo usato due relè della omron facilmente reperibili sul mercato, con tensione alla bobina di 5Vdc. Per comandare i due relè ed evitare che possano danneggiare il micro della nostra board inseriamo due bei classici transistor BC337 NPN (nella configurazione CBE: Collettore - Base - Emettitore). 

Grazie al transistor possiamo comandare il relè con una bassa corrente di base. 

Al transistor va aggiunta una resistenza da 1K Ohm verso massa tra base ed emettitore, mentre una resistenza di 1,5K Ohm tra base e uscita del micro.

Colleghiamo quindi la nostra Ethernet Shield su Arduino oppure su ETABETA IDEA. 

Iniziamo a scrivere lo sketch

Apriamo la nostra IDE di programmazione Arduino ed iniziamo ad includere le librerie che utilizzeremo per il nostro progetto:

1
2
3
#include <String.h>  
#include <SPI.h>  
#include <Ethernet.h>  

A questo punto occorre configurare i parametri di rete per accedere alla nostra applicazione, prima di far questo lanciamo un ping per verificare che l'indirizzo che vogliamo utilizzare sia libero in rete. Fatto questo continuiamo a scrivere il nostro codice: 


1
2
3
4
5
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };     //Mac address ethernet shield 
byte ip[] = { 192, 168, 1, 50 }; // indirizzo IP assegnato alla shield  
byte gateway[] = { 192, 168, 1, 1 }; // indirizzo ip del router  
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask  
EthernetServer server(80);   //porta configurata sul router per collegarsi alla scheda anche in remoto

Continuiamo con il dichiarare tutte le variabili che ci occorrono:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
int reading1; 
int reading2;  

int rele1 = 7; // pin collegato al relè 1
int rele2 = 8; // pin collegato al relè 2
const int buttonPin1 = 5;    // Pin Button1 su ETA
const int buttonPin2 = 6;    // Pin Button2 su ETA
String readString;
int staterel1 = LOW;         // stato del relè all'accensione 
int staterel2 = LOW;         // stato del relè all'accensione
int buttonState1;             // leggere valore del pulsante dall'ingresso
int buttonState2;             // leggere valore del pulsante dall'ingresso
int aggiorna;                //variabile di aggiornamento di stato dei relè
int lastButtonState1 = LOW;   // stato del pulsante 1 all'accensione
int lastButtonState2 = LOW;   // stato del pulsante 2 all'accensione


long lastDebounceTime1 = 0;  // tempo di commutazione del pulsante 1
long lastDebounceTime2 = 0;  // tempo di commutazione del pulsante 2
long debounceDelay1 = 50;    // tempo di debounce
long debounceDelay2 = 50;    // tempo di debounce

Vediamo ora come impostare la parte del void setup  che contiene tutte le inizializzazioni di sistema, dalla parte di rete, il pin-out per finire all'inizializzazione della seriale:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
void setup(){  
Ethernet.begin(mac, ip, gateway, subnet);  //inizializzare la ethernet shield
pinMode(rele1, OUTPUT);      // Impostare relè 1 come output
pinMode(rele2, OUTPUT);      // Impostare relè 2 come output
  pinMode(buttonPin1, INPUT);      // Impostare pulsante 1 come input
  pinMode(buttonPin2, INPUT);      // Impostare pulsante 2 come input
    digitalWrite(rele1, staterel1);      //stato relè 1
  digitalWrite(rele2, staterel2);        //stato relè 1
Serial.begin(9600);                  //inizializzare seriale
}  

Nella parte successiva quella del void loop si andrà sia a leggere lo stato dei pulsanti che costruire la parte web in html dove sarà possibile inviare i comandi.


Il codice completo dello Sketch



  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
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
/*
 * Tutorial comando a distanza rele' con shield 
 *
 * Acqua - Pinto 
 * https://etabetastudio.blogspot.com
 */

#include <String.h>  
#include <SPI.h>  
#include <Ethernet.h>  
  
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };     //Mac address ethernet shield 
byte ip[] = { 192, 168, 1, 50 }; // indirizzo IP assegnato alla shield  
byte gateway[] = { 192, 168, 1, 1 }; // indirizzo ip del router  
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask  
EthernetServer server(80);   //porta configurata sul router per collegarsi alla scheda anche in remoto
int reading1; 
int reading2;  

int rele1 = 7; // pin collegato al relè 1
int rele2 = 8; // pin collegato al relè 2
const int buttonPin1 = 5;    // Pin Button1 su ETA
const int buttonPin2 = 6;    // Pin Button2 su ETA
String readString;
int staterel1 = LOW;         // stato del relè all'accensione 
int staterel2 = LOW;         // stato del relè all'accensione
int buttonState1;             // leggere valore del pulsante dall'ingresso
int buttonState2;             // leggere valore del pulsante dall'ingresso
int aggiorna;                //variabile di aggiornamento di stato dei relè
int lastButtonState1 = LOW;   // stato del pulsante 1 all'accensione
int lastButtonState2 = LOW;   // stato del pulsante 2 all'accensione


long lastDebounceTime1 = 0;  // tempo di commutazione del pulsante 1
long lastDebounceTime2 = 0;  // tempo di commutazione del pulsante 2
long debounceDelay1 = 50;    // tempo di debounce
long debounceDelay2 = 50;    // tempo di debounce


void setup(){  
Ethernet.begin(mac, ip, gateway, subnet);  //inizializzare la ethernet shield
pinMode(rele1, OUTPUT);      // Impostare relè 1 come output
pinMode(rele2, OUTPUT);      // Impostare relè 2 come output
  pinMode(buttonPin1, INPUT);      // Impostare pulsante 1 come input
  pinMode(buttonPin2, INPUT);      // Impostare pulsante 2 come input
    digitalWrite(rele1, staterel1);      //stato relè 1
  digitalWrite(rele2, staterel2);        //stato relè 1
Serial.begin(9600);                  //inizializzare seriale
}  
  
void loop(){ 
 
 // Procedura x creazione pagina web ed attivare i relè in remoto 
EthernetClient client = server.available();  //richiesta del client della pagina web
if (client) {  
 boolean currentLineIsBlank = true;   //  se la variabile currentLineIsBlank è nicazione con il client   
 while (client.connected()) {   //Verificare la comunicazione cliet/server 
 if (client.available()) {  
 char c = client.read();  
 readString.concat(c);   
   
 if (c == '\n' && currentLineIsBlank) {  
   
 Serial.print(readString); //Legge la stringa inviata via web  
   
 if(readString.indexOf("RELE1ON") > 0 ) {    // Attivazione remota del relè 1
   
 digitalWrite(rele1, HIGH);   
staterel1 = HIGH;
 }

 
if(readString.indexOf("RELE1OFF") > 0) {  // Disattivazione remota del relè 1
   
 digitalWrite(rele1, LOW);   
staterel1 = LOW;

 }
if(readString.indexOf("RELE2ON") > 0 ) {  //Attivazione remota del relè 2
   
 digitalWrite(rele2, HIGH);   
staterel2 = HIGH;
 }

 
if(readString.indexOf("RELE2OFF") > 0 ) {  // Disattivazione remota del relè 2
   
 digitalWrite(rele2, LOW);   
staterel2 = LOW;
 }   
 client.println("HTTP/1.1 200 OK");  //Standard HTML
 client.println("Content-Type: text/html");  
 client.println();  
 client.print("<html><head><title>ETA BETA STUDIO WEB CONTROL ARDUINO IDEA</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body>");   
 client.print("<h2><a href='/?RELE1ON=1'>RELE1ON</a> | <a href='/?RELE1OFF=1'>RELE1OFF</a></h2>");     //tasti di attivazione/disattivazione relè 1 
 client.println("</body></html>");
 client.print("<h2><a href='/?RELE2ON=1'>RELE2ON</a> | <a href='/?RELE2OFF=1'>RELE2OFF</a></h2>");    //tasti di attivazione/disattivazione relè 2
 client.println("</body></html>"); 
 readString="";  
 client.stop();  
  
 }   
 }   
 }   
}
// Procedura di attivazione dei relè in locale
   reading1 = digitalRead(buttonPin1);
if (reading1 != lastButtonState1) {
    //delay(10);
    lastDebounceTime1 = millis();
   
    }
     if ((millis() - lastDebounceTime1) > debounceDelay1) {
    debounce();   // richiamo alla funzione debounce per il tasto 1
    }
  
  digitalWrite(rele1, staterel1);
  lastButtonState1 = reading1;

   
   reading2 = digitalRead(buttonPin2);
if (reading2 != lastButtonState2) {
    lastDebounceTime2 = millis();
   
    }
     if ((millis() - lastDebounceTime2) > debounceDelay2) {
    debounce2(); // richiamo alla funzione debounce per il tasto 2
    }
  
  digitalWrite(rele2, staterel2);
  lastButtonState2 = reading2;
}


void debounce(){

    if (reading1 != buttonState1) {
      buttonState1 = reading1;

      if (buttonState1 == HIGH) {
        staterel1 = !staterel1;
        if (staterel1 == HIGH){
    aggiorna = 1;
      }
      else{
  aggiorna = 0;
        }
    }
  }
}


void debounce2(){

    if (reading2 != buttonState2) {
      buttonState2 = reading2;

      if (buttonState2 == HIGH) {
        staterel2 = !staterel2;
        if (staterel2 == HIGH){
    aggiorna = 1;
      }
      else{
  aggiorna = 0;
        }
    }
  }
}

Nessun commento:

Posta un commento