Sensorino - Auslesen verschiedener Sensoren mit Arduino

Aus Laub-Home Wiki
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:
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
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
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:




Druck / Schließung

Einsatzgebiete:
  • Verschlussprüfung Türen / Fenster
Hardware:
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)
Vorteile
  • kleine Bauform
Kosten

~ 0,55 € (Schalter) [Reichelt]
~ 2,20 € (fertiges Modul) [Reichelt]

Nachteile
  • zwei Bauteile (Schalter und Magnet)




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:
  • nicht-invasive Meßmethode
  1. Open energy Monitor Link => ca. 175 EUR mit 3 Phasenklemmen
  2. Flukso => ca. 155 EUR mit 3 Phasenklemmen
  • digitale Stromzähler mit S0-Bus (1 Phase: 20-40 EUR / 3 Phasen: 40-160 EUR) [z.B. im RZL ist ein Eltako DSZ12D verbaut Link ca. 150 EUR]


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


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-poliger Klinkenstecker (oder Buchse), 2.5mm (*1)

3-Pin Connector (Phobyas Fan Connector) Stecker oder Buchse

0,22 EUR

~ 1,00 EUR

Reichelt Art.-Nr.: KSS 25

Stecker eBay: 110868744568
Buchse eBay: 251083564217

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.


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:

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:



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

Daten via Netzwerk

Daten via serieller Konsole

Visualisierung

Erstes Visualisierungskonzept: