Ho 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

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

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

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

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

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(“&nbsp;”);
}
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

La casa di DoMina

Per ora tutto funziona a dovere.

Devo solo trovare una scatola elegante dove mettere tutto quanto.