Sensorino - Auslesen verschiedener Sensoren mit Arduino
Work in Progress: | |
Diese Seite wird erst noch aufgebaut. Bitte noch keine Änderungen vornehmen, ohne mit dem ursprünglichen Author zu sprechen! | |
Vielen Dank. |
Mit möglichst kleinem Aufwand und Einsatz von Mitteln (Kosten, Hardware, Stromverbrauch) die Überwachung von diversen Sensoren zu ermöglichen. Dieses Sensorennetz (bestehend aus Temperatur-, Feuchtigkeit-, Druck und Gas-Sensoren) kommt im finalen Aufbau dann als quasi Home-Bus-System in einer Wohnungsüberwachung zum Einsatz.
Sensoren
Temperatur
- Einsatzgebiete:
- diverse Innenräume (Zimmer)
- Außenraum
- IT Ausrüstung
- Pumpen, Boiler, Warmwasser Kreislauf, Zulauf Fußbodenheizung
- Hardware:
- Dalas 1-Wire DS1820 (Reichelt)
-
DS1820 Temperatursensor
Spektrum - -55°C bis +125°C bei +/- 0,5°C Meßtoleranz im Range -10°C bis +85°C
Vorteile - breites Spektrum
- 1-Wire Bus (Sensor ID, Reihenschaltung möglich)
- Genauigkeit / geringe Meßtoleranz
- kleine Bauform
- geringste Kosten
Nachteile - parasitäre Stromversorgung auf lange Strecken problematisch
- parasitäre Stromversorgung langes Rückmeldungsintervall
- zusätzliche Bauelemente benötigt um Meßfehler zu minimieren
Kosten ~ 2,40 EUR
- DHT11 (eBay: 290722601623)
-
DHT11 kombinierter Temperatur- und Feuchtigkeitssensor
Spektrum - Luftfeuchtigkeit: 20% bis 90% bei 5% Meßtoleranz
- Temperatur: 0°C bis +50°C bei +/- 2°C Meßtoleranz
Vorteile - Temperatur- und Luftfeuchtigkeit kombinierter Sensor
- kostengünstigere DHT Variante
Nachteile - größere Bauform
- nicht 1-Wire kompatibel
- keine Reihenschaltung möglich
- größere Meßtoleranz
- eingeschränktes Spektrum
Kosten ~ 3,40 EUR
- DHT22 (Sparkfun) | (eBay: 140763279018)
-
DHT22 kombinierter Temperatur- und Feuchtigkeitssensor
Spektrum - Luftfeuchtigkeit: 0% bis 100% bei 2% Meßtoleranz
- Temperatur: -40°C bis +80°C bei +/- 0,5°C Meßtoleranz
Vorteile - großes Spektrum
- Temperatur- und Luftfeuchtigkeit kombinierter Sensor
- Genauigkeit / geringe Meßtoleranz
Nachteile - größere Bauform
- nicht 1-Wire kompatibel
- keine Reihenschaltung möglich
- teurere DHT Variante
Kosten ~ 6,50 EUR
Luftfeuchte
- Einsatzgebiete:
- Luftfeuchtigkeit Innenraum
- Luftfeuchtigkeit Außenraum
- Luftfeuchtigkeit Abstellkammer/ Keller (* Hausgeräte: Waschmaschine, Trockner ...)
- Hardware:
- DHT11 (* Specs siehe oben)
- DHT22 (* Specs siehe oben)
Nässe
- Einsatzgebiete:
- Pflanzenbewässerung (eBay: 150835423322) (~ 7,15 EUR)
-
Bodenfeuchtigkeit Planzen-Sensor
Druck / Schließung
- Einsatzgebiete:
- Verschlussprüfung Türen / Fenster
- Hardware:
- SEN-09673 4mm (Sparkfun | Watterott Elektronik)
-
Drucksensor
Spektrum - kein Druck 1MΩ
- Volldruck 2.5kΩ
Vorteile - Foliensensor
- dünne Bauform
Nachteile - lange Bauform
- Meßgenauigkeit (nicht besonders skalierungsfähig)
Kosten ~ 5,72 EUR
- Reed Kontakt/ -Modul (Tipp von nicoduck)
-
Reed Kontakt & Modul
Gas
- Einsatzgebiete:
- Rauchentwicklung / Brand
- Dichtigkeit Gaskreislauf
- Hardware:
- MQ-2 (Methan, Butan, LPG, Rauch)
- MQ-3 (Alkohol, Ethanol, Rauch)
- MQ-4 (Methan, CNG)
- MQ-5 (Natur Gas, LPG)
- MQ-6 (LPG, Butan)
- MQ-7 (Carbon Monoxide)
- MQ-8 (Hydrogen)
- MQ-9 (Carbon Monoxide, entflammbares Gas)
- MQ-131 (Ozon)
- MQ-135 (Luftqualität)
- MQ-136 (Hydrogen Sulfide)
- MQ-137 (Ammonia)
- MQ-138 (Benzene, Toluene, Alkohol, Aceton, Propan, Formaldehyd)
Strom
- Einsatzgebiete:
- Verbrauchsmessung
- Mögliche Umsetzungen:
Meßpunkte
Da es unterschiedliche Meßpunkte gibt, ist es nicht nötig, alle Sensoren an jedem Meßpunkt zur Verfügung zu stellen - dies würde ebenfalls die Kosten massiv erhöhen. Der Einsatz von Modulen mit den jeweils für den Meßpunkt relevanten Sensoren erscheint daher sinnvoll. Hier besteht nun die Möglichkeit fertige Einzelmodule zu verwenden oder diese selbst zu bauen; eine Kosten-Aufwand-Betrachtung erfolgt daher im Vorfeld.
Fertige Module
Es gibt bereits fertige Sensor-Module in diversen Formen und Größen zu kaufen, z.B. auf eBay:
DHT11 Temperatur- und Luftfeuchtigkeitssensor | ~ 3,08 EUR | eBay: 280873999094 |
DS18B20 Temperatur Sensor | ~ 4,76 EUR | eBay: 290687150481 |
-
Temperatur Sensor Modul DHT11
-
Temperatur Sensor Modul DS18B20
Do It Yourself (DIY)
Für den Bau eines DIY-Sensors werden folgende Teile benötigt (Kabel, Löt-Zubehör und Zeitaufwand nicht mitberechnet):
Artikel | Preis | Shop |
---|---|---|
3-Pin Connector (Phobyas Fan Connector) Stecker oder Buchse |
~ 1,00 EUR |
|
1N5817 Schottky Diode, 20V, 1A | 0,06 EUR | Reichelt Art.-Nr.: 1N 5817 |
DS18S20 | 2,40 EUR | Reichelt Art.-Nr.: DS 18S20 |
4,7k Widerstand | 0,11 EUR | Reichelt Art.-Nr.: 1/4W 4,7K |
3,57 EUR |
*1: Hier kann es zu Kurzschlüssen aufgrund des +5V Pols kommen, was einen Defekt am Netzteil und/ oder Board auslösen kann.
-
DIY Temperatur Sensor DS18B20
-
DIY Temperatur Sensor DS18B20 Controller
Leitungen / Modulverbindungen
Die zum Einsatz kommenden Sensoren sind zwar teilweise 1-Wire kompatibel und könnten parasitär mit lediglich 2 Leitungen beschaltet werden, jedoch kommt dies aufgrund von einer erhöhten Anzahl von Messstörungen und Leitungslängen nicht zum Einsatz - daher werden zumindest 3 Leitungen benötigt:
- ground
- +5V
- data
Um die Modulverbindungen herzustellen, kommt ein Modularkabel mit einem Durchmesser von min. 0,6mm zum Einsatz - entweder als 3adrige oder als 4adrige 2x2 Variante.
Projektumsetzung
Temperatur
DS18S20 1-Wire [DIY]
Bei den 1-Wire DS18S20 ist die korrekte Beschaltung sehr wichtig: +5V am falschen Pin mögen die nicht wirklich. Erst wird es heiß, dann verdammt heiß, dann qualmt es ein bisschen und irgendwann passiert einfach gar nichts mehr - das bezieht sich dann natürlich auch auf ein späteres Auslesen des Sensors ... oder anders ausgedrückt: kaputt!
Daher hier die korrekte Pin Belegung des Sensors (entnommen aus den Hersteller DS18S20 TechSpecs) sowie der Schaltplan:
-
Pin Belegung DS18B20
-
Schaltplan DS18X20
Arduino Code:
// v0.1
#include <OneWire.h>
void setup(void) {
Serial.begin(9600);
}
void getTemperatureSensors(int pin) {
byte type_s;
OneWire ds(pin);
byte addr[8];
byte present = 0;
byte data[12];
float celsius;
while(ds.search(addr)) {
if (OneWire::crc8(addr, 7) != addr[7]) {
Serial.println("CRC not valid");
return;
} else {
switch (addr[0]) {
case 0x10: // DS18S20 or old DS1820
type_s = 1;
break;
case 0x28: // DS18B20
type_s = 0;
break;
case 0x22: // DS1822
type_s = 0;
break;
default: //Device is not a DS18x20 family device.
type_s = -1;
return;
}
// conversion
ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion
delay(1000); // conversion wait
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // read sensor scratchpad
for (int i = 0; i < 9; i++) {
data[i] = ds.read();
}
// convert data to temperature
int raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3;
if (data[7] == 0x10) {
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
unsigned char t_mask[4] = {0x7, 0x3, 0x1, 0x0};
byte cfg = (data[4] & 0x60) >> 5;
raw &= ~t_mask[cfg];
}
Serial.print("ID: ");
for(int i = 0; i < 8; i++) {
Serial.print(addr[i], HEX);
}
celsius = (float)raw / 16.0;
Serial.print(" ");
Serial.print(celsius);
Serial.println(" C");
}
}
ds.reset_search();
}
void loop() {
delay(1000);
Serial.println("reset");
getTemperatureSensors(8); // digital pin 8
}
In der Beispielschaltung wurden zu Testzwecken zwei Sensoren im 1-Wire Bus geschaltet, welche im Abstand von einer Sekunde die aktuelle Temperatur ausgeben. Einen Anstieg der Temperatur konnte durch Auflegen eines Fingers leicht herbeigeführt werden; innerhalb von nur vier Sekunden hat sich die gemessene Temperatur um ca. 5 Grad erhöht.
reset ID: 10AB79D51809C 26.62 C ID: 10579BD5180CA 26.62 C reset ID: 10AB79D51809C 26.87 C ID: 10579BD5180CA 27.94 C reset ID: 10AB79D51809C 29.44 C ID: 10579BD5180CA 29.62 C reset ID: 10AB79D51809C 30.50 C ID: 10579BD5180CA 30.44 C reset ID: 10AB79D51809C 31.06 C ID: 10579BD5180CA 30.69 C
Quellen:
- http://www.pjrc.com/teensy/td_libs_OneWire.html
- http://www.arduino.cc/playground/Learning/OneWire
- http://tushev.org/articles/electronics/42-how-it-works-ds18b20-and-arduino
DHT22 [DIY]
Beim DHT22 handelt es sich um einen kombinierten Feuchtigkeits- und Temperatursensor. Bedingt durch die Bauweise ist die Temperaturmessung etwas träger, da zwischen dem Sensor noch die gelochte Abdeckung und etwas Freiraum (zwecks Feuchtigkeitsmessung) ist; die DS18X20 Sensoren hingegen reagieren direkt beim Kontakt. Die Feuchtigkeitsmessung hingegen reagiert mit ca. 250 Millisekunden relativ schneller; allerdings kann es einen Datenversatz von bis zu zwei Sekunden geben - d.h. schnelle Messvorgänge ergeben meist die gleichen Werte und machen daher keinen Sinn.
Arduino Code:
// v0.1
#include "DHT.h"
DHT dht(8, DHT22);
void setup() {
Serial.begin(9600);
dht.begin();
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
// check if returns are valid
// if NaN (not a number) something went wrong
if (isnan(t) || isnan(h)) {
Serial.println("read error");
} else {
Serial.print("Humidity: ");
Serial.print(h);
Serial.print("%\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" C");
}
}
In der Beispielschaltung wurde zu Testzwecken ein Sensoren geschaltet, welcher unter einer Abdeckung stand und nach kurzer Zeit mit Atemluft angeblasen bzw. kurz
danach mit einem Feuerzeug erwärmt wurde. Im Abstand weniger Messungen á 5 Sekunden ist die Feuchtigkeit wie erwartet massiv gestiegen, die Temperaturwerte jedoch nur langsam:
Humidity: 52.50% Temperature: 26.10 C // Atemluft 10s Humidity: 59.80% Temperature: 26.10 C Humidity: 75.20% Temperature: 26.10 C // Feuerzeug 10s Humidity: 85.40% Temperature: 26.20 C Humidity: 90.40% Temperature: 26.30 C Humidity: 91.40% Temperature: 26.30 C Humidity: 90.70% Temperature: 26.40 C Humidity: 92.10% Temperature: 26.60 C Humidity: 94.30% Temperature: 26.80 C // max. Hum Humidity: 96.70% Temperature: 27.20 C Humidity: 96.30% Temperature: 27.30 C Humidity: 95.60% Temperature: 27.40 C Humidity: 94.90% Temperature: 27.50 C Humidity: 94.40% Temperature: 27.60 C Humidity: 94.10% Temperature: 27.60 C Humidity: 93.40% Temperature: 27.60 C Humidity: 92.40% Temperature: 27.60 C Humidity: 91.80% Temperature: 27.60 C // max. Temp Humidity: 90.50% Temperature: 27.70 C Humidity: 88.80% Temperature: 27.60 C Humidity: 87.10% Temperature: 27.60 C Humidity: 85.70% Temperature: 27.60 C
Daten verarbeiten
Für die Verarbeitung der gesammelten Sensordaten gibt es folgende Möglichkeiten; beide Varianten setzen ein weiteres System voraus und haben ihre Vor- und Nachteile
- mittels EtherShield als Requestparameter an einen externen Server verschicken oder als Input Event
- + einfache Übergabe der Daten
- - zusätzliche Kosten EtherShield
- - durch EtherShield gehen Ports verloren; ggf. größeres Board nötig
- über serielle Konsole direkt auf die Daten zugreifen
- + keine zusätzlichen Kosten für EtherShield
- + zusätzliche Ports verfügbar durch Verzicht auf EtherShield
- - ggf. umständliche Datenverarbeitung