Wetterstation mit Spark.IO
4. Juni 2017
Die 5 9 Verarsche
4. Juni 2017
Alle anzeigen

Klimawerte per HTTP abrufen

  • Schwierigkeitsgrad Mechanik33%
  • Schwierigkeitsgrad Elektronik10%
  • Zeitaufwand25%
  • Kosten25%
Vorgeschichte
Serverräume müssen in Bezug auf Klimatisierung überwacht werden. In der Firma ist innert 6 Jahren dreimal die Klimatisierung des Gebäudes ausgefallen. Die Überwachung erfolgte bisher durch ein Klimarsensor in Form eines Frosches, der über RS232 an einen Linuxserver angeschlossen war. Mittlerweile haben Server kaum mehr solche Schnittstellen und bei der heute üblichen Virtualisierung fallen viele potenzielle Hardwarekandidaten weg.

Jetzt, im Internet der Dinge, sind Sensoren und Messgeräte gleich selber direkt im Netz zu Hause. Was liegt also näher, als einen Klimasensor ins Netzwerk zu bringen. Grundlage dafür bietet ein Arduino mit POE fähiger Ethernetschnittstelle.

Arduino Ethernet mit PoE als Interface für Klimasensor

Der Arduino Ethernet ist ein auf dem Atmel ATmega328 basierendes Board. Anstatt eines USB Interfaces ist ein Wiznet Ethernet Anschluss vorhanden. Mit einem Zusatzmodul kann das Board über die Ethernetleitung (PoE) versorgt werden. Diese wird in diesem Projekt genutzt, um ein extra Steckernetzteil zu vermeiden.
Introbild

Elektronik

Die Elektronik ist wenigen Minuten aufgebaut. Der Sensor benötigt einen zusätzlichen 10k Pullup (im Bild ein falscher Wert) an der Datenleitung. Falsche Polarität zerstört den Sensor (am eigenen Sensor getestet).

Der Sensor sollte etwas abseits des Arduino-Board liegen. Die PoE Hardware produziert doch erhebliche Wärme und würde darum den Messwert beeinflussen.

Software

  1 /*
  2  Temp and Humidity Monitoring with Arduino PoE and DHT22
  3  created 31 July 2013
  4  by Me
  6
  7 #include <avr/wdt.h>
  8 #include <Ethernet.h>
  9 #include <SPI.h>
 10 #include „DHT.h“
 11
 12 #define DHTPIN 2
 13 #define DHTTYPE DHT22   // DHT 22  (AM2302)
 14
 15 // assign a MAC address for the ethernet controller.
 16 // fill in your address here:
 17 // Sensor A
 18 byte mac[] = {0x90, 0xA2, 0xDA, 0x0D, 0xB9, 0x23};
 19 IPAddress ip(192,168,1,11);
 20
 21 // Sensor B
 22 //byte mac[] = {0x90, 0xA2, 0xDA, 0x0D, 0xB9, 0x02};
 23 //IPAddress ip(192,168,1,10);
 24
 25 IPAddress gateway(192,168,1,1);
 26 IPAddress subnet(255, 255, 255, 0);
 27
 28 // Initialize the Ethernet server library
 29 // with the IP address and port you want to use 
 30 // (port 80 is default for HTTP):
 31 EthernetServer server(80);
 32 DHT dht(DHTPIN, DHTTYPE, 3);
 33
 34 float dht_h;
 35 float dht_t;
 36 unsigned long ul_PreviousMillis = 0UL;
 37 unsigned long ul_Interval = 5000UL;
 38 int ledPin = 9;
 39 String HTTP_req;          // stores the HTTP request
 40
 41 void setup() {
 42   pinMode(ledPin, OUTPUT);
 43   Serial.begin(9600);
 44   Serial.println(„** Initializing…“);
 45
 46   // start the Ethernet connection and the server:
 47   Ethernet.begin(mac, ip);
 48   server.begin();
 49   wdt_enable(WDTO_8S);
 50 }
 51
 52 void loop() {
 53   // check for a reading no more than once a second.
 54   unsigned long ul_CurrentMillis = millis();
 55   if( ul_CurrentMillis – ul_PreviousMillis > ul_Interval) {
 56     wdt_reset();
 57     ul_PreviousMillis = ul_CurrentMillis;
 58     dht_h = dht.readHumidity();
 59     dht_t = dht.readTemperature();
 60
 61     // check if returns are valid, if they are NaN (not a number) then something went wrong!
 62     if (isnan(dht_t) || isnan(dht_h)) {
 63         Serial.println(„Failed to read from DHT“);
 64     } else {
 65         Serial.print(„H: „);
 66         Serial.print(dht_h);
 67         Serial.print(“ %\t“);
 68         Serial.print(„T: „);
 69         Serial.print(dht_t);
 70         Serial.println(“ *C“);
 71     }
 72     digitalWrite(ledPin, !digitalRead(ledPin));
 73   }
 74   // listen for incoming Ethernet connections:
 75   listenForEthernetClients();
 76 }
 77
 78 void listenForEthernetClients() {
 79   // listen for incoming clients
 80   EthernetClient client = server.available();
 81   if (client) {
 82     Serial.println(„Request: „);
 83     // an http request ends with a blank line
 84     boolean currentLineIsBlank = true;
 85     while (client.connected()) {
 86       if (client.available()) {
 87         char c = client.read();
 88         HTTP_req += c;
 89         Serial.print(c);
 90       }
 91       if (HTTP_req.indexOf(„\r\n\r\n“)> –1){
 92         Serial.println(„[EOF]“);
 93         if (HTTP_req.indexOf(„sensor=humidity“)> –1){
 94           client.println(dht_h);
 95           Serial.println(„Is Hum“);
 96         }
 97         else if (HTTP_req.indexOf(„sensor=temp“)> –1){
 98           client.println(dht_t);
 99           Serial.println(„Is Temp“);
100         }
101         else {
102           client.println(„unk“);
103           Serial.println(„Is unknown“);
104         }
105         HTTP_req = „“;
106         // give the web browser time to receive the data
107         delay(20);
108         // close the connection:
109         client.stop();
110       }
111     }
112   }
113 }
114
115
116
klima_graph

Graphen erzeugen mit RRDTools

housing

Gehäuse aus dem 3D-Drucker

Deutsch