Arduino – Bygg en multisensor till Vera.

Guiden visar hur enkelt det är att bygga egna multisensorer till Vera / Micasaverde med Arduino.

Har under några veckors tid kört en Arduino för att logga temperatur, luftfuktighet och ljus i ett rum hemma, informationen skickats till Veran via Ethernet. Detta möjliggör triggning av scenes, samt se aktuellt värde i Verans gränssnitt.

Arduinon har fungerat riktigt bra utan hängningar eller kommunikationsproblem.

Data rapporteras direkt till virtuella enheter i Vera via Ethernet (Enheterna skapas i Vera med följande guide). Data skickas med en fast intervall på var 5:e minut till Veran i min sketch.

Arduino-Givare2

 

 

 

 

 

Kommunikationen sker med Ethernet istället för Z-Wave.

 

Arduino-VeraGivare

 

 

Enheternas utseende i Vera

 

 

Jag kommer att byta DHT11 mot DS18B20 som temperaturgivare, eftersom dessa är mer exakta och går att ha flera på samma digitala port.

 

Komponenter:

 

Nyttjade portar på Arduino:

  • D10,D11,D12,D13 – Ethernet
  • D2 – Digital temperaturgivare
  • A0 – Ljussensor

Kopplingsschema:

DHT11

DHT11_Koppling

Pin 1 = 5 Volt Arduino

Pin 2 = Kopplas till Port 2 Arduinon. resistorn på 4,7K ohm kopplas mellan 5V och Port 2

Pin 3 = – Används ej

Pin 4 = Jord.

 

 

 

 

 LDR 

Arduino-LDR

Vänster sida av LDR kopplas till 5V på Arduino

Höger sida av LDR kopplas till A0 på Arduino,

på samma ben kopplas motståndet på 10K Ohm, resistorns högra ben kopplas mot jord.

 

 

 

Arduino-Givare2

 

 

 

 

 

 

Exempel på mitt färdigkopplade projekt. Snyggare paketering kommer att göras inom kort.

 

Arduino koden

Eftersom jag håller på att lära mig programmering med Arduino så får man ha överseende med koden! Det är en hel del klipp och klistra ännu tyvärr 🙂

För att kunna köra DHT11 så behövs ett extra library, mer info på Arduinos hemsida samt library finns att hämta på Github. biblioteket läggs sedan under ”Arduino-1.0.6\libraries\DHT11″  så vida du kör version 1.0.6, annars är det versionsnummet för din Arduino installation som gäller.

 

Jag har nyttjat Ehternet skissen som följer installationen av Arduino programvara, dock så har jag skrivit om denna för att passa min inrapportering till Vera. Jag har även utgått från DHT11_test för att fåtill temperatur och luftfuktighet med DHT11.

I början av koden så definieras alla variabler som behöver ändras. Eftersom jag definierar allt i början av koden så behöver man inte ner i koden och ändra för att göra flera givare. Utan det räcker att ändra några få rader. (IPAddress ip, mac[],  veraLjusID, veraHumidityID, veraTempid)

int sensorPin = A0;    // Analog port som ska nyttjas för att läsa analoga värden, dvs ljus
int sensorValue = 0;  //  Värdet för den analoga enheten ska sparas här.
float loopDelay   = 300000;  // Hur många ms loopen ska vänta. Har som default kör 300000ms, dvs 5 Minuter mellan rapporterna.
float tempgivaren;       // variabel för temperaturer.
float humiditygivaren;   // variabel för luftfuktighet.

 

Vera rapportering:

int veraLjusID = 81;          // ID på ljussensor i Vera
int veraHumidityID = 82;  // ID på luftfuktighetssensor i Vera
int veraTempid     = 83;    // ID på Temperaturgivare i Vera

Nätverkskortet
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xAF, 0xFE, 0xED }; // Ange en unik mac adress
char server[] = ”VeraIP”;    // Här ska namnet eller IP till din Vera registreras.

int Serverport = 3480;  // porten dit data ska rapporteras på vera. Detta är default så det ska inte behövas ändras.
IPAddress ip(10,10,10,123);  // Ange IP adressen din Arduino ska nyttja, bör vara på samma subnät som din Vera controller!

 

 

Förklaring av ”void loopen()”

Följande rad kommer att läsa värdet från pin2 på DHT11

int chk = DHT11.read(DHT11PIN);

 

