Day 18: Weather monitoring

Behind today’s door is a very special component, namely a humidity sensor. Together with the phototransistor and the NTC, it creates a weather station for at-home use. The following layout is necessary for this purpose: The layout with all sensors (resistors 1 kohm) Today’s layout is a bit fiddly. Especially at the point where the potentiometer on the right of the image sits, it touches the NanoESP. But that’s not really a problem as long as the contact on the left of the image is plugged firmly into the board. ...

18.12.2016 · 4 min · Fabian Kainka

Day 17: Wake Up Light

Today’s project deals with a well-known lamp from Phillips, the Wake Up Light. This is an alarm clock that, instead of making a loud noise, slowly increases the brightness. This creates a type of sunrise, and one wakes up in a natural manner. Behind today’s door is another potentiometer, which is important for tomorrow’s test. The following layout is required today: The RGB LED with series resistors The sketch: 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 ); } (The former Arduino Create embed is no longer available; the code is taken from the download of all sketches.) ...

17.12.2016 · 5 min · Fabian Kainka

Day 16: A web server piano

Behind today’s door is a piezo sound transducer. It’s possible to generate sounds with it, which will become clear in today’s test. Today you’re building a type of piano that can be used via a website. See the following picture for the layout: The correct connection of the piezo sound transducer The sketch: A16_P16_WebserverPiano.ino /* TCP-Server Piano Change SSID and PASSWORD. */ #include <NanoESP.h> #include <NanoESP_HTTP.h> //special library for http-connection #include <SoftwareSerial.h> #include "Websites.h" //websites in a special file as progmem #define SSID "YourSSID" #define PASSWORD "YourPassword" #define LED_WLAN 13 NanoESP nanoesp = NanoESP(); NanoESP_HTTP http = NanoESP_HTTP(nanoesp); void setup() { Serial.begin(19200); nanoesp.init(); //! Only if you want to change the ACCESPOINT configuration //nanoesp.configWifi(ACCESSPOINT, "NanoESP", ""); //! Only if you use a new Network // nanoesp.configWifi(DUAL, SSID, PASSWORD); //Dual Mode nanoesp.configWifiMode(DUAL); //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()); } void loop() { String method, ressource, parameter; int id; if (http.recvRequest(id, method, ressource, parameter)) { //Incoming request, parameters by reference 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); } else if (ressource == "/dataonly") { //only data is recieved on this url, no need to send a website nanoesp.closeConnection(id); } else { http.sendFromFlash(id, error404, sizeof(error404)); nanoesp.closeConnection(id); } if (parameter != "") //the request included parameters { String strTone; if (method == GET) strTone = parameter.substring(6); else strTone = parameter.substring(5); //get note values noTone(8); tone(8, strTone.toInt(), 200); //play note for 200ms } } } (The former Arduino Create embed is no longer available; the code is taken from the download of all sketches.) ...

16.12.2016 · 3 min · Fabian Kainka

Day 15: A web server

Since the Blynk platform was the central point of our projects over the last few days, now we’re coming to a totally new subject: the NanoESP as web server. You’ve already gotten a first impression of it in the test for the first day. In the coming days, we’ll see what all else is possible. Behind today’s door is a special two-core cable with which you can connect e.g. even LEDs or sensors outside the board. For today’s test, however, no hardware layout is necessary at all. You only need the programme and a browser. ...

15.12.2016 · 4 min · Fabian Kainka

Day 14: Long-term temperature measurement

Behind today’s door is an NTC sensor (negative temperature coefficient thermistor). Its conductivity changes depending on the temperature. You’ll use the sensor today to undertake a long-term measurement of the temperature. As a small bonus, you can select a time at which you get a summary by email. For today’s layout, in addition to the NTC, you’ll also need the potentiometer and a 1-kohm resistor. You can make a fine adjustment of the temperature with the potentiometer. ...

14.12.2016 · 3 min · Fabian Kainka

Day 13: Alarm system with push messages

