![]() |
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