Ga naar inhoud

Wakeuplight

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.

1
2
3
#include <ESP8266WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>

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.

1
2
3
4
5
6
7
// We stellen in hoe laat de lamp aan moet gaan
const int wakeupHour = 8;
const int wakeupMinute = 30;

// We stellen het wifi netwerk en wachtwoord in
const char *ssid     = "netwerknaam";
const char *password = "wachtwoord";

Tot slot maken we een wifiverbinding object en een ntpclient object aan.

1
2
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org");

Setup

We moeten eerst een verbinding met wifi maken.

1
2
// We maken verbinding met het wifi netwerk
WiFi.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
 9
10
// Zolang we nog niet met het wifi verbonden zijn updaten we een pixel van de ring naar oranje
int status = 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.

1
2
3
// 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.

1
2
3
if (timeClient.getHours() == wakeupHour && timeClient.getMinutes() == wakeupMinute) {
  lightOn = true;
}

Verbeter mogelijkheden

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.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
// 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 gaan
const int wakeupHour = 8;
const int wakeupMinute = 30;

// We stellen het wifi netwerk en wachtwoord in
const char *ssid     = "netwerknaam";
const char *password = "wachtwoord";

// We maken een Wifi en NTPclient object aan
WiFiUDP ntpUDP;
NTPClient timeClient(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 60
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

// We maken een globale variabele aan waarin we onthouden of het nachlampje aan of uit staat
boolean lightOn = false;

void setup() {
  // We starten de ledstrip op en zetten hem aan
  strip.begin();

  // We maken de ledstrip rood om aan te geven dat we nog niet met wifi verbonden zijn
  for (int i = 0; i < strip.numPixels(); i++) {
    strip.setPixelColor(i, 255, 0, 0);
  }
  strip.setBrightness(25);
  strip.show();

  // We maken verbinding met het wifi netwerk
  WiFi.begin(ssid, password);

  // Zolang we nog niet met het wifi verbonden zijn updaten we een pixel van de ring naar oranje
  int status = 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 worden
  pinMode(BTN_PIN, INPUT);

  // We maken de ledstrip groen om aan te geven dat we succesvol opgestart zijn
  for (int i = 0; i < strip.numPixels(); i++) {
    strip.setPixelColor(i, 0, 255, 0);
  }
  strip.show();
  delay(500);
}

void loop() {
  // We updaten de NTPclient met de huidige tijd
  timeClient.update();

  // Als de huidige tijd overeen komt met de wekker tijd moet de lamp aan
  if (timeClient.getHours() == wakeupHour && timeClient.getMinutes() == wakeupMinute) {
    lightOn = true;
  }

  // Als het knopje ingedrukt wordt moet het lampje aan of uit gaan
  if (digitalRead(BTN_PIN)) {
    // We veranderen de waarde naar het tegenovergestelde van zijn vorige waarde, aan wordt dus uit en uit wordt aan
    lightOn = !lightOn;

    // We wachten heel even om rekening te houden met bouncen
    delay(300);

    // Om te voorkomen dat de ledring gaat knipperen wachten we tot het knopje losgelaten is
    while(digitalRead(BTN_PIN)) {
      delay(100);
    }
  }

  // We bepalen of het nachtlampje aan moet staan
  if (lightOn) {  
    // Zo ja dan stellen we eerst de kleur in van elke pixel
    for (int i = 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 4
    int brightness = analogRead(POT_PIN) / 4;

    // We stellen de felheid van de ledring in
    strip.setBrightness(brightness);
  } else {
    // Als hij uit moet staan zetten we de felheid op 0
    strip.setBrightness(0);
  }

  // We sturen alle instellingen die we gedaan hebben naar de ledring om weergeven te worden
  strip.show();
}