Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung Letzte Überarbeitung Beide Seiten der Revision | ||
elektronik:dht11_sensor_mit_arduino_ethernet_shield_und_thingspeak [2016/02/08 21:50] octoate [Software] Auslesen des DHT11 Sensors |
elektronik:dht11_sensor_mit_arduino_ethernet_shield_und_thingspeak [2016/02/12 22:13] octoate [Software] 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, | + | Da mein Rondostat HR20E, ein automatisches Heizkörperthermostat, |
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: | ||
+ | |||
+ | {{: | ||
===== 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 | + | 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 |
- | {{: | + | {{: |
===== Software ===== | ===== Software ===== | ||
- | Die Software | + | Die Software |
* 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, | Um das Ethernet Shield im Arduino Sketch anzusprechen, | ||
- | < | + | < |
#include < | #include < | ||
#include < | #include < | ||
</ | </ | ||
zu Beginn des Sketches eingefügt werden. Danach folgt die Konfiguration der Netzwerkadressen. Eine Konfiguration per DHCP ist auch möglich, weiteres findet man dazu in der offiziellen [[https:// | zu Beginn des Sketches eingefügt werden. Danach folgt die Konfiguration der Netzwerkadressen. Eine Konfiguration per DHCP ist auch möglich, weiteres findet man dazu in der offiziellen [[https:// | ||
- | < | + | < |
Ethernet.begin(mac, | Ethernet.begin(mac, | ||
</ | </ | ||
+ | |||
+ | |||
+ | ==== DHT Sensor ==== | ||
Zum Ansprechen des DHT11 Sensors verwende ich die [[http:// | Zum Ansprechen des DHT11 Sensors verwende ich die [[http:// | ||
Hat man das Verzeichnis angelegt, dann kann man im Sketch die Bibliothek über | Hat man das Verzeichnis angelegt, dann kann man im Sketch die Bibliothek über | ||
- | < | + | < |
#include < | #include < | ||
</ | </ | ||
einbinden. Um die Bibliothek im Programm zu nutzen, legt man eine Variable für den Sensor an und definiert den Pin, an dem der Sensor hängt: | einbinden. Um die Bibliothek im Programm zu nutzen, legt man eine Variable für den Sensor an und definiert den Pin, an dem der Sensor hängt: | ||
- | < | + | < |
#define DHT11_PIN 7 | #define DHT11_PIN 7 | ||
Zeile 40: | Zeile 50: | ||
Die Abfrage des Sensors erfolgt dann in der " | Die Abfrage des Sensors erfolgt dann in der " | ||
- | < | + | < |
int chk = DHT.read11(DHT11_PIN); | int chk = DHT.read11(DHT11_PIN); | ||
switch (chk) | switch (chk) | ||
Zeile 64: | Zeile 74: | ||
float temperature = DHT.temperature; | float temperature = DHT.temperature; | ||
</ | </ | ||
+ | |||
+ | |||
+ | ==== ThingSpeak ==== | ||
+ | |||
+ | Die ThingSpeak Bibliothek kann man glücklicherweise über " | ||
+ | |||
+ | {{: | ||
+ | |||
+ | Um die Bibliothek im Sketch verwenden zu können, muss auch hier ein Include hinzugefügt werden: | ||
+ | <code c> | ||
+ | #include < | ||
+ | </ | ||
+ | |||
+ | Um die ThingSpeak API nutzen zu können, 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 = " | ||
+ | </ | ||
+ | |||
+ | In der " | ||
+ | <code c> | ||
+ | ThingSpeak.begin(client); | ||
+ | </ | ||
+ | |||
+ | In meinem Fall möchte ich gleichzeitig zwei Werte (Fields) bei ThingSpeak aktualisieren - die Temperatur und die Luftfeuchtigkeit. Im Schritt vorher (siehe "DHT Sensor" | ||
+ | <code c> | ||
+ | if (chk == DHTLIB_OK) | ||
+ | { | ||
+ | ThingSpeak.setField(1, | ||
+ | ThingSpeak.setField(2, | ||
+ | ThingSpeak.writeFields(myChannelNumber, | ||
+ | delay(20000); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== 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 < | ||
+ | #include " | ||
+ | |||
+ | // Use wired ethernet shield | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; | ||
+ | IPAddress ip(192, 168, 200, 200); | ||
+ | IPAddress myDns(192, 168, 200, 1); | ||
+ | IPAddress gateway(192, | ||
+ | IPAddress subnet(255, 255, 255, 0); | ||
+ | EthernetClient client; | ||
+ | |||
+ | unsigned long myChannelNumber = 12345; | ||
+ | const char * myWriteAPIKey = " | ||
+ | |||
+ | // use DHT library | ||
+ | #define DHT11_PIN 7 | ||
+ | |||
+ | dht DHT; | ||
+ | |||
+ | void setup() { | ||
+ | Serial.begin(115200); | ||
+ | Serial.println(" | ||
+ | Serial.print(" | ||
+ | Serial.println(DHT_LIB_VERSION); | ||
+ | Serial.println(); | ||
+ | Serial.println(" | ||
+ | |||
+ | // initialize Ethernet Shield | ||
+ | Ethernet.begin(mac, | ||
+ | |||
+ | // initialize ThingSpeak client | ||
+ | ThingSpeak.begin(client); | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | // READ DATA | ||
+ | Serial.print(" | ||
+ | int chk = DHT.read11(DHT11_PIN); | ||
+ | switch (chk) | ||
+ | { | ||
+ | case DHTLIB_OK: | ||
+ | Serial.print(" | ||
+ | break; | ||
+ | case DHTLIB_ERROR_CHECKSUM: | ||
+ | Serial.print(" | ||
+ | break; | ||
+ | case DHTLIB_ERROR_TIMEOUT: | ||
+ | Serial.print(" | ||
+ | break; | ||
+ | default: | ||
+ | Serial.print(" | ||
+ | break; | ||
+ | } | ||
+ | | ||
+ | float humidity = DHT.humidity; | ||
+ | float temperature = DHT.temperature; | ||
+ | | ||
+ | // DISPLAY DATA | ||
+ | Serial.print(humidity, | ||
+ | Serial.print(", | ||
+ | Serial.println(temperature, | ||
+ | |||
+ | // 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. | ||
+ | |||
+ | // only publish if everything was ok | ||
+ | if (chk == DHTLIB_OK) | ||
+ | { | ||
+ | ThingSpeak.setField(1, | ||
+ | ThingSpeak.setField(2, | ||
+ | ThingSpeak.writeFields(myChannelNumber, | ||
+ | delay(20000); | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | delay(1000); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ |