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 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 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 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

Tag 11: Tag/Nacht Licht

Hinter dem heutigen Türchen befindet sich ein 10 kOhm Widerstand den wir heute aber noch nicht benötigen werden. Stattdessen funktioniert der Aufbau des gestrigen Versuchs auch heute. In diesem Projekt werden Sie eine Tag/Nacht Lampe basteln, die zu bestimmten Uhrzeiten die Farbe wechselt. So können Sie Tagsüber ein helles Licht leuchten lassen, während in der Nacht nur ein dunkles Rot als Notbeleuchtung für etwas Orientierung sorgt. Der Aufbau von Tag 10 Das Programm: A16_P11_Blynk7_DayNight.ino /* Blynk 7: DayNight Change ssid, password and token */ char ssid[] = "YourSSID"; char password[] = "YourPassword"; char token[] = "YourToken"; #define BLYNK_DEBUG #define BLYNK_PRINT Serial // Comment this out to disable prints and save space #include <ESP8266_SoftSer.h> #include <BlynkSimpleShieldEsp8266_SoftSer.h> // Set ESP8266 Serial object #include <SoftwareSerial.h> SoftwareSerial EspSerial(11, 12); // RX, TX ESP8266 wifi(EspSerial); boolean isDay; void setup() { // Set console baud rate Serial.begin(19200); EspSerial.begin(19200); Blynk.begin(token, wifi, ssid, password); } void loop() { //all events are handled by functions below Blynk.run(); } BLYNK_CONNECTED() { //Sync all states when reconnected Blynk.syncAll(); } BLYNK_WRITE(V1) //DayTimer { if (param.asInt()== 1){ Blynk.virtualWrite(V0,1); Blynk.virtualWrite(V7,0); isDay = true; Blynk.syncVirtual(V3); } } BLYNK_WRITE(V4) //NightTimer { if (param.asInt()== 1){ Blynk.virtualWrite(V0,0); Blynk.virtualWrite(V7,1); isDay = false; Blynk.syncVirtual(V8); } } BLYNK_WRITE(V0) //Day { if(param.asInt()==1) { Blynk.virtualWrite(V7,0); isDay = true; Blynk.syncVirtual(V3); } } BLYNK_WRITE(V7){ //Night if(param.asInt()==1) { Blynk.virtualWrite(V0,0); isDay = false; Blynk.syncVirtual(V8); } } BLYNK_WRITE(V3) // change color Day { if (isDay){ analogWrite(3, param[0].asInt()); // getting first value analogWrite(5, param[1].asInt()); // getting second value analogWrite(6, param[2].asInt()); // getting N value } } BLYNK_WRITE(V8) // change color Night { if (!isDay){ analogWrite(3, param[0].asInt()); // getting first value analogWrite(5, param[1].asInt()); // getting second value analogWrite(6, param[2].asInt()); // getting N value } } (Die frühere Einbettung über Arduino Create ist nicht mehr verfügbar; der Code stammt aus dem Download aller Programme.) ...

11.12.2016 · 3 Minuten · Fabian Kainka

Tag 24: Feuermelder für den Weihnachtsbaum

Das Abschlussprojekt besteht aus mehreren Elementen, die Sie im Laufe der Adventszeit kennengelernt haben. Eine Funktion ist die am vorrangegangenen Tag vorgestellte Cheerlights-Funktion. Sie können weiterhin die aktuelle Farbe des Cheerlights-Projekts empfangen und mit der RGB-LED darstellen. Außerdem wird das Board zur Langzeitüberwachung der Temperatur eingesetzt. Gleichzeitig kann das Board einen Alarmton ausgeben, wenn die Temperatur einen bestimmten Wert überschreitet, z.B. weil ein Feuer entsteht. Und als letzte Funktion kann das Board als Weihnachtsglocke eingesetzt werden, indem es über ein zeitgesteuertes TalkBack-Kommando dazu gebracht wird, den Song Jingle Bells zu spielen. Alles in allem ist das heutige Projekt ein Allrounder für den Weihnachtsbaum. ...

24.12.2015 · 5 Minuten · Fabian Kainka

Tag 23: Cheerlights

Der heutige Versuch basiert auf einem Projekt von Hans Scharler, das sich Cheerlights nennt. Die Idee: weltweit vernetzte Lichter, die sich simultan über Twitter Kommandos steuern lassen. Eine gutes Beispiel, dass die Welt mit dem Internet immer enger zusammenwächst. Hinter dem heutigen Türchen befindet sich ein viertes Verlängerungskabel mit dem sich nun auch endlich die RGB-Led abseits vom Board platzieren lässt. Das kann besonders praktisch sein, wenn Sie beispielsweise das Board im Weihnachtsbaum verstecken wollen während die RGB-LED die Krone des Baums schmückt. ...

23.12.2015 · 2 Minuten · Fabian Kainka

Tag 17: IR-Modul

Das Projekt des heutigen Tages ermöglicht die Steuerung des Controllers per Fernbedienung. Mit selbst wählbaren Tasten auf einer Infrarot-Fernbedienung Ihrer Wahl können Sie die Farbe der RGB-LED verändern und die Hintergrundfarbe der Webseite gleich mit. Hinter dem heutigen Türchen befindet sich das für das heutige Projekt bedeutende Bauteil, nämlich das Infrarot-Empfangsmodul. Sie können das Modul wie auf dem unteren Bild ganz ohne Kabel anschließen. Das Programm setzt die entsprechenden Pins so, dass das Modul mit Strom versorgt wird. ...

17.12.2015 · 2 Minuten · Fabian Kainka

Tag 16: GPIO Control

Das Projekt des heutigen Tages ermöglicht die einfache Ansteuerung der digitalen Pins D2-D7 per Webseite. Der Status des jeweiligen Pins wird ebenfalls auf der Webseite dargestellt, sodass man nie den Überblick verliert. Damit sich der Zustand der Pins gut überprüfen lässt, empfiehlt sich ein Aufbau wie auf dem unteren Bild. Sowohl die RGB-LED als auch die normale LED kommen zum Einsatz. Die Kathoden der LEDs sind diesmal aber nicht an die lange Masseleitung auf der Außenseite des Boards angeschlossen, sondern liegen ebenfalls an einem digitalen Ausgang. Nur wenn diese Pins low geschaltet sind, können die LEDs also leuchten. ...

16.12.2015 · 2 Minuten · Fabian Kainka

Tag 14: Webserver für die RGB-LED

In dem Projekt des heutigen Tages geht es um die Ansteuerung der RGB-LED mittels Webserver. Über eine übersichtliche Oberfläche kann die Farbe der LED verändert werden. Die Webseite wurde außerdem angepasst, und sollte auch auf Smartphones gut darstellbar sein. Die Webseite mit ColorPicker Hinter dem heutigen Adventskalendertürchen befindet sich erneut ein Widerstand, diesmal aber mit 10 kΩ (Braun, Schwarz, Orange). Diesen werden Sie für den morgigen Versuch benötigen. ...

14.12.2015 · 2 Minuten · Fabian Kainka