Protokollierung von Temperatur, Luftfeuchtigkeit und Taupunkt mit elektrischem Impaktor

Der Electric Imp ist ein fantastisches Gerät für IoT -Projekte. Dank der Integration mit Ubidots lassen sich Diagramme und SMS-/E-Mail-Benachrichtigungen in wenigen Minuten erstellen. In diesem Tutorial zeigen wir Ihnen, wie Sie mit dem Electric Imp Breakout Board und einem DHT11-Sensor Temperatur und relative Luftfeuchtigkeit messen und anschließend den Taupunkt mithilfe Ubidots -Engine berechnen.

Der Taupunkt kann als Indikator für das menschliche Komfortempfinden in Bezug auf das Wetter verwendet werden; ein Taupunkt zwischen 13 und 16 °C (55–59 °F) sorgt für ein angenehmes Gefühl, aber ein Taupunkt über 21 °C (70 °F) führt zu einem zu warmen Gefühl, da die Luft zu viel Feuchtigkeit enthält und der Körper sich nicht abkühlen kann:

Taupunkt Menschliche Wahrnehmung
24–26 °C / 75–80 °F Äußerst unangenehm, bedrückend
21–24 °C / 0–74 °F Sehr schwül, ziemlich unangenehm
18–21 °C / 65–69 °F Für die meisten Menschen am oberen edge etwas unangenehm
16–18 °C / 60–64 °F Für die meisten in Ordnung, aber alle empfinden die Luftfeuchtigkeit als etwas edge
13–16 °C / 55–59 °F Komfortabel
10-12 °C / 50-54 °F Sehr komfortabel
Unter 10 °C / 50–54 °F Sehr komfortabel
Unter 10 °C / Unter 50 °F Ein bisschen trocken
Unter 10 °C / Unter 50 °F Zum Glück gibt es eine lineare Funktion zur Berechnung des Taupunkts anhand der Temperatur und der relativen Luftfeuchtigkeit.

Materialien

  • Ein Kobold

  • Ein elektrisches Imp Breakout-Board

  • Drei weibliche auf weibliche Drähte

  • 10k Widerstand

  • DHT11 Feuchtigkeits- und Temperatursensor

Verdrahtung

So wird der DHT11-Sensor an Ihre Electric Imp-Platine angeschlossen:

Code

Zeit zum Programmieren! Bei der Arbeit mit Electric imp benötigen Sie zwei Codeabschnitte: einen für das Gerät und einen für den Agenten. Hier ist der Gerätecode (etwas länger, da er die Klasse zur Ansteuerung des DHT11 enthält):

