Tag 0: Alle Flows des Kalenders

Wie in jedem Jahr finden Sie an dieser Stelle alle Programme (dieses Jahr wohl eher Flows) des IoT Adventskalenders 2018. Ich verwende dieses Jahr Pastebin um alle Flows an einer Stelle zu speichern und leichter nachträglich bearbeiten zu können. Außerdem hat Wordpress dann keine Chance die Formatierung oder Sonderzeichen zu verändern. Der einfachste Weg zum Kopieren der Flows ist, auf den “Download Raw” Button zu klicken und die sich öffnende Seite komplett zu kopieren. Wenn Sie dann den Text in Node-Red einfügen (Menü->Import->Clipboard) haben Sie automatisch alle Flows in Tabs strukturiert hinzugefügt. Zusätzliche Nodes müssen eventuell noch nachinstalliert werden (z.B. das UI-Node) ...

07.11.2018 · 1 Minute · Fabian Kainka

WiFi UDP Y-Netzwerk aus drei Pretzelboards und einem Laptop

Anmerkungen von Fabian Kainka: Im Sommer dieses Jahres erreichte mich eine Mail von Dr. Christian Rempel, mit einer Frage zum NanoESP. Im Rahmen eines Jugend forscht-Projektes sollte ein Pflückroboter realisiert werden. Mehrere NanoESP-Boards wurden dafür vernetzt um untereinander und mit einem Laptop Sensordaten auszutauschen. Ganz nebenbei hat das Projekt auch an anderen Stellen Wellen geschlagen, wie hier auf der TEC-IT Homepage. Außerdem ist aus diesem aufregenden Projekt ein Artikel entstanden, der die Problematik sehr gut beschreibt und eine Lösung bietet, die für viele Nutzer sehr nützlich sein sollte. An dieser Stelle möchte ich deswegen den überaus informativen und gut dokumentierten Artikel (sogar in englischer Version) von Dr. Christian Rempel und Laurin Kettner vorstellen. Viel Spaß beim Lesen. ...

08.10.2018 · 9 Minuten · Fabian Kainka

Tag 24: Geschenkbox

Bei dem letzten Versuch in diesem Advent geht es wieder etwas weihnachtlicher zu. Wir basteln eine wiederverwendbare Geschenkbox, mit der Sie Ihre Verwandten beglücken können. Jedes Mal wenn jemand das Geschenk öffnet, wird der Inhalt in einer individuellen Farbe beleuchtet und ein Weihnachtssound ertönt. Hinter dem heutigen Türchen befindet sich eine Reflexlichtschranke. Es handelt sich dabei eigentlich um zwei Bauteile, einer IR-Sendediode und einem Phototransitor. Wie genau Sie die Elemente gepolt werden müssen ist nicht ganz einfach zu erkennen. Deswegen stecken Sie am besten die Lichtschranke nach dem unteren Vorbild mit dem Verbindungskabeln zusammen. Dann können Sie die Polung nicht so leicht vertauschen. ...

24.12.2016 · 6 Minuten · Fabian Kainka

Tag 23: MQTT Climate

Hinter dem heutigen Türchen befindet sich ein Batterie-Clip für einen 9-V-Block, mit dem Sie das gesamte System mobil machen können. Eine Alternative zu einer Batterie ist eine Power-Bank (ein Akku-Pack, normalerweise für Handys). Wie Sie eine 9-V-Batterie richtig anschließen, können Sie dem heutigen Aufbaubild entnehmen. So können Sie eine 9V-Batterie am heutigen Aufbau anschließen Heute sollen erneut Klimadaten erfasst werden. Diesmal werden sie aber über den MQTT-Broker veröffentlicht, und sind deshalb auch weltweit abrufbar. Über ein Plugin könnten so die Daten abgerufen und in einer Datenbank gespeichert werden. ...

23.12.2016 · 5 Minuten · Fabian Kainka

Tag 22: MQTT Cheerlights

In dem heutigen Versuch geht es um MQTT und um ein globales Projekt, das auch letztes Jahr vorgestellt wurde: nämlich das Cheerlights Projekt von Hans Schaaler. Für alle diejenigen, die das Projekt nicht kennen: Es geht um weltweit vernetzte bunte Lichter, die sich simultan über Twitter-Kommandos steuern lassen. Eine andere Version dieses Projekts war Teil des letztjährigen Adventskalenders. Dieses Jahr gibt es die Version mit MQTT und erweiterten Funktionen. Hinter dem heutigen Türchen befindet sich ein Widerstand mit 1 kOhm. Der Aufbau besteht aus der RGB-LED mit Vorwiderständen und einem Taster. ...

22.12.2016 · 6 Minuten · Fabian Kainka

Tag 21: Hausautomation

In dem Versuch des heutigen Tages werden wir die Eigenschaften und Möglichkeiten von MQTT genauer beleuchten, in dem wir ein praktisches Szenario kreieren. In dem Beispiel gibt es ein Gebäude mit zwei Räumen mit jeweils einem Lichtschalter, einem Licht und einem Alarmsensor. Die Lichtschalter schalten das Licht des jeweiligen Raums an oder aus. Die Alarmsensoren aktivieren einen gebäudeweiten Alarm. Normalerweise würden hier sieben verschiedene Geräte zum Einsatz kommen, die alle über einen MQTT-Broker miteinander verbunden sind. Da Sie aber wahrscheinlich nur einen NanoESP haben, simuliert dieser alle Geräte auf einmal. Deswegen sieht der Aufbau des heutigen Tages etwas kompliziert aus. Als zweites Licht wird übriges heute die LED D3 genutzt. Deswegen wird diese heute nicht anzeigen, ob Sie mit dem WLAN-Verbunden sind. Als Alarmsensoren werden die Tiltsensoren an den Verlängerungskabeln genutzt. Man könnte sie beispielsweise an Türen oder Fensterrahmen befestigen, sodass sie einen Alarm triggern wenn sich der Eingang öffnet. Hinter dem heutigen Türchen befindet sich auch der zweite Sensor. ...

21.12.2016 · 5 Minuten · Fabian Kainka

Tag 20: MQTT (Message Queue Telemetry Transport)

Für die letzten Tage in diesem Advent werden Sie nun ein Thema kennenlernen, welches eine große Rolle im Bereich IoT spielt. Es geht um das Nachrichten-Protokoll MQTT (Message Queue Telemetry Transport) welches speziell für die Kommunikation von Machschienen zu Maschinen (M2M) entwickelt wurde. Der Grund warum dieses Protokoll so genial ist, liegt in der Kompaktheit und Einfachheit, mit der Daten wie Steuerdaten, Messdaten oder Texte, ausgetauscht werden können. Im Vergleich zum HTTP ist der Overhead (Daten die neben den eigentlichen Nutzdaten übermittelt werden) sehr kurz und können gerade von Embeded Devices, also Mikrocontrollern wie unserem NanoESP, gut verarbeitet werden. Gleichzeitig muss der Controller nicht selbst immer wieder eine Verbindung aufbauen und erfragen, ob es eine Veränderung gab, sondern die Verbindung wird dauerhaft gehalten und der Client automatisch über Veränderungen Informiert. ...

20.12.2016 · 5 Minuten · Fabian Kainka

Tag 19: Konfigurationsseite für den NanoESP

Hinter dem heutigen Türchen befindet sich ein weiteres Kabel. Mit den beiden Kabeln ist es nun möglich z.B. die RGB LED auch abseits des Boards zu platzieren. Die RGB-LED werden wir heute auch benötigen, denn es geht um eine Webseite, über die die Farbe der LED eingestellt werden kann. Doch das ist nicht der Hauptaspekt: Um das Konfigurieren des NanoESP nicht nur für Programmierer besonders einfach zu gestalten, gibt es eine Konfigurationsseite, über die die WLAN-Daten des Moduls eingestellt werden können. Doch zunächst zum Aufbau: ...

19.12.2016 · 5 Minuten · Fabian Kainka

Tag 18: Klimaüberwachung

Hinter dem heutigen Türchen befindet sich ein ganz besonderes Bauteil, nämlich ein Luftfeuchtesensor. Zusammen mit dem Phototransistor und dem NTC bauen Sie heute eine Klimastation für den Heimgebrauch. Dazu ist folgender Aufbau nötig: Der Aufbau mit allen Sensoren Der heutige Aufbau ist etwas kniffelig. Vor allem an der Stelle, an der das rechte Poti auf dem Bild sitzt, kommt es zu einer Berührung mit dem NanoESP. Dies ist aber nicht weiter schlimm, solange der auf dem Bild linke Kontakt fest im Board steckt. ...

18.12.2016 · 4 Minuten · Fabian Kainka

Tag 17: Wake Up Light

Das Projekt des heutigen Tages orientiert sich an einer bekannten Lampe von Phillips, dem Wake Up Light. Es handelt sich dabei um einen sanften Wecker, denn anstelle laut zu tönen wird langsam die Helligkeit erhöht. So entsteht eine Art Sonnenaufgang und der Körper wird auf natürliche Weise wach. Hinter dem heutigen Türchen befindet sich ein weites Poti, welches für den morgigen Versuch wichtig ist. Heute wird folgender Aufbau benötigt: Die RGB LED mit Vorwiderständen Das Programm: A16_P17_WakeUpLight.ino /* TCP-Server: Wakeup light Change SSID and PASSWORD. RGB-Led (common cathode) on Pins 3,5,6 */ #include <NanoESP.h> #include <NanoESP_HTTP.h> #include <SoftwareSerial.h> #include "Websites.h" #include <math.h> #include <Time.h> #define SSID "YourSSID" #define PASSWORD "YourPassword" #define LED_WLAN 13 #define RED 3 #define GREEN 5 #define BLUE 6 #define GND 4 #define BUTTON 7 NanoESP nanoesp = NanoESP(); NanoESP_HTTP http = NanoESP_HTTP(nanoesp); //String timeServerIP = ; // time.nist.gov NTP server address String ntpServerName = "195.145.119.188";//"time.nist.gov"; const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets int alarmHour = 0, alarmMinute = 2; bool alarm; byte cRed = 0, cBlue = 0, cGreen = 0; unsigned long previousMillis = 0; // will store last time a msg was send unsigned long interval = 78; // void setup() { Serial.begin(19200); nanoesp.init(); pinMode(RED, OUTPUT); pinMode(GREEN, OUTPUT); pinMode(BLUE, OUTPUT); pinMode(GND, OUTPUT); digitalWrite(GND, LOW); pinMode(BUTTON, INPUT); //Only Station Mode for TimeSync nanoesp.configWifiMode(STATION); //delay(1000); // Wait till Connected to WiFi if (nanoesp.wifiConnected())digitalWrite(LED_WLAN, HIGH); else Serial.println(F("Error WLAN Connect")); //Start TCP Server if (nanoesp.startTcpServer(80)) Serial.println(F("TCP Server Activ")); else Serial.println(F("TCP Server Error")); //Print IP in Terminal Serial.println(nanoesp.getIp()); setSyncProvider(getNtpTime); Show_Time(); } time_t getNtpTime() { //convert to time_t , Paramter: connectionId, ServerAdress, Timezone return (time_t)getNTPpacket(4, ntpServerName, 2); } void loop() { String method, ressource, parameter; int id ; if (http.recvRequest(id, method, ressource, parameter)) { Serial.println("New Request from id :" + String(id) + ", method: " + method + ", ressource: " + ressource + " parameter: " + parameter); if (ressource == "/") { http.sendFromFlash(id, index, sizeof(index)); nanoesp.closeConnection(id); } if (ressource == "/settimer") { if (parameter != "") { //timer=02%3A03& String sHour = parameter.substring(parameter.indexOf('=') + 1, parameter.indexOf('%')); String sMin = parameter.substring(parameter.indexOf('A') + 1, parameter.indexOf('&')); String sDuration = parameter.substring(parameter.indexOf('&') + 1); sDuration = sDuration.substring(sDuration.indexOf('=') + 1, sDuration.indexOf('&')); alarmHour = sHour.toInt(); alarmMinute = sMin.toInt(); int iDuration = sDuration.toInt(); interval *= iDuration; Serial.println("Timer: " + String(alarmHour) + ":" + String(alarmMinute) + " Duartion: " + String (iDuration) ); Show_Time(); } nanoesp.closeConnection(id); } if (ressource == "/turnoff") { alarm = false; cRed = 0; cBlue = 0; cGreen =0; analogWrite(RED,cRed); analogWrite(BLUE,cBlue);analogWrite(GREEN,cGreen); } else { http.sendFromFlash(id, error404, sizeof(error404)); nanoesp.closeConnection(id); } } else { if (hour() == alarmHour) { if (minute() == alarmMinute) { if (!alarm) alarm = true; } } if (alarm) wakeUp(); } } void MorningAlarm() { Serial.println("Alarm: - turn lights off"); } void wakeUp() { if (millis() - previousMillis >= interval) { previousMillis = millis(); if (cRed == 0) Show_Time(); if (cRed < 255) { cRed++; analogWrite(RED, cRed ); } else { if (cGreen < 255) { cGreen++; analogWrite(GREEN, cGreen); } else { if (cBlue < 255) { cBlue++; analogWrite(BLUE, cBlue ); if (cBlue == 255) Show_Time(); } } } } } // prepare an NTP request to the time server and send to the given bool sendNTPpacket(int id, String address) { // set all bytes in the buffer to 0 memset(packetBuffer, 0, NTP_PACKET_SIZE); // Initialize values needed to form NTP request // (see URL above for details on the packets) packetBuffer[0] = 0b11100011; // LI, Version, Mode packetBuffer[1] = 0; // Stratum, or type of clock packetBuffer[2] = 6; // Polling Interval packetBuffer[3] = 0xEC; // Peer Clock Precision // 8 bytes of zero for Root Delay & Root Dispersion packetBuffer[12] = 49; packetBuffer[13] = 0x4E; packetBuffer[14] = 49; packetBuffer[15] = 52; // // if we need a cr/lf // packetBuffer[NTP_PACKET_SIZE ] = 0x0D; packetBuffer[NTP_PACKET_SIZE + 1] = 0x0A; // all NTP fields have been given values, now // you can send a packet requesting a timestamp: if ( nanoesp.sendRaw(id, packetBuffer, NTP_PACKET_SIZE)) return true; return false; } long getNTPpacket(int id, String address, int timeZone) { unsigned long secsSince1900; byte offset = 40; if (!nanoesp.newConnection(id, UDP, address, 123)) Serial.println ("no connection ntp server"); //NTP requests are to port 123 delay(100); if (!sendNTPpacket(id, address)) { Serial.println("No time request send"); return 0; } nanoesp.setTimeout(2000); if (nanoesp.find("+IPD,")) { int vid = nanoesp.parseInt(); nanoesp.find(","); int len = nanoesp.parseInt(); //Serial.println(String(len)); byte buffer[len]; nanoesp.find(":"); nanoesp.readBytes(buffer, 48); // for (int i = 0; i <= NTP_PACKET_SIZE; i++) { // Serial.print(buffer[i], HEX); // } // convert four bytes starting at location 40 to a long integer secsSince1900 = (unsigned long)buffer[offset + 0] << 24; secsSince1900 |= (unsigned long)buffer[offset + 1] << 16; secsSince1900 |= (unsigned long)buffer[offset + 2] << 8; secsSince1900 |= (unsigned long)buffer[offset + 3]; nanoesp.find("OK\r\n"); nanoesp.closeConnection(id); // return secsSince1900 + timeZone * SECS_PER_HOUR; // NTP Date return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR; // UNIX Date } else { Serial.println("no time recieved"); nanoesp.closeConnection(id); return 0; } } void Show_Time() { String shour, sminute, ssecond; Serial.print("Date: "); Serial.print(day()); Serial.print("."); Serial.print(month()); Serial.print("."); Serial.println(year()); if (hour() <= 9) shour = "0" + String(hour()); else shour = String(hour()); // adjust for 0-9 if (minute() <= 9) sminute = "0" + String(minute()); else sminute = String(minute()); if (second() <= 9) ssecond = "0" + String(second()); else ssecond = String(second()); Serial.println( "Time: " + shour + ":" + sminute + ":" + ssecond ); } (Die frühere Einbettung über Arduino Create ist nicht mehr verfügbar; der Code stammt aus dem Download aller Programme.) ...

17.12.2016 · 5 Minuten · Fabian Kainka