Schalten Sie einen Ventilator ein, wenn die Temperatur zu hoch ist! - Elektro-Imp-Tutorial
In unserem letzten Electric Imp-Tutorial haben wir gelernt, wie man mit Ubidots . Dieses Mal werden wir eine einfache Ein-Aus-Lüftersteuerung durchführen. Wir protokollieren die Temperatur bei Ubidots und lösen ein Ereignis aus, wenn die Temperatur über 30 °C liegt, sodass der Electric Imp einen Ventilator einschaltet, und dann einen Auslöser, um ihn auszuschalten, wenn die Temperatur unter 27 °C liegt.
Es funktioniert wirklich wie ein Zauber, also los geht's:
Materialien
- Drei Buchsen-zu-Buchsen-Drähte
- 10k Widerstand
- DHT11 Feuchtigkeits- und Temperatursensor
-Ein kleiner Fan
-Ein PowerSwitch-Schwanz
Verdrahtung
So sollten alle Komponenten angeschlossen werden:
…und nur noch eines: Schließen Sie Ihren Ventilator an!
Codierung
- Melden Sie sich bei der Electric Imp-IDE an und notieren Sie sich die URL Ihres Imp:
Kopieren Sie die nächsten beiden Codes. Im Agentencode verwenden wir eine Funktion, um HTTP-Anfragen an Ubidots zu verarbeiten. Vergessen Sie nicht, Ihr Ubidots -Token und Ihre Variablen-ID anzugeben.
- Agentencode:
device.on("temp", function(value) { //server.log("Versuch, 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/53d2beb37625 424630223dac/ Werte"; // Ersetzen Sie die Variablen-ID durch Ihre lokale Zeichenfolge = {"Wert": Wert}; lokale Anforderung = http.post(url, headers, http.jsonencode(string)); lokale Antwort = request.sendsync(); }); device.on("hum", function(value) { //server.log("Versuch, den Wert:hola auf Ubi zu posten"); //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/53e541e57 625422c7d900a1d /values"; // Ersetzen Sie die Variablen-ID durch Ihre lokale Zeichenfolge = {"Wert": Wert}; lokale Anforderung = http.post(url, headers, http.jsonencode(string)); lokale Antwort = request.sendsync() ; }); function requestHandler(request, Response) { try { // prüfen, ob der Benutzer led als Abfrageparameter gesendet hat if ("relay" in request.query) { server.log("entre"); // wenn ja, und led=1.. setzen Sie unsere Variable auf 1 if (request.query.relay == "1" || request.query.relay == "0") { // Konvertieren Sie den LED-Abfrageparameter zu einem lokalen Ganzzahl-RelayState = request.query.relay.tointeger(); // „LED“-Nachricht an das Gerät senden und LedState als Daten senden device.send("relay", RelayState); } } // Eine Antwort zurücksenden, die besagt, dass alles in Ordnung war. Response.send(200, „OK“); } Catch (ex) { Response.send(500, „Internal Server Error:“ + Ex); } } // den HTTP-Handler registrieren http.onrequest(requestHandler);
- Gerätecode:
Beachten Sie den letzten Teil des Codes, in dem es eine Funktion zum Ein-/Ausschalten des Lüfters mit dem Powerswitch-Endstück gibt.
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); } } Relais <- hardware.pin8; spi <- hardware.spi257; rele.configure(DIGITAL_OUT); Funktion setRelay(relayState){ server.log("relayState:" + RelayState ); Relay.write(RelayState); } agent.on("relay", setRelay); function mainLoop(){imp.wakeup(1.0, mainLoop); 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); agent.send("hum",data.rh); }mainLoop();
Richten Sie Ubidots -Events ein
-
Erstellen Sie in Ihrem Ubidots -Konto eine Datenquelle mit zwei Variablen: Temperatur und Luftfeuchtigkeit
-
Klicken Sie auf den Abschnitt „Ereignisse“ und fügen Sie eines hinzu:
- Wählen Sie Electric imp als Quelle und Temperatur (temp) als Variable.
- Stellen Sie eine Bedingung ein, wenn die Temperatur über 30 °C liegt.
- Wählen Sie „URL anfordern“ und geben Sie Ihre Imp-URL plus „?relay=1“ ein.
- Fügen Sie mit dieser Bedingung ein weiteres Ereignis hinzu.
- Wählen Sie „URL anfordern“ und geben Sie Ihre Imp-URL plus „?relay=0“ ein.
Einpacken
In diesem Projekt konnten wir mit Electric Imp einen elektrischen Ventilator über das Internet steuern. So wie wir einen Lüfter anhand von Temperaturdaten gesteuert haben, können Sie auch beliebige andere Daten protokollieren und darauf basierend Maßnahmen ergreifen. Sie könnten zum Beispiel Ihr Garagentor öffnen, wenn sich Ihre Katze einem Bewegungssensor nähert (was bedeutet, dass sie raus will!).
Vergessen Sie nicht, sich einige unserer neuesten Beiträge anzusehen:
- Verbinde einen elektrischen Kobold (imp002) mit Ubidots
- Erstellen eines Echtzeit-Karten-Widgets mit Ubidots
Wenn Sie neu bei Ubidots , schauen Sie sich dieses tolle Einstiegsstück und melden Sie sich noch heute kostenlos an!