DoMina – la domotica in salsa mia
aprile 26th, 2013Ho una scheda Arduino, uno shield ethernet per Arduino e una scheda con 4 relè compatibile con Arduino.
Facile! Comando i relè dal web.
E’ la prima parte di un progetto più ampio che forse non porterò mai a termine, e quindi non va ne parlerò. Comunque volevo avere i relè pilotabili da una pagina web quindi, in un contesto più ampio, si potrebbe anche parlare di domotica. L’ho chiamato DoMina da DOmotica e dj MINAccia, il mio alter-ego musicale.
Lo scheda che ho fatto è questo:

Schema di principio
E’ molto semplice: a sinistra c’è una fotoresistenza (per misurare l’intensità della luce) e una LM35 (per misurare la temperatura). A destra ci sono i 4 relè e 4 pulsanti. I pulsanti li ho implementato nel caso qualcuno con un cellulare del medioevo non riesco ad accedere alla paginetta web di controllo ma che comunque abbia il desiderio di attivarne qualcuno.
Foto del primo prototipo
Per essere più professionale poi mi sono fatto anche lo stampato per essere usato come shield autoprodotto per Arduino:
Circuito stampato
Nello stampato ho aggiunto un pulsante in più non presente nello schema precedente. Col pulsante, i contatti sono quei due in basso a sinistra, servono per il reset di Arduino perchè non chiedetemene il motivo, quando dai corrente ad Arduino non carica la parte relativa alla rete, dopo un reset riparte tutto. Non so se dipende dal fatto che sia il mio Arduino che l’Ethernet Shield siano vecchi e danno problemi con le librerie aggiornate, comunque ho risolto così
Ed ecco tutto l’ambaradan montato e funzionante:
Tutto montato e funzionante
Una volta collegato alla rete si può accedere all’apposita pagina web per accendere o spegnere i relè e controllare i valori dei sensori. E’ compatibile con qualsiasi device dotato di browser, in questo caso un Kindle
Pagina di controllo su Kindle
Il codice è un mischione di vari parti di codice copiati qua e la o scritti da me in passato, adesso non mi ricordo esattamente tutte le provenienze ma parecchio viene dagli sketch di esempio di Arduino (in particolare per la parte web).
Ecco il codice:
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192,168,200,5);
EthernetServer server(80);
String readString;int releA = 6;
int statoA = 0;
int releB = 7;
int statoB = 0;
int releC = 8;
int statoC = 0;
int releD = 9;
int statoD = 0;
int pinT = 0;
int pinL = 1;
float tempc = 0;
int lux = 0;
int sample[8];
int i;
int valA = 0;
int switchA = 2;
int valB = 0;
int switchB = 3;
int valC = 0;
int switchC = 4;
int valD = 0;
int switchD = 5;void setup(){
Serial.begin(9600);
Ethernet.begin(mac, ip);
pinMode(releA, OUTPUT);
digitalWrite(releA, HIGH);
pinMode(releB, OUTPUT);
digitalWrite(releB, HIGH);
pinMode(releC, OUTPUT);
digitalWrite(releC, HIGH);
pinMode(releD, OUTPUT);
digitalWrite(releD, HIGH);
pinMode(switchA, INPUT);
pinMode(switchB, INPUT);
pinMode(switchC, INPUT);
pinMode(switchD, INPUT);
}void loop(){
valA = digitalRead(switchA);
if (valA == HIGH){
if(statoA == 0){
digitalWrite(releA, LOW);
statoA = 1;
delay(200);
}else if(statoA == 1){
digitalWrite(releA, HIGH);
statoA = 0;
delay(200);
}
}
valB = digitalRead(switchB);
if (valB == HIGH){
if(statoB == 0){
digitalWrite(releB, LOW);
statoB = 1;
delay(200);
}else if(statoB == 1){
digitalWrite(releB, HIGH);
statoB = 0;
delay(200);
}
}
valC = digitalRead(switchC);
if (valC == HIGH){
if(statoC == 0){
digitalWrite(releC, LOW);
statoC = 1;
delay(200);
}else if(statoC == 1){
digitalWrite(releC, HIGH);
statoC = 0;
delay(200);
}
}
valD = digitalRead(switchD);
if (valD == HIGH){
if(statoD == 0){
digitalWrite(releD, LOW);
statoD = 1;
delay(200);
}else if(statoD == 1){
digitalWrite(releD, HIGH);
statoD = 0;
delay(200);
}
}EthernetClient client = server.available();
if (client) {
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
readString.concat(c);if (c == ‘\n’ & currentLineIsBlank) {
Serial.print(readString);
client.println(“HTTP/1.1 200 OK”);
client.println(“Content-Type: text/html”);
client.println(“Connection: close”);
client.println();
client.println(“<!DOCTYPE HTML>”);
client.println(“<html>”);
client.println(“<head><title>DoMina</title>”);
client.println(“<meta charset=utf-8>”);// A
if(readString.indexOf(“A=1″) > 0){
digitalWrite(releA, LOW);
Serial.println(“acceso”);
client.println(“<meta http-equiv=\”refresh\” content=\”0; url=http://192.168.200.5 \”/>”);
statoA = 1;
break;
}else
if(readString.indexOf(“A=0″) > 0){
digitalWrite(releA, HIGH);
Serial.println(“spento”);
client.println(“<meta http-equiv=\”refresh\” content=\”0; url=http://192.168.200.5 \”/>”);
statoA = 0;
break;
}//B
if(readString.indexOf(“B=1″) > 0){
digitalWrite(releB, LOW);
Serial.println(“acceso”);
client.println(“<meta http-equiv=\”refresh\” content=\”0; url=http://192.168.200.5 \”/>”);
statoB = 1;
break;
}else
if(readString.indexOf(“B=0″) > 0){
digitalWrite(releB, HIGH);
Serial.println(“spento”);
client.println(“<meta http-equiv=\”refresh\” content=\”0; url=http://192.168.200.5 \”/>”);
statoB = 0;
break;
}//C
if(readString.indexOf(“C=1″) > 0){
digitalWrite(releC, LOW);
Serial.println(“acceso”);
client.println(“<meta http-equiv=\”refresh\” content=\”0; url=http://192.168.200.5 \”/>”);
statoC = 1;
break;
}else
if(readString.indexOf(“C=0″) > 0){
digitalWrite(releC, HIGH);
Serial.println(“spento”);
client.println(“<meta http-equiv=\”refresh\” content=\”0; url=http://192.168.200.5 \”/>”);
statoC = 0;
break;
}//D
if(readString.indexOf(“D=1″) > 0){
digitalWrite(releD, LOW);
Serial.println(“acceso”);
client.println(“<meta http-equiv=\”refresh\” content=\”0; url=http://192.168.200.5 \”/>”);
statoD = 1;
break;
}else
if(readString.indexOf(“D=0″) > 0){
digitalWrite(releD, HIGH);
Serial.println(“spento”);
client.println(“<meta http-equiv=\”refresh\” content=\”0; url=http://192.168.200.5 \”/>”);
statoD = 0;
break;
}client.println(“</head><body><div style=’font-family: arial; font-size: 2em; line-height: 2em; border: 5px solid #000; margin: 5px; padding: 5px;’>”);
client.println(“Temperatura: “);
for(i = 0; i < 7; i++){
sample[i] = (float)( 5.0 * analogRead(pinT) * 100.0) / 1024.0;
tempc = tempc + sample[i];
}client.print(tempc/8.00);
tempc=0;
client.print(“°”);client.println(“<br />”);
lux=analogRead(pinL);
client.println(“Luce: “);
client.println(“<span style=’background-color: #0ee;’>”);
client.println(lux);
for(i=0; i<((lux)/100); i++){
client.println(“ ”);
}
client.println(“</span>”);
lux=0;//A
client.println(“<br /><b>Relè A: </b>”);
if(statoA == 0){
client.println(“<span style=’color:grey; font-weight:bold;’>OFF</span> – “);
client.println(“<a href=\”?A=1\”>Accendi</a> | “);
}else if(statoA ==1){
client.println(“<span style=’color:green; font-weight:bold;’>ON</span> – “);
client.println(“Accendi | “);
}
if(statoA == 0){
client.println(“Spegni”);
}else if(statoA ==1){
client.println(“<a href=\”?A=0\”>Spegni</a>”);
}//B
client.println(“<br /><b>Relè B: </b>”);
if(statoB == 0){
client.println(“<span style=’color:grey; font-weight:bold;’>OFF</span> – “);
client.println(“<a href=\”?B=1\”>Accendi</a> | “);
}else if(statoB ==1){
client.println(“<span style=’color:green; font-weight:bold;’>ON</span> – “);
client.println(“Accendi | “);
}
if(statoB == 0){
client.println(“Spegni”);
}else if(statoB ==1){
client.println(“<a href=\”?B=0\”>Spegni</a>”);
}//C
client.println(“<br /><b>Relè C: </b>”);
if(statoC == 0){
client.println(“<span style=’color:grey; font-weight:bold;’>OFF</span> – “);
client.println(“<a href=\”?C=1\”>Accendi</a> | “);
}else if(statoC ==1){
client.println(“<span style=’color:green; font-weight:bold;’>ON</span> – “);
client.println(“Accendi | “);
}
if(statoC == 0){
client.println(“Spegni”);
}else if(statoC ==1){
client.println(“<a href=\”?C=0\”>Spegni</a>”);
}//D
client.println(“<br /><b>Relè D: </b>”);
if(statoD == 0){
client.println(“<span style=’color:grey; font-weight:bold;’>OFF</span> – “);
client.println(“<a href=\”?D=1\”>Accendi</a> | “);
}else if(statoD ==1){
client.println(“<span style=’color:green; font-weight:bold;’>ON</span> – “);
client.println(“Accendi | “);
}
if(statoD == 0){
client.println(“Spegni”);
}else if(statoD ==1){
client.println(“<a href=\”?D=0\”>Spegni</a>”);
}//client.println(“<hr /><a href=\”/\”>Aggiorna</a>”);
client.println(“</div></body></html>”);
break;
}
if (c == ‘\n’){
currentLineIsBlank = true;
}else if (c != ‘\r’){
currentLineIsBlank = false;
}
}
}
readString=”";
delay(1);
client.stop();
}
}
Vabbè… si è perso tutta la formattazione nel copia e incolla ma se vi interessa vi mando via posta lo sketch.

La casa di DoMina
Per ora tutto funziona a dovere.
Devo solo trovare una scatola elegante dove mettere tutto quanto.

Per questo motivo ho creato Gestiolus.






