Protokollierung von Temperatur, Luftfeuchtigkeit und Taupunkt mit elektrischem Imp
Der Electric Imp ist ein erstaunliches Gerät für IoT Projekte und seine Integration mit Ubidots macht es sehr einfach, in wenigen Minuten Diagramme und SMS-/E-Mail-Benachrichtigungen zu erstellen. In diesem Electric Imp-Tutorial zeigen wir Ihnen, wie Sie das Electric Imp-Breakout-Board mit einem DHT11-Sensor verwenden, um Temperatur und relative Luftfeuchtigkeit zu messen und anschließend den Taupunkt mit der Ubidots .
Der Taupunkt kann als Index für die menschliche Wahrnehmung von Komfort in Bezug auf das Wetter verwendet werden; Bei einem Taupunkt zwischen 13 und 16 °C (55 und 59 °F) fühlen Sie sich wohl, bei einem Taupunkt über 21 °C (70 °F) fühlen Sie sich jedoch zu warm, da die Luft zu viel Feuchtigkeit und Ihren Körper enthalten würde Konnte nicht abkühlen:
Taupunkt | Menschliche Wahrnehmung |
24-26°C / 75-80°F | Äußerst unangenehm, bedrückend |
21-24°C / 0-74°F | Sehr feucht, ziemlich ungemütlich |
18-21°C / 65-69°F | Für die meisten Menschen am oberen Rand etwas unangenehm |
16-18°C / 60-64°F | Für die meisten ok, aber alle nehmen die Luftfeuchtigkeit am oberen Rand wahr |
13-16°C / 55-59°F | Komfortabel |
10-12°C / 50-54°F | Sehr bequem |
Unter 10°C / 50-54°F | Sehr bequem |
Unter 10°C / Unter 50°F | Etwas trocken |
Unter 10°C / Unter 50°F | Glücklicherweise gibt es eine lineare Funktion zur Berechnung des Taupunkts basierend auf Temperatur und relativer Luftfeuchtigkeit. |
Materialien
- Ein Kobold
- Ein Electric Imp Breakout Board
- Drei Buchsen-zu-Buchsen-Drähte
- 10k Widerstand
- DHT11 Feuchtigkeits- und Temperatursensor
Verdrahtung
So wird der DHT11-Sensor an Ihr Electric Imp-Board angeschlossen:
Code
Zeit zum Codieren! Wenn Sie mit Electric Imp arbeiten, benötigen Sie zwei Codeabschnitte: einen für das Gerät und einen anderen für den Agenten. Hier ist der Gerätecode (etwas zu lang, da er über die Klasse verfügt, um DHT11 zu verarbeiten):
const SPICLK = 937,5; // Klasse zum Lesen des DHT11-Temperatur-/Feuchtigkeitssensors // Diese Sensoren verwenden ein proprietäres Eindrahtprotokoll. Der Imp // emuliert dieses Protokoll mit SPI. // Zu verwenden: // - MOSI mit einem 10k-Widerstand an MISO binden // - MISO an die Datenleitung der Sensorklasse DHT11 binden { static STARTTIME_LOW = 0.001000; // 1 ms niedrige Zeit für den Start static STARTTIME_HIGH = 0.000020; // 20 us min höchste Zeit für den Start static STARTTIME_SENSOR = 0.000080; // 80 us niedrig / 80 us hoch „ACK“ vom Sensor an START static MARKTIME = 0,000050; // 50 us niedriger Puls zwischen 0 oder 1 Markierungen static NULL = 0,000026; // 26 us hoch für „0“ static ONE = 0.000075; // 70 us hoch für „1“ spi = null; clkspeed = null; Bitzeit = null; Bytezeit = 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; null_bits = null; null_bytes = null; one_bits = null; one_bytes = null; // Klassenkonstruktor // Eingabe: // _spi: ein vorkonfiguriertes SPI-Peripheriegerät (z. B. spi257) // _clkspeed: die Geschwindigkeit, mit der das SPI ausgeführt werden soll // Rückgabe: (Keine) Konstruktor(_spi, _clkspeed) { this.spi = _spi; this.clkspeed = _clkspeed; Bitzeit = 1,0 / (clkspeed * 1000); Bytezeit = 8,0 * Bitzeit; start_low_bits = STARTTIME_LOW / Bitzeit; start_low_bytes = (start_low_bits / 8); start_high_bits = STARTTIME_HIGH / Bitzeit; 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 = NULL / Bitzeit; null_bytes = (null_bits / 8); one_bits = EINS / Bitzeit; one_bytes = (one_bits / 8); } // Hilfsfunktion // Bei einem langen Blob Zeiten zwischen Übergängen ermitteln und // Temperatur- und Luftfeuchtigkeitswerte analysieren. Nimmt einen 40-Bit-Rückgabewert an (16 Luftfeuchtigkeit / 16 Temperatur / 8 Prüfsumme) // Eingabe: // Hexblob (Blob beliebiger Länge) // Rückgabe: // Tabelle mit: // „rh“: relative Luftfeuchtigkeit (Float) / / „temp“: Temperatur in Celsius (Float) // Wenn der Lesevorgang fehlschlägt, geben rh und temp 0 zurück. function parse(hexblob) { local laststate = 0; lokale lastbitidx = 0; lokaler gotack = false; lokales rawidx = 0; lokales Ergebnis = blob(5); // 2 Byte Luftfeuchtigkeit, 2 Byte Temperatur, 1 Byte Prüfsumme lokale Luftfeuchtigkeit = 0; lokale Temperatur = 0; // Jedes Bit jedes Bytes des zurückgegebenen Signals durchlaufen for (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; Beobachten Sie, wie lange es hoch ist laststate = 1; lastbitidx = (8 * Byte) + (7 - Bit); } else { // High-to-Low-Übergang; letzter Zustand = 0; lokales idx = (8 * Byte) + (7 - Bit); local hightime = (idx - lastbitidx) * bittime; // wir haben jetzt eine gültige Information. Finden Sie heraus, um welches Symbol es sich handelt. lokales Ergebnisbyte = (rawidx / 8); lokales Ergebnisbit = 7 - (rawidx % 8); //server.log(format("bit %d of byte %d",resultbit, resultbyte)); if (hightime < ZERO) { // Dies ist eine Null if (gotack) { // keine Daten aufzeichnen, bevor die Bestätigung gesehen wird result[resultbyte] = result[resultbyte] & ~(0x01 << resultbit); rawidx++; } } else if (hightime < ONE) { // das ist eine Eins if (gotack) { result[resultbyte] = result[resultbyte] | (0x01 << Ergebnisbit); rawidx++; } } else { // Dies ist ein START ACK gotack = true; } } } } } //server.log(format("parsed: 0x %02x%02x %02x%02x %02x",result[0],result[1],result[2],result[3],result [4])); feucht = (Ergebnis[0] * 1,0) + (Ergebnis[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}; } } // Den Sensor lesen // Eingabe: (keine) // Rückgabe: // Tabelle mit: // „rh“: relative Luftfeuchtigkeit (Float) // „temp“: Temperatur in Celsius (Float) // wenn gelesen schlägt fehl, rh und temp geben 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("Senden von %d Bytes", startblob.len())); lokales Ergebnis = spi.writeread(startblob); return parse(result); } } rele <- hardware.pin9; spi <- hardware.spi257; while(1){ clkspeed <- spi.configure(MSB_FIRST, SPICLK); dht11 <- DHT11(spi, clkspeed); Daten <- dht11.read(); server.log(format("Relative Luftfeuchtigkeit: %0.1f",data.rh)+" %"); server.log(format("Temperatur: %0.1f C",data.temp)); agent.send("temp",data.temp); imp.sleep(1); }
Vielen Dank an Thomas Byrne für die Bereitstellung der Klasse zum Umgang mit dem DHT11-Sensor in Github .
Wie Sie sehen, ist der Agent-Code wirklich einfach. Vergessen Sie jedoch nicht, Ihr eigenes Authentifizierungstoken und Ihre Variablen-ID in den HTTP-Aufruf einzufügen:
device.on("temp", function(value) { server.log("Es wird versucht, den Wert an Ubi zu senden:"); server.log(value); local headers = { "Content-Type": "application/json ", "X-Auth-Token": "NBbF3PWPxWc2IaO40aXOKnhIu8tOv92rYN3ibiEc7Jh6GV3KZUUCHtXuNz7Y" }; // Ersetzen Sie das Token durch Ihre lokale URL = "http://things. ubidots .com/api/v1.6/variables/53d2beb3762542463 0223dac/values"; / / Ersetzen Sie die Variablen-ID durch Ihre lokale Zeichenfolge = {"value": value}; local request = http.post(url, headers, http.jsonencode(string));
Erstellen Sie eine synthetische Variable auf Ubidots .
So wie Sie eine neue Variable hinzufügen würden, gehen Sie zu „Quellen“ -> „Electric Imp (Name Ihrer Datenquelle)“ -> „Neue Variable hinzufügen“:
Geben Sie nun diese Gleichung ein, um den Taupunktwert zu berechnen:
So sollte es aussehen:
Sie sollten jetzt sehen, dass die Taupunktdaten jedes Mal aktualisiert werden, wenn Ihr Imp Temperatur- und Luftfeuchtigkeitsdaten an Ubidots übermittelt!
Einpacken
In diesem Projekt konnten wir einen Imp mit Ubidots verbinden und physikalische Variablen messen und berechnen, um unsere Umgebung besser zu verstehen. Sie können weitere Dinge erkunden, wie zum Beispiel das Erstellen von Warnungen, wenn der Taupunkt zu hoch ist, oder das Erstellen gemeinsam nutzbarer Diagramme wie die am Anfang dieses Artikels.
Vergessen Sie nicht, sich einige unserer neuesten Beiträge anzusehen:
- Die Kraft des Educating-by-Making
- Erstellen eines plattformübergreifenden Systemmonitors mit Ubidots
Wenn Sie neu bei Ubidots , klicken Sie hier, um loszulegen!