Klimawerte per HTTP abrufen

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.

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.

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.

Bilder

cabling.png housing.png mit-arduino-klimadaten-ueber-web-abrufen.jpg sam_0420-custom.jpg sam_0426-custom.jpg

Software

/*
 Temp and Humidity Monitoring with Arduino PoE and DHT22
 created 31 July 2013
 by Me

#include <avr/wdt.h>
#include <Ethernet.h>
#include <SPI.h>
#include „DHT.h“

#define DHTPIN 2
#define DHTTYPE DHT22   // DHT 22  (AM2302)

// assign a MAC address for the ethernet controller.
// fill in your address here:
// Sensor A
byte mac[] = {0x90, 0xA2, 0xDA, 0x0D, 0xB9, 0x23};
IPAddress ip(192,168,1,11);

// Sensor B
//byte mac[] = {0x90, 0xA2, 0xDA, 0x0D, 0xB9, 0x02};
//IPAddress ip(192,168,1,10);

IPAddress gateway(192,168,1,1);
IPAddress subnet(255, 255, 255, 0);

// Initialize the Ethernet server library
// with the IP address and port you want to use 
// (port 80 is default for HTTP):
EthernetServer server(80);
DHT dht(DHTPIN, DHTTYPE, 3);

float dht_h;
float dht_t;
unsigned long ul_PreviousMillis = 0UL;
unsigned long ul_Interval = 5000UL;
int ledPin = 9;
String HTTP_req;          // stores the HTTP request

void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
  Serial.println(„** Initializing…“);

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  wdt_enable(WDTO_8S);
}

void loop() {
  // check for a reading no more than once a second.
  unsigned long ul_CurrentMillis = millis();
  if( ul_CurrentMillis – ul_PreviousMillis > ul_Interval) {
    wdt_reset();
    ul_PreviousMillis = ul_CurrentMillis;
    dht_h = dht.readHumidity();
    dht_t = dht.readTemperature();

    // check if returns are valid, if they are NaN (not a number) then something went wrong!
    if (isnan(dht_t) || isnan(dht_h)) {
        Serial.println(„Failed to read from DHT“);
    } else {
        Serial.print(„H: „);
        Serial.print(dht_h);
        Serial.print(“ %\t“);
        Serial.print(„T: „);
        Serial.print(dht_t);
        Serial.println(“ *C“);
    }
    digitalWrite(ledPin, !digitalRead(ledPin));
  }
  // listen for incoming Ethernet connections:
  listenForEthernetClients();
}

void listenForEthernetClients() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println(„Request: „);
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        HTTP_req += c;
        Serial.print(c);
      }
      if (HTTP_req.indexOf(„\r\n\r\n“)> –1){
        Serial.println(„[EOF]“);
        if (HTTP_req.indexOf(„sensor=humidity“)> –1){
          client.println(dht_h);
          Serial.println(„Is Hum“);
        }
        else if (HTTP_req.indexOf(„sensor=temp“)> –1){
          client.println(dht_t);
          Serial.println(„Is Temp“);
        }
        else {
          client.println(„unk“);
          Serial.println(„Is unknown“);
        }
        HTTP_req = „“;
        // give the web browser time to receive the data
        delay(20);
        // close the connection:
        client.stop();
      }
    }
  }
}