Today’s project deals with a simple silent alarm system with password input for resetting the alarm. So that you get anything at all from the alarm, the board sends a push message to your smartphone. We’ll set the tilt sensor that’s behind today’s door as a motion detector. It can give information about vibrations and thus inform you if someone tips the NanoESP board. Layout with tilt sensor The sketch: A16_P13_Blynk9_PushAlarm.ino /* Blnky9: PushAlarm Change ssid, password and token */ char ssid[] = "YourSSID"; char password[] = "YourPassword"; char token[] = "YourToken"; String passwordAlarm = "password"; String alarmMsg = "Alarm! Someone touched the NanoESP!"; #define BLYNK_DEBUG #define BLYNK_PRINT Serial // Comment this out to disable prints and save space #include <ESP8266_SoftSer.h> #include <BlynkSimpleShieldEsp8266_SoftSer.h> #include <SimpleTimer.h> // Set ESP8266 Serial object #include <SoftwareSerial.h> SoftwareSerial EspSerial(11, 12); // RX, TX ESP8266 wifi(EspSerial); SimpleTimer timer; WidgetTerminal terminal(V1); boolean alarm = false; void setup() { // Set console baud rate Serial.begin(19200); EspSerial.begin(19200); Blynk.begin(token, wifi, ssid, password); //push msg Blynk.notify("Alarm active"); pinMode(2, INPUT_PULLUP); //timer for blinking led on alarm timer.setInterval(1000L, blinkAlarm); } void loop() { Blynk.run(); if (alarm) timer.run(); else digitalWrite(13, LOW); //blink if alarm active if (digitalRead(2)) { //read tilt sensor if (!alarm) { alarm = true; Blynk.notify(alarmMsg); //push msg on alarm terminal.println(F("Alarm! Type in Password:")); terminal.flush(); } } } BLYNK_CONNECTED() { Blynk.syncAll(); terminal.println(F("Blynk v" BLYNK_VERSION ": Device started")); terminal.println("-------------"); terminal.flush(); } BLYNK_WRITE(V1) //Terminal { //type in password on alarm if (alarm) { String passInput = param.asStr(); if (passwordAlarm == passInput) { alarm = false; terminal.println(F("Alarm deaktivated")); terminal.flush(); } else { terminal.println(F("Wrong password!")); terminal.flush(); } } } //timer function for blinking led on alarm void blinkAlarm() { digitalWrite(13, !digitalRead(13)); } (The former Arduino Create embed is no longer available; the code is taken from the download of all sketches.) ...

13.12.2016 · 2 min · Fabian Kainka

Day 12: Light monitor

Behind today’s door, you’ll find a phototransistor. This is a sensor with which the brightness can be measured. You’ll do that today, but in addition to simple measurement, the project also sounds an alarm as soon as limit values that you’ve pre-set in the app are exceeded. So that everything will function, you have to connect the sensor with a voltage divider circuit at Pin A0, as shown in the picture below. Pay attention to the correct polarity of the phototransistor (short leg to VCC). It does also work the other way round, but not nearly as sensitively. ...

12.12.2016 · 4 min · Fabian Kainka

Day 11: Day- and nightlight

Behind today’s door is a 10-kohm resistor, but we don’t need it yet today. Instead, the set-up from yesterday’s test works today as well. In this project, you’ll build a day-night lamp that changes colours at specific times. Thus you can have a bright light shining during the day, while at night only a dim red serves as emergency lighting for a bit of orientation. The layout from Day 10 The sketch: 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 } } (The former Arduino Create embed is no longer available; the code is taken from the download of all sketches.) ...

11.12.2016 · 3 min · Fabian Kainka

Day 10: Colour mixing

Behind today’s door is the reason for the many 1-kohm resistors. Namely, what you find there is a so-called RGB LED RGB stands for red-greenblue, since this LED is actually three LEDs that can be connected through a common cathode. By varying the brightness of the individual LEDs using PWM, you can generate almost every colour conceivable. You can see the layout of today’s circuit in the following figure. Note that the somewhat longer leg (the cathode) must be plugged into the GND contact strip. ...

10.12.2016 · 2 min · Fabian Kainka

Day 9: Brightness of the real LED

Behind today’s door is another 1-kohm resistor. But today you don’t have to change anything in the hardware layout from yesterday. Only a small detail changes on the interface. The layout from yesterday You don’t have to re-upload the programme because you’re simply manually adjusting the interface from yesterday. If you’d like to load the interface in the app anyway for safety’s sake, you’ll find the QR code here as usual. But then you also have to re-enter the token in your programme. ...

09.12.2016 · 3 min · Fabian Kainka