De code voor een wakeuplight lijkt veel op die voor het nachtlampje met een paar aanpassingen. Allereerst zullen we met wifi verbinden en de huidige tijd ophalen. Vervolgens zullen we op een vooraf ingestelde tijd het lampje aanzetten.
Voorbereiding
Allereerst voegen we de libraries toe om met wifi te verbinden en de NTPclient om de tijd op te halen. Vergeet deze niet te installeren.
We maken twee constante variabelen aan waarin we het uur en de minuut waarop de lamp aan moet gaan in opslaan. Daarna slaan we de de naam van het wifi netwerk en het wachtwoord in.
1234567
// We stellen in hoe laat de lamp aan moet gaanconstintwakeupHour=8;constintwakeupMinute=30;// We stellen het wifi netwerk en wachtwoord inconstchar*ssid="netwerknaam";constchar*password="wachtwoord";
Tot slot maken we een wifiverbinding object en een ntpclient object aan.
// We maken verbinding met het wifi netwerkWiFi.begin(ssid,password);
Omdat het fijn is om te weten of dat lukt en of de ESP niet vastgelopen is kun je met de volgende code op de ledring laten zien dat we nog steeds bezig zijn met het maken van een verbinding.
1 2 3 4 5 6 7 8 910
// Zolang we nog niet met het wifi verbonden zijn updaten we een pixel van de ring naar oranjeintstatus=0;while(WiFi.status()!=WL_CONNECTED){delay(500);if(status<LED_COUNT){strip.setPixelColor(status++,255,255,0);strip.show();}}
Zodra we een wifi verbinding hebben maken we verbinding met een NTP server om de tijd op te halen. Ook stellen we de tijdszone in op europese zomertijd. Voor wintertijd kun je 3600 als offset gebruiken.
123
// We starten de NTPclient op en stellen de tijdszone in op GMT+2 (europese zomertijd)timeClient.begin();timeClient.setTimeOffset(7200);
Loop
Elke loop vragen we de huidige tijd op.
1
timeClient.update();
Als de huidige tijd overeen komt met de wekkertijd dan zetten we de lamp aan.
Er zijn nog wat mogelijkheden om de functionaliteit van de wakeuplight te verbeteren. Zo zou je een aantal minuten voor de wekkertijd de lamp langzaam aan laten gaan. Ook zou je een snooze modus in kunnen bouwen of een manier waarmee je met de draaiknop en het knopje de wekkertijd in kunt stellen.
Volledig script
Als je de stappen gevolgd hebt dan kom je op de volgende code uit.
// We voegen de Neopixel library toe waarmee we de ledring kunnen aansturen#include<Adafruit_NeoPixel.h>// We voegen de Wifi en de NTPclient libraries toe waarmee we met wifi kunnen verbinden en de tijd kunnen ophalen#include<ESP8266WiFi.h>#include<NTPClient.h>#include<WiFiUdp.h>// We stellen in hoe laat de lamp aan moet gaanconstintwakeupHour=8;constintwakeupMinute=30;// We stellen het wifi netwerk en wachtwoord inconstchar*ssid="netwerknaam";constchar*password="wachtwoord";// We maken een Wifi en NTPclient object aanWiFiUDPntpUDP;NTPClienttimeClient(ntpUDP,"pool.ntp.org");// We definiëren aan welke pinnen we het knopje, de potentiometer en ledring aangesloten hebben#define POT_PIN A0#define BTN_PIN D8#define LED_PIN D4// Onze ledring heeft 60 ledjes, dit slaan we op en we maken een ledstrip object aan#define LED_COUNT 60Adafruit_NeoPixelstrip(LED_COUNT,LED_PIN,NEO_GRB+NEO_KHZ800);// We maken een globale variabele aan waarin we onthouden of het nachlampje aan of uit staatbooleanlightOn=false;voidsetup(){// We starten de ledstrip op en zetten hem aanstrip.begin();// We maken de ledstrip rood om aan te geven dat we nog niet met wifi verbonden zijnfor(inti=0;i<strip.numPixels();i++){strip.setPixelColor(i,255,0,0);}strip.setBrightness(25);strip.show();// We maken verbinding met het wifi netwerkWiFi.begin(ssid,password);// Zolang we nog niet met het wifi verbonden zijn updaten we een pixel van de ring naar oranjeintstatus=0;while(WiFi.status()!=WL_CONNECTED){delay(500);if(status<LED_COUNT){strip.setPixelColor(status++,255,255,0);strip.show();}}// We starten de NTPclient op en stellen de tijdszone in op GMT+2 (europese zomertijd)timeClient.begin();timeClient.setTimeOffset(7200);// We definiëren dat het knopje als input gebruik moet wordenpinMode(BTN_PIN,INPUT);// We maken de ledstrip groen om aan te geven dat we succesvol opgestart zijnfor(inti=0;i<strip.numPixels();i++){strip.setPixelColor(i,0,255,0);}strip.show();delay(500);}voidloop(){// We updaten de NTPclient met de huidige tijdtimeClient.update();// Als de huidige tijd overeen komt met de wekker tijd moet de lamp aanif(timeClient.getHours()==wakeupHour&&timeClient.getMinutes()==wakeupMinute){lightOn=true;}// Als het knopje ingedrukt wordt moet het lampje aan of uit gaanif(digitalRead(BTN_PIN)){// We veranderen de waarde naar het tegenovergestelde van zijn vorige waarde, aan wordt dus uit en uit wordt aanlightOn=!lightOn;// We wachten heel even om rekening te houden met bouncendelay(300);// Om te voorkomen dat de ledring gaat knipperen wachten we tot het knopje losgelaten iswhile(digitalRead(BTN_PIN)){delay(100);}}// We bepalen of het nachtlampje aan moet staanif(lightOn){// Zo ja dan stellen we eerst de kleur in van elke pixelfor(inti=0;i<strip.numPixels();i++){strip.setPixelColor(i,255,255,75);}// Vervolgens bepalen we hoe fel hij moet zijn door de waarde van de potmeter uit te lezen// Dit is een waarde tussen de 0 en 1024, de brightness moet ingesteld worden tussen 0 en 255, dus delen he het door 4intbrightness=analogRead(POT_PIN)/4;// We stellen de felheid van de ledring instrip.setBrightness(brightness);}else{// Als hij uit moet staan zetten we de felheid op 0strip.setBrightness(0);}// We sturen alle instellingen die we gedaan hebben naar de ledring om weergeven te wordenstrip.show();}