Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
elektronik:dht11_sensor_mit_arduino_ethernet_shield_und_thingspeak [2016/02/08 21:51]
octoate Code Format
elektronik:dht11_sensor_mit_arduino_ethernet_shield_und_thingspeak [2016/02/12 22:17]
octoate [ThingSpeak] Satzbau
Zeile 1: Zeile 1:
 ====== DHT11 Sensor mit Arduino Ethernet Shield und ThingSpeak ====== ====== DHT11 Sensor mit Arduino Ethernet Shield und ThingSpeak ======
  
-Da mein Rondostat HR20E, ein automatisches Heizkörperthermostat, unter der Woche einen Ausfall hatte und abends einen Raum mit sommerlichen 30°C vorgefunden habe, habe ich mir ein kleines Projekt zusammengestellt, mit dem ich die aktuellen Messwerte ins Internet stellen kann, um zu kontrollieren, ob das Thermostat mal wieder spinnt. Die Wahl für den Datendienst fiel relativ schnell auf [[http://www.thingspeak.com|ThingSpeak]], da hier eine gute Arduino Unterstützung vorhanden ist.+Da mein Rondostat HR20E, ein automatisches Heizkörperthermostat, unter der Woche einen Ausfall hatte und ich abends einen Raum mit sommerlichen 30°C vorgefunden habe, habe ich mir ein kleines Projekt zusammengestellt, mit dem ich die aktuellen Messwerte ins Internet stellen kann, um zu kontrollieren, ob das Thermostat mal wieder spinnt. Die Wahl für den Datendienst fiel relativ schnell auf [[http://www.thingspeak.com|ThingSpeak]], da hier eine gute Arduino Unterstützung vorhanden ist.
  
 In meiner Hardware-Grabbelkiste habe ich außerdem einen DHT11 Temperatur- und Luftfeuchtigkeitssensor gefunden, der mit 5V betrieben wird und damit direkt an den Arduino angeschlossen werden kann, was den Aufbau natürlich vereinfacht. Ein Arduino Ethernet Shield stellt die Verbindung zum Internet her. In meiner Hardware-Grabbelkiste habe ich außerdem einen DHT11 Temperatur- und Luftfeuchtigkeitssensor gefunden, der mit 5V betrieben wird und damit direkt an den Arduino angeschlossen werden kann, was den Aufbau natürlich vereinfacht. Ein Arduino Ethernet Shield stellt die Verbindung zum Internet her.
 +
 +Das Ergebnis könnte auf der ThingSpeak Seite dann bspw. so aussehen:
 +
 +{{:elektronik:dht11_mit_thingspeak.png?600|}}
  
 ===== Hardware ===== ===== Hardware =====
-Die Hardware ist aus den bereits genannten Gründen nichts besonderes. Das Arduino Ethernet Shield wird einfach nur auf den Arduino UNO aufgesteckt und das war es schon. Den DHT11 Sensor verbindet man dann noch mit +5V, GND und - in meinem Fall - mit Pin 7 des Ethernet Shields. Die Folgende Fritzing Skizze zeigt das ganz schön.+Die Hardware ist aus den bereits genannten Gründen nichts besonderes. Das Arduino Ethernet Shield wird einfach nur auf den Arduino UNO aufgesteckt und das war es schon. Den DHT11 Sensor verbindet man dann noch mit +5V, GND und - in meinem Fall - mit Pin 7 des Ethernet Shields. Die folgende Fritzing Skizze zeigt das ganz schön.
  
-{{:elektronik:arduino_dht11_mit_thingspeak.png|}}+{{:elektronik:arduino_dht11_mit_thingspeak.png?600|}}
  
 ===== Software ===== ===== Software =====
-Die Software basiert im Prinzip aus drei Komponenten:+Die Software besteht im Prinzip aus drei Teilen:
   * Ethernet Shield initialisieren   * Ethernet Shield initialisieren
   * DHT11 Sensor ansprechen   * DHT11 Sensor ansprechen
   * ThingSpeak Kanal aktualisieren   * ThingSpeak Kanal aktualisieren
 +
 +
 +==== Ethernet Shield ====
  
 Um das Ethernet Shield im Arduino Sketch anzusprechen, muss die Zeile Um das Ethernet Shield im Arduino Sketch anzusprechen, muss die Zeile
Zeile 25: Zeile 32:
 Ethernet.begin(mac, ip, myDns, gateway, subnet); Ethernet.begin(mac, ip, myDns, gateway, subnet);
 </code> </code>
 +
 +
 +==== DHT Sensor ====
  
 Zum Ansprechen des DHT11 Sensors verwende ich die [[http://arduino.cc/playground/Main/DHTLib|DHTLib von Rob Tillaart]], die neben dem DHT11 auch den DHT21, DHT22, DHT33 und DHT44 unterstützt. Um die Bibliothek einzubinden, muss man die auf der Webseite der Bibliothek angegebenen Dateien "dht.c" und "dht.h" in das "Libraries" Verzeichnis eures Benutzers in ein Verzeichnis "DHT" kopieren. Hört sich komplizierter an, als es ist. Auf meinem Windows 10 Rechner liegt das Verzeichnis unter "c:\Benutzer\<Benutzername>\Dokumente\Arduino\libraries\DHT". Leider gibt es die Bibliothek noch nicht direkt im Arduino Bibliotheksmanager (unter Sketch-Bibliothek einbinden), aber vielleicht ändert sich das in Zukunft ja noch. Zum Ansprechen des DHT11 Sensors verwende ich die [[http://arduino.cc/playground/Main/DHTLib|DHTLib von Rob Tillaart]], die neben dem DHT11 auch den DHT21, DHT22, DHT33 und DHT44 unterstützt. Um die Bibliothek einzubinden, muss man die auf der Webseite der Bibliothek angegebenen Dateien "dht.c" und "dht.h" in das "Libraries" Verzeichnis eures Benutzers in ein Verzeichnis "DHT" kopieren. Hört sich komplizierter an, als es ist. Auf meinem Windows 10 Rechner liegt das Verzeichnis unter "c:\Benutzer\<Benutzername>\Dokumente\Arduino\libraries\DHT". Leider gibt es die Bibliothek noch nicht direkt im Arduino Bibliotheksmanager (unter Sketch-Bibliothek einbinden), aber vielleicht ändert sich das in Zukunft ja noch.
Zeile 64: Zeile 74:
 float temperature = DHT.temperature; float temperature = DHT.temperature;
 </code> </code>
 +
 +
 +==== ThingSpeak ====
 +
 +Die ThingSpeak Bibliothek kann man glücklicherweise über "Sketch-Bibliothek einbinden" in die Umgebung integrieren. Dazu einfach den entsprechenden Menüpunkt in der Arduino IDE aufrufen und "Bibliotheken verwalten" aufrufen. In dem "Bibliotheksverwalter" Fenster kann man in der Suche dann "ThingSpeak" eingeben und die entsprechende Bibliothek dann installieren.
 +
 +{{:elektronik:thingspeak_bibliothek_in_arduino_ide_einbinden.png|}}
 +
 +Um die Bibliothek im Sketch verwenden zu können, muss auch hier ein Include hinzugefügt werden:
 +<code c>
 +#include <ThingSpeak.h>
 +</code>
 +
 +Damit man die ThingSpeak API nutzen kann, muss sowohl die Kanalnummer (Channel Number) und der API Key definiert werden. Beides kann auf der ThingSpeak Webseite nach dem Anlegen eines Kanals gefunden werden. Im Quelltext sieht das dann etwa so aus (nein, das sind keine echten Daten ;-)):
 +<code c>
 +unsigned long myChannelNumber = 12345;
 +const char * myWriteAPIKey = "XXYYXXYYXXYYXXYY";
 +</code>
 +
 +In der "loop()" Methode wird dann nach der Ethernet Shield Initialisierung die ThingSpeak API initialisiert.
 +<code c>
 +ThingSpeak.begin(client);
 +</code>
 +
 +In meinem Fall möchte ich gleichzeitig zwei Werte (Fields) bei ThingSpeak aktualisieren - die Temperatur und die Luftfeuchtigkeit. Im Schritt vorher (siehe "DHT Sensor") haben wir bereits die Werte aus dem Sensor ausgelesen. Die Werte müssen nun nur noch in der API angelegt und an ThingSpeak gesendet werden. Das machen wir aber natürlich nur dann, wenn die Sensordaten erfolgreich ausgelesen werden konnten. Mittels der "setField(...)" Methode der ThingSpeak API können die einzelnen Felder (Fields) in einem Kanal (Channel) gesetzt werden. Das Absenden der Daten erfolgt dann mit der Methode "writeFields(...)", die als Übergabeparameter die Kanalnummer (Channel Number) und den API Key bekommt. Da ThingSpeak in der kostenlosen Version nur Aktualisierungen nur in 15 Sekunden Schritten erlaubt, wird am Ende noch ein "dely(20000)" angehängt - das reicht für meine Zwecke auf jeden Fall aus.
 +<code c>
 +if (chk == DHTLIB_OK)
 +{
 +  ThingSpeak.setField(1,temperature);
 +  ThingSpeak.setField(2,humidity);
 +  ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
 +  delay(20000); // ThingSpeak will only accept updates every 15 seconds.
 +}
 +</code>
 +
 +
 +===== Der komplette Sketch =====
 +
 +Das war es dann auch schon. Abschließend folgt noch der komplette Sketch, der neben der oben beschriebenen Programmlogik zusätzlich auch noch eine halbwegs vernünftige Debugausgabe über das serielle Interface des Arduinos enthält. Evtl. hilft euch das ja bei einem eigenen kleinen Projekt mit der ThingSpeak API weiter.
 +
 +<code c>
 +#include <dht.h>
 +#include "ThingSpeak.h"
 +
 +// Use wired ethernet shield
 +#include <SPI.h>
 +#include <Ethernet.h>
 +
 +byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
 +IPAddress ip(192, 168, 200, 200);
 +IPAddress myDns(192, 168, 200, 1);
 +IPAddress gateway(192, 168, 200, 1);
 +IPAddress subnet(255, 255, 255, 0);
 +EthernetClient client;
 +
 +unsigned long myChannelNumber = 12345;
 +const char * myWriteAPIKey = "XXYYXXYYXXYYXXYY";
 +
 +// use DHT library
 +#define DHT11_PIN 7
 +
 +dht DHT;
 +
 +void setup() {
 +  Serial.begin(115200);
 +  Serial.println("DHT TEST PROGRAM ");
 +  Serial.print("LIBRARY VERSION: ");
 +  Serial.println(DHT_LIB_VERSION);
 +  Serial.println();
 +  Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
 +
 +  // initialize Ethernet Shield
 +  Ethernet.begin(mac, ip, myDns, gateway, subnet);
 +
 +  // initialize ThingSpeak client
 +  ThingSpeak.begin(client);
 +}
 +
 +void loop() {
 +  // READ DATA
 +  Serial.print("DHT11, \t");
 +  int chk = DHT.read11(DHT11_PIN);
 +  switch (chk)
 +  {
 +    case DHTLIB_OK:  
 +    Serial.print("OK,\t"); 
 +    break;
 +    case DHTLIB_ERROR_CHECKSUM: 
 +    Serial.print("Checksum error,\t"); 
 +    break;
 +    case DHTLIB_ERROR_TIMEOUT: 
 +    Serial.print("Time out error,\t"); 
 +    break;
 +    default: 
 +    Serial.print("Unknown error,\t"); 
 +    break;
 +  }
 +  
 +  float humidity = DHT.humidity;
 +  float temperature = DHT.temperature;
 +  
 +  // DISPLAY DATA
 +  Serial.print(humidity,1);
 +  Serial.print(",\t");
 +  Serial.println(temperature,1);
 +
 +  // publish to ThingSpeak
 +  // Write to ThingSpeak. There are up to 8 fields in a channel, allowing you to store up to 8 different
 +  // pieces of information in a channel.  Here, we write to field 1.
 +
 +  // only publish if everything was ok
 +  if (chk == DHTLIB_OK)
 +  {
 +    ThingSpeak.setField(1,temperature);
 +    ThingSpeak.setField(2,humidity);
 +    ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
 +    delay(20000); // ThingSpeak will only accept updates every 15 seconds.
 +  }
 +  else
 +  {
 +    delay(1000);
 +  }
 +}
 +</code>
 +
elektronik/dht11_sensor_mit_arduino_ethernet_shield_und_thingspeak.txt · Zuletzt geändert: 2016/02/12 22:17 von octoate
CC Attribution-Noncommercial-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0