Variabeln chk kontrolleras mot en switch funktion som kontrollerar hur läsningen gick, sedan skrivs detta ut på serieporten om denna är öppen.

  switch (chk)
  {
    case 0: Serial.println(”OK”); break;
    case -1: Serial.println(”Checksum error”); break;
    case -2: Serial.println(”Time out error”); break;
    default: Serial.println(”Unknown error”); break;
  }

 

Genom att anropa DHT11.humidity så returernas nuvarande värdet som ett flyttal till variabeln ”humiditygivaren” Temperatur givaren anropas genom att nyttja DHT11.temperature. Dessa värden skickas direkt till funktionen som rapporterar in till Vera.

humiditygivaren = (float)DHT11.humidity, 2;

tempgivaren = (float)DHT11.temperature, 2;

 

Genom att läsa det analoga värdet på ljussensorn och spara i sensorValue så får jag ett värde mellan 0 – 1024. Verans ljussensor visar data som procent, så värdet måste räknas om innan det skickas till Veran.

sensorValue = analogRead(sensorPin); 

För att räkna om värdet 0 – 1024 till procent så har jag nyttjat en formel jag hittade på på följande sida.
float percent = sensorValue / 1024.0 * 100;  // Värdet som avlästes delas med 1024 och multipliceras med 100 för att få procent.
sensorValue = floor(percent*100) / 100;

 

Rapportera till Vera

För att slippa ha så mycket kod i loopen så har jag gjort tre funktioner som rapporterar in data till Vera, Jag kommer att göra om detta till en enda funktion istället för tre senare. Jag skriven enbart om en nedan, eftersom de två andra ser i stort sett identiska ut.

 

VeraTempid” motsvarar det id enheten i Vera har. ”tempgivaren” innehåller nuvarande temperatur.

  httpTempRegister(veraTempid, tempgivaren);
  httpLjusRegister(veraLjusID, sensorValue);
  httpFuktRegister(veraHumidityID, humiditygivaren);

 

Funktionen httpTempRegister

Följande funktion gör ett webbsvar till Veran

void httpTempRegister(int GivarID, int MittValue) {
Om Arduinon lyckas koppla upp mot Veran på angiven port så skickas data
if (client.connect(server, Serverport)) {

client.print(”GET /data_request?id=variableset&DeviceNum=”); // bygger början av http strängen
client.print(GivarID);   // adderar ID som den ska rapportera till Vera
client.print(”&serviceId=urn:upnp-org:serviceId:TemperatureSensor1&Variable=CurrentTemperature&Value=”); lägger till strängen för temperaturschemat i Vera.
client.print(MittValue); // Lägger till temperaturen i slutet av strängen
client.println(” HTTP/1.1″); // avslutar raden med http version och postar
client.print(”Host: ”);
client.print(server);
client.println(”Connection: close”);
client.println();
Serial.println(”skickade temperatur till Vera, kopplar ner”);
client.stop();

}
else {
// skulle inte data ha skickats så görs det inte nått mer försöka att skicka igen förens om 5 minuter.
client.stop();
}
}

Skapade nyss en Arduino med hjälp av koden i guiden utan problem. Detta ger mig två Arduino som totalt rapporterar 6 sensorer direkt till Vera.

Arduno-Multisensor2

 

 

 

 

 

 

 

Koden: Komplett Arduino sketch

 

Jag kommer att fortsätta utveckla detta framöver.

Kommande funktioner i Arduino Projektet:

  • Rapportera ljus – check
  • Rapportera temperatur – check
  • Rapportera luftfuktighet – check
  • Byte av temperatursensor till DS18B20
  • PIR Sensor
  • Trigga på temperaturförändringar över X%
  • Trigga på förändringar i ljus
  • Trigga på förändringar i luftfuktighet
  • Varna om enheten ej kan kommunicera med Vera.
  • Konvertera till Wifi, förhoppningsvis ESP8266

Har jag tur med mitt googlade efter micasaverde så kanske jag hittar nått sätt att porta min strömmätande Arduino till Vera med!

// Markus

6 reaktioner på ”Arduino – Bygg en multisensor till Vera.”

  1. Pingback: Projekt – Arduino – Hämta Verans Mode V1.0 |

  2. Pingback: Z-Wave kontroller som larm? |

  3. Pingback: Tips Inför Val Av Teknik För Hemautomation! |

  4. Pingback: Z-UNO är ett kort med Z-wave stöd! |

  5. Pingback: Min resa till hemautomation |

  6. Pingback: Allt om Vera och VeraSecure |

Lämna en kommentar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *