WiFi UDP Y-Network consisting of three NanoESP (Pretzel Boards) and Laptop

Download: Ernteroboter_Programme We have designed a computer network consisting of one Server (NanoESP S), two Arduino Clients (NanoESP C1 and C2) and a Laptop as third Client (running there either Packet Sender https://packetsender.com/download or TWedge of TEC-IT https://www.tec-it.com/de/download/Default.aspx ), to construct a small UDP WiFi network. We denote it as Y-configuration, which symbolizes the connections. The center is the Server S, at the ends of the inclined arms of the Y are the Arduino Clients C1 and C2 and the vertical line is the connection to the Laptop as third Client. ...

08.10.2018 · 7 min · Fabian Kainka

Ausgelagerte Webseiten für den NanoESP

Gerade im Kontext des Adventskalenders oder den anderen Lernpaketen habe ich einige HTML-Seiten für den NanoESP entworfen. Allerdings hat mich dabei immer gestört, dass zum einen der Speicherplatz ziemlich gering ist zum anderen die Übertragung etwas langsam sein kann, vor allem, wenn die Seite oft neu geladen werden muss. Deswegen habe ich mir eine neue Methode überlegt, bei der die dazustellenden Webseite auf einem anderen Webserver liegt und beim Verbinden mit dem TCP-Server des Boards einfach nachgeladen wird. Der Nachteil ist hier vor allem, dass der Client mit dem Internet verbunden sein muss. Das bedeutet auch, das ein privates Netzwerk mit dem NanoESP als AccesPoint nicht möglich ist. Die Vorteile sind aber komplexere Seiten und schnellere Ladezeiten sowie eine insgesamt Entlastung des Boards. Im Folgenden Stelle ich das System anhand des RGB-LED-Beispiels vor. ...

17.04.2016 · 2 min · Fabian Kainka

Wettbewerbsbeitrag: Neigungssensor – auslesen per IoT- Board, übertragen per WLAN

Beitrag zum Kalenderwettbewerb 2015 von Holger Fritzsch Mit einer einfachen Zusatzschaltung läßt sich mit dem IoT- Board eine Erschütterung oder Lageänderung von Gegenständen oder Türen detektieren. Zur Anwendung kommt hier ein RS- Flip Flop bestehend aus 2 Transistoren vom Typ BC547. Ob man nun eine Tür , Fenster oder Fahrrad überwachen oder Teile vor unbefugter Entnahme sichern will,der kompakte Aufbau des Moduls machts möglich. Die Schaltung kennt zwei stabile Zustände, nämlich Bereitschaft- und Alarmzustand. Technisch gesehen entsprechend dem Set- und Reset- Zustand. ...

09.02.2016 · 2 min · Fabian Kainka

Wettbewerbsbeitrag: Quadrocopter Landing Pad

Beitrag zum Kalenderwettbewerb 2015 von Paul Kaczmarczyk Auszug ausdem PDF: Projektbeschreibung: An Weihnachten erhielt ich einen Quadrocopter als Geschenk von meinem Opa. Ich hatte so viel Freude damit, dass ich mir gleich ein zweites Modell vom Typ Blade Inductrix zulegte. Das Fliegen mit dem Quadrocopter macht allerdings besonders viel Spaß, wenn man Aufgaben zu erfüllen hat. Spielidee Für die zu bewältigenden Aufgaben kam mir der Gedanke das Landing Pad zu bauen, bei dem die Aufgabe darin besteht durch einen Ring zu fliegen, ohne hängen zu bleiben und dann zu landen, sofern man eine Landefreigabe erhält. Wird die Landefreigabe vom Tower nicht gegeben, so muss man schweben, bis die Landefreigabe erteilt wird. Wird ohne Landefreigabe gelandet, erhält man als Strafe für die Landung einen Punktabzug. Landet man mit Freigabe erhält man Punkte auf sein Konto. Ein Hängenbleiben am Ring soll auch einen Punktabzug zur Folge haben. Um sich mit anderen zu messen, sollen die erreichten Punkte auch in einer Internet-weiten Highscore-Liste namentlich geführt werden. Dieses Geschicklichkeitsspiel soll rundenbasiert ablaufen, wobei die Rundenzeit 60 s beträgt. Läuft die Runde ab, werden die addierten Punkte in die Highscore-Liste eingetragen. Der Start einer neuen Runde soll durch Druck auf einen Taster ermöglicht werden. […] ...

09.02.2016 · 2 min · Fabian Kainka

Wettbewerbsbeitrag: Polarfuchs

Beitrag zum Kalenderwettbewerb 2015 von Nicolaus Cüppers Der Conrad-Adventskalender „Internet of Things“ war für mich der Einstieg, mich einmal mit dem Thema Arduino zu befassen. Herausgekommen ist das Projekt „Polarfuchs“. Der Name ist angelehnt an das kleinste mir bekannte deutsche Forschungsschiff. Es handelt sich um einen Versuchsaufbau, der ein unbemanntes „Schiff“ nachbildet, was einige Umgebungsdaten erfasst und weiterleitet und parallel dazu seinen eigenen Zustand überwacht. Es wurde nur der Kalender und zusätzlich eine Stromquelle verwendet. Daher sind die Messmethoden auch nicht unbedingt praxisnahe. Normalerweise würde man für die einzelnen Werte passende Sensoren einsetzen. Das war allerdings nicht die Aufgabe. Vielmehr ging es ja darum, aus einer Hand voll vorhandener Bauelemente das Maximale herauszuholen. Als Schiffsrumpf wird daher der Kalender selbst verwendet. Er bildet durch seinen Plastikkörper mit zahlreichen Einsenkungen eine ideale Schwimmplattform. Es wurden jedoch die üblichen konfektionierten Steckkabel verwendet. Das dem Kalender beiliegende Kabel hätte aber auch gereicht, um die Schaltung aufzubauen. Dann hätte man nur alles etwas enger am Board platzieren müssen. ...

09.02.2016 · 9 min · Fabian Kainka

Wettbewerbsbeitrag: Blumenwächter

Beitrag zum Kalenderwettbewerb 2015 von Leander Hackmann: Jeder hat Topfpflanzen. Sie verschönern unseren Alltag, benötigen jedoch auch häufig unsere Aufmerksamkeit in Form von Pflege. Um den besten Standort herauszufinden und das regelmäßige Giessen nicht zu vergessen, habe ich folgende Anwendung mit dem Iot-Board entworfen und umgesetzt: ein Datenlogger für Licht und Feuchtigkeit. Download des Programms Das Programm //Blumenwaechter für das NanoESP-Board //2016 von Leander H. //Misst alle 30min. Feuchtigkeit und Helligkeit //Mit Druck auf Taster kann ein Nullpunkt in der Messung als markanter Punkt gesetzt werden# //Es werden zwei Channels auf Thingspeak.com verwendet (API-Keys in "LightKEY und "MoistureKEY") //Über "threshold" kann der Pegel zur Warnung eingestellt werden //Code und Idee von Leander H. -- Funktionen von Fabian Kainka #include SoftwareSerial.h> #include Time.h> //Setup-Bereich #define SSID "[SSID]" #define PASSWORD "[Passwort]" #define LightKEY "[API-KEY]" #define MoistureKEY "[API-KEY]" #define threshold 400 // #define DEBUG true #define LED_WLAN 13 SoftwareSerial esp8266(11, 12); // RX, TX int ledGreen = 5; int ledYellow = 4; int ledRed = 3; int sensorPower = 2; int moistSensor = 2; String lastminute; const byte thingPost[] PROGMEM = { 80, 79, 83, 84, 32, 42, 85, 82, 76, 42, 32, 72, 84, 84, 80, 47, 49, 46, 49, 10, 72, 111, 115, 116, 58, 32, 97, 112, 105, 46, 116, 104, 105, 110, 103, 115, 112, 101, 97, 107, 46, 99, 111, 109, 10, 67, 111, 110, 110, 101, 99, 116, 105, 111, 110, 58, 32, 99, 108, 111, 115, 101, 10, 67, 111, 110, 116, 101, 110, 116, 45, 84, 121, 112, 101, 58, 32, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 120, 45, 119, 119, 119, 45, 102, 111, 114, 109, 45, 117, 114, 108, 101, 110, 99, 111, 100, 101, 100, 10, 67, 111, 110, 116, 101, 110, 116, 45, 76, 101, 110, 103, 116, 104, 58, 32, 42, 76, 69, 78, 42, 10, 10, 42, 65, 80, 80, 69, 78, 68, 42, 10 }; void setup() { pinMode(ledGreen, OUTPUT); pinMode(ledYellow, OUTPUT); pinMode(ledRed, OUTPUT); pinMode(sensorPower, OUTPUT); Serial.begin(19200); esp8266.begin(19200); while(!espConfig()){ //Failsafe für WLAN delay(200); } digitalWrite(LED_WLAN, HIGH); while(!getTime("chronic.herokuapp.com", "/utc/in+one+hours") == false){ //Failsafe für Zeitsynchro delay(200); } sendThingPost(LightKEY, analogRead(A0)); //Erste Übermittlung digitalWrite(sensorPower, HIGH); delay(200); int tmp = analogRead(A2); sendThingPost(MoistureKEY, tmp); digitalWrite(sensorPower, LOW); if(tmp threshold){ digitalWrite(ledRed, HIGH); digitalWrite(ledGreen, LOW); }else{ digitalWrite(ledRed, LOW); digitalWrite(ledGreen, HIGH); } } void loop() { String shour, sminute, ssecond; 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()); //debug(shour + ":" + sminute + ":" + ssecond); if(sminute == "0" || sminute == "30"){ //Wird zur halben und vollen Stunde ausgeführt if(sminute != lastminute){ digitalWrite(ledYellow, HIGH); if(sendThingPost(LightKEY, analogRead(A0) == false)){ while(sendThingPost(LightKEY, analogRead(A0) == false)){ sendThingPost(LightKEY, analogRead(A0)); delay(200); } } digitalWrite(ledYellow, LOW); delay(500); digitalWrite(ledYellow, HIGH); digitalWrite(sensorPower, HIGH); delay(100); if(sendThingPost(MoistureKEY, analogRead(A2) == false)){ while(sendThingPost(MoistureKEY, analogRead(A2) == false)){ sendThingPost(MoistureKEY, analogRead(A2)); delay(200); } } digitalWrite(sensorPower, LOW); digitalWrite(ledYellow, LOW); digitalWrite(sensorPower, HIGH); delay(100); int tmp = analogRead(A2); digitalWrite(sensorPower, LOW); if(tmp threshold){ digitalWrite(ledRed, HIGH); digitalWrite(ledGreen, LOW); }else{ digitalWrite(ledRed, LOW); digitalWrite(ledGreen, HIGH); } lastminute = sminute; } } if(analogRead(A1) > 500){ //Button zum Setzen eines Nullpunktes digitalWrite(ledYellow, HIGH); sendThingPost(LightKEY, 0); digitalWrite(ledYellow, LOW); delay(500); digitalWrite(ledYellow, HIGH); sendThingPost(MoistureKEY, 0); digitalWrite(ledYellow, LOW); delay(1000); } } //Verwendete Funktionen von Fabian Kainka folgen ab hier: //-----------------------------------------ThingsSpeak Functions------------------------------------ boolean sendThingPost(String key, int value) { boolean succes = true; String Host = "api.thingspeak.com"; String msg = "field1=" + String(value); succes &= sendCom("AT+CIPSTART="TCP","" + Host + "",80", "OK"); String postRequest = createThingPost("/update", key, msg); if (sendCom("AT+CIPSEND=" + String(postRequest.length()), ">")) { esp8266.print(postRequest); esp8266.find("SEND OK"); if (!esp8266.find("CLOSED")) succes &= sendCom("AT+CIPCLOSE", "OK"); } else { succes = false; } return succes; } String createThingPost(String url, String key, String msg) { String xBuffer; for (int i = 0; i sizeof(thingPost); i++) { char myChar = pgm_read_byte_near(thingPost + i); xBuffer += myChar; } String append = "api_key=" + key + "&" + msg; xBuffer.replace("*URL*", url); xBuffer.replace("*LEN*", String( append.length())); xBuffer.replace("*APPEND*", append); return xBuffer; } String createThingGet(String url, String key) { String xBuffer; for (int i = 0; i sizeof(thingPost); i++) { char myChar = pgm_read_byte_near(thingPost + i); xBuffer += myChar; } String append = "api_key=" + key; xBuffer.replace("POST", "GET"); xBuffer.replace("*URL*", url); xBuffer.replace("*LEN*", String( append.length())); xBuffer.replace("*APPEND*", append); return xBuffer; } String createThingGet(String url, String key, String msg) { String xBuffer; for (int i = 0; i sizeof(thingPost); i++) { char myChar = pgm_read_byte_near(thingPost + i); xBuffer += myChar; } String append = "api_key=" + key + "&" + msg; xBuffer.replace("POST", "GET"); xBuffer.replace("*URL*", url); xBuffer.replace("*LEN*", String( append.length())); xBuffer.replace("*APPEND*", append); return xBuffer; } String getTCP(String Host, String Subpage) { boolean succes = true; succes &= sendCom("AT+CIPSTART="TCP","" + Host + "",80", "OK"); String getRequest = "GET " + Subpage + " HTTP/1.1rnHost:" + Host + "rnrn"; succes &= sendCom("AT+CIPSEND=" + String(getRequest.length() + 2), ">"); return sendCom(getRequest); } boolean getTime(String Host, String Subpage) { boolean succes = true; int xyear, xmonth, xday, xhour, xminute, xsecond; //lokal variables succes &= sendCom("AT+CIPSTART="TCP","" + Host + "",80", "OK"); String getRequest = "GET " + Subpage + " HTTP/1.1rnHost:" + Host + "rn"; succes &= sendCom("AT+CIPSEND=" + String(getRequest.length() + 2), ">"); esp8266.println(getRequest); if (esp8266.find("+IPD")) { if (esp8266.find("rnrn")) { xyear = esp8266.parseInt(); xmonth = esp8266.parseInt(); xday = esp8266.parseInt(); xhour = esp8266.parseInt(); xminute = esp8266.parseInt(); xsecond = esp8266.parseInt(); if (xday 0) xday *= -1; //Because of date seperator - parseInt detects negativ integer if (xmonth 0) xmonth *= -1; //Because of date seperator - parseInt detects negativ integer setTime(xhour, xminute, xsecond, xday, xmonth, xyear); sendCom("AT+CIPCLOSE", "OK"); return true; } else return false; } else return false; } //-----------------------------------------Config ESP8266------------------------------------ boolean espConfig() { boolean succes = true; esp8266.setTimeout(5000); succes &= sendCom("AT+RST", "ready"); esp8266.setTimeout(1000); if (configStation(SSID, PASSWORD)) { succes &= true; debug("WLAN Connected"); debug("My IP is:"); debug(sendCom("AT+CIFSR")); } else { succes &= false; } //shorter Timeout for faster wrong UPD-Comands handling succes &= sendCom("AT+CIPMODE=0", "OK"); //So rum scheit wichtig! succes &= sendCom("AT+CIPMUX=0", "OK"); return succes; } boolean configTCPServer() { boolean succes = true; succes &= (sendCom("AT+CIPMUX=1", "OK")); succes &= (sendCom("AT+CIPSERVER=1,80", "OK")); return succes; } boolean configTCPClient() { boolean succes = true; succes &= (sendCom("AT+CIPMUX=0", "OK")); //succes &= (sendCom("AT+CIPSERVER=1,80", "OK")); return succes; } boolean configStation(String vSSID, String vPASSWORT) { boolean succes = true; succes &= (sendCom("AT+CWMODE=1", "OK")); esp8266.setTimeout(20000); succes &= (sendCom("AT+CWJAP="" + String(vSSID) + "","" + String(vPASSWORT) + """, "OK")); esp8266.setTimeout(1000); return succes; } boolean configAP() { boolean succes = true; succes &= (sendCom("AT+CWMODE=2", "OK")); succes &= (sendCom("AT+CWSAP="NanoESP","",5,0", "OK")); return succes; } boolean configUDP() { boolean succes = true; succes &= (sendCom("AT+CIPMODE=0", "OK")); succes &= (sendCom("AT+CIPMUX=0", "OK")); succes &= sendCom("AT+CIPSTART="UDP","192.168.255.255",90,91,2", "OK"); //Importand Boradcast...Reconnect IP return succes; } //-----------------------------------------------Controll ESP----------------------------------------------------- boolean sendUDP(String Msg) { boolean succes = true; succes &= sendCom("AT+CIPSEND=" + String(Msg.length() + 2), ">"); //+","192.168.4.2",90", ">"); if (succes) { succes &= sendCom(Msg, "OK"); } return succes; } boolean sendCom(String command, char respond[]) { esp8266.println(command); if (esp8266.findUntil(respond, "ERROR")) { return true; } else { debug("ESP SEND ERROR: " + command); return false; } } String sendCom(String command) { esp8266.println(command); return esp8266.readString(); } //-------------------------------------------------Debug Functions------------------------------------------------------ void serialDebug() { while (true) { if (esp8266.available()) Serial.write(esp8266.read()); if (Serial.available()) esp8266.write(Serial.read()); } } void debug(String Msg) { if (DEBUG) { Serial.println(Msg); } } [collapse] ...

09.02.2016 · 7 min · Fabian Kainka

Wettbewerbsbeitrag: IoTeaTimer

Sie kennen das? Sie sitzen in Ihrem Arbeits- oder Bastelzimmer, ganz vertieft in Ihr neues Pretzelboard, plötzlich schießt es siedendheiss durch den Kopf: “Der Tee!” - doch der ist längst eiskalt, steht in der Küche und hat sich in eine tiefschwarze Jauche verwandelt, die höchstens noch als Pflanzenschutzmittel taugt. Das ist der Auftritt für den IoTeaTimer. Eine Eieruhr mit WLAN-Anschluss? Nein, Ihr persönlicher Erinnerungsagent … lesen Sie weiter in der umfassenden Projektdokumentation, hier als PDF, zum Download.

31.01.2016 · 1 min · Fabian Kainka

Wettbewerbsbeitrag: Wassermelder mit Twitter-Alarmmeldung

Beitrag zum Kalenderwettbewerb 2015 von Bernhard Kaiser & Michael Gaus Bei diesem Projekt handelt es sich um einen Wassermelder, der optisch, akustisch und per Twitter-Meldung Alarm gibt, sobald an den Sensorkontakten Wasser detektiert wird. Er kann z.B. zur Überwachung auf austretendes Wasser aus Waschmaschine oder Spülmaschine dienen und helfen, rechtzeitig vor größeren Überschwemmungen eingreifen zu können. Als Sensorkontakt können einfach 2 Drähte mit abisolierten Enden genommen werden, so wie es auch auf dem Foto zu sehen ist. Verwendet wurden ausschließlich die Bauteile der beiden Adventskalender. ...

29.01.2016 · 6 min · Fabian Kainka

Fernbedienung über WLAN oder Alt und Neu ergänzen sich

Ein Beitrag per Mail von Holger Fritzsch: Das IoT- Baord regt zum experimentieren an. Auch wenn ich den Kalender vor Weihnachten nicht bekam, so konnte ich Dank der Veröffentlichung des Handbuches die Sache mitverfolgen. Inzwischen habe ich ein Pretzelboard erworben. Es wird per kostenloser Android- App („UDP- Sender“) im Zusammenhang mit dem Experiment vom Tag 5 (Autor F.Kainka) die Garagenbeleuchtung ein- bzw. ausgeschaltet. So kann man ein altes Handy, dessen Akku schwächelt, einer Zweitverwendung zuführen. Das Handy baut eine Access- Verbindung zum ESP- Modul auf. ...

27.01.2016 · 1 min · Fabian Kainka

User Projekte

Jetzt bist du gefragt! In diesem Bereich hast du nun die Möglichkeit, deine Projekte, Ideen und Experimente vorzustellen. Dabei ist es egal, ob du einem bestehenden Projekt eine neue Verpackung gibst, z.B. eine schöne Cheerlights Lampe, oder eine völlig neue Idee hast. Auf dieser Seite kannst du alle deine Projekte eigenständig präsentieren. Besonders praktisch: Über diese Funktion kannst du außerdem auch Beitrage zu dem aktuellen Wettbewerb einreichen. Und wer weiß, ob nicht in Zukunft noch mehr Wettbewerbe stattfinden. ...

25.01.2016 · 1 min · Fabian Kainka