const SPICLK = 937.5; // Klasse zum Auslesen des DHT11 Temperatur-/Feuchtigkeitssensors // Diese Sensoren verwenden ein proprietäres Ein-Draht-Protokoll. Der Imp // emuliert dieses Protokoll mit SPI. // Verwendung: // - MOSI mit MISO über einen 10kΩ-Widerstand verbinden // - MISO mit der Datenleitung des Sensors verbinden class DHT11 { static STARTTIME_LOW = 0.001000; // 1 ms Low-Zeit für den Start static STARTTIME_HIGH = 0.000020; // Mindestens 20 µs High-Zeit für den Start static STARTTIME_SENSOR = 0.000080; // 80 µs Low-/80 µs High-„ACK“ vom Sensor beim Start static MARKTIME = 0.000050; // 50 µs Low-Impuls zwischen 0- und 1-Markierungen static ZERO = 0.000026; // 26 µs High für „0“ static ONE = 0.000075; // 70 µs High für "1" spi = null; clkspeed = null; bittime = null; bytetime = null; start_low_bits = null; start_low_bytes = null; start_high_bits = null; start_high_bytes = null; start_ack_bits = null; start_ack_bytes = null; mark_bits = null; mark_bytes = null; zero_bits = null; zero_bytes = null; one_bits = null; one_bytes = null; // Klassenkonstruktor // Eingabe: // _spi: ein vorkonfiguriertes SPI-Peripheriegerät (z. B. spi257) // _clkspeed: die konfigurierte Geschwindigkeit des SPI // Rückgabe: (None) constructor(_spi, _clkspeed) { this.spi = _spi; this.clkspeed = _clkspeed; bittime = 1.0 / (clkspeed * 1000); bytetime = 8.0 * bittime; start_low_bits = STARTTIME_LOW / bittime; start_low_bytes = (start_low_bits / 8); start_high_bits = STARTTIME_HIGH / bittime; start_high_bytes = (start_high_bits / 8); start_ack_bits = STARTTIME_SENSOR / bittime; start_ack_bytes = (start_ack_bits / 8); mark_bits = MARKTIME / bittime; mark_bytes = (mark_bits / 8); zero_bits = ZERO / bittime; zero_bytes = (zero_bits / 8); one_bits = ONE / bittime; one_bytes = (one_bits / 8); } // Hilfsfunktion // Gegeben ein langer Blob, werden die Zeiten zwischen Übergängen ermittelt und in // Temperatur- und Feuchtigkeitswerte geparst. Geht von einem 40-Bit-Rückgabewert aus (16 Werte für Luftfeuchtigkeit / 16 Werte für Temperatur / 8 Werte für Prüfsumme) // Eingabe: // HexBlob (Blob beliebiger Länge) // Rückgabe: // Tabelle mit: // "rh": relative Luftfeuchtigkeit (float) // "temp": Temperatur in Celsius (float) // Bei einem Lesefehler geben rh und temp 0 zurück function parse(hexblob) { local laststate = 0; local lastbitidx = 0; local gotack = false; local rawidx = 0; local result = blob(5); // 2 Byte Luftfeuchtigkeit, 2 Byte Temperatur, 1 Byte Prüfsumme local humid = 0; local temp = 0; // Iteriere durch jedes Bit jedes Bytes des zurückgegebenen Signals für (local byte = 0; byte < hexblob.len(); byte++) { for (local bit = 7; bit >= 0; bit--) { local thisbit = (hexblob[byte] & (0x01 << bit)) ? 1:0; if (thisbit != laststate) { if (thisbit) { // Übergang von niedrig nach hoch; beobachte, wie lange es hoch ist laststate = 1; lastbitidx = (8 * byte) + (7 - bit); } else { // Übergang von hoch nach niedrig; laststate = 0; local idx = (8 * byte) + (7 - bit); local hightime = (idx - lastbitidx) * bittime; // Wir haben jetzt ein gültiges Informationsbit. Bestimme, welches Symbol es ist. local resultbyte = (rawidx / 8); local resultbit = 7 - (rawidx % 8); //server.log(format("bit %d of byte %d",resultbit, resultbyte)); if (hightime < ZERO) { // this is a zero if (gotack) { // don't record any data before the ACK is seen result[resultbyte] = result[resultbyte] & ~(0x01 << resultbit); rawidx++; } } else if (hightime < ONE) { // this is a one if (gotack) { result[resultbyte] = result[resultbyte] | (0x01 << resultbit); rawidx++; } } else { // this is a START ACK gotack = true; } } } } } //server.log(format("parsed: 0x %02x%02x %02x%02x %02x",result[0],result[1],result[2],result[3],result[4])); humid = (result[0] * 1.0) + (result[1] / 1000.0); if (result[2] & 0x80) { // negative Temperatur result[2] = ((~result[2]) + 1) & 0xff; } temp = (result[2] * 1.0) + (result[3] / 1000.0); if (((result[0] + result[1] + result[2] + result[3]) & 0xff) != result[4]) { return {"rh":0,"temp":0}; } else { return {"rh":humid,"temp":temp}; } } // Sensor auslesen // Eingabe: (keine) // Rückgabe: // Tabelle mit: // "rh": relative Luftfeuchtigkeit (float) // "temp": Temperatur in Celsius (float) // Bei Lesefehlern geben rh und temp 0 zurück function read() { local bloblen = start_low_bytes + start_high_bytes + (40 * (mark_bytes + one_bytes)); local startblob = blob(bloblen); for (local i = 0; i < start_low_bytes; i++) { startblob.writen(0x00,'b'); } for (local j = start_low_bytes; j < bloblen; j++) { startblob.writen(0xff,'b'); } //server.log(format("Sending %d bytes", startblob.len())); local result = spi.writeread(startblob); return parse(result); } } rele <- hardware.pin9; spi <- hardware.spi257; while(1){ clkspeed <- spi.configure(MSB_FIRST, SPICLK); dht11 <- DHT11(spi, clkspeed); data <- dht11.read(); server.log(format("Relative Humidity: %0.1f",data.rh)+" %"); server.log(format("Temperature: %0.1f C",data.temp)); agent.send("temp",data.temp); imp.sleep(1); }

Vielen Dank an Thomas Byrne für die Bereitstellung der Klasse zur Ansteuerung des DHT11-Sensors auf GitHub .

Wie Sie sehen, ist der Agentencode sehr einfach. Vergessen Sie nur nicht, Ihr eigenes Authentifizierungstoken und Ihre Variable-ID in den HTTP-Aufruf einzufügen:

device.on("temp", function(value) { server.log("Versuche, den Wert an Ubi zu senden:"); server.log(value); local headers = { "Content-Type": "application/json", "X-Auth-Token": "NBbF3PWPxWc2IaO40aXOKnhIu8tOv92rYN3ibiEc7Jh6GV3KZUUCHtXuNz7Y" }; // Ersetzen Sie das Token durch Ihr eigenes local url = "ubidots"; // Ersetzen Sie die Variablen-ID durch Ihre eigene local string = {"value": value}; local request = http.post(url, headers, http.jsonencode(string)); local response = request.sendsync(); });

Eine synthetische Variable in Ubidotserstellen.

Genau wie beim Hinzufügen einer neuen Variable gehen Sie zu „Quellen“ → „Electric Imp (Ihr Datenquellenname)“ → „Neue Variable hinzufügen“:

Geben Sie nun diese Gleichung ein, um den Taupunktwert zu berechnen:

So sollte es aussehen:

Sie sollten nun sehen, wie die Taupunktdaten jedes Mal aktualisiert werden, wenn Ihr Imp Temperatur- und Feuchtigkeitsdaten an Ubidotssendet!

Zusammenfassung

In diesem Projekt konnten wir einen Imp mit Ubidotsverbinden und physikalische Variablen messen und berechnen, um unsere Umgebung besser zu verstehen. Sie können weitere Funktionen erkunden, z. B. Warnmeldungen bei zu hohem Taupunkt einrichten oder teilbare Diagramme wie die am Anfang dieses Artikels erstellen.

Vergessen Sie nicht, einen Blick auf unsere neuesten Beiträge zu werfen:

Ubidots noch nicht kennen , klicken Sie hier, um loszulegen!