DAG AANWIJZER


dag wijzer bord

dag wijzer zijkantdag wijzer voorkant

Hoe ben ik er op gekomen Al een tijdje geleden hebben wij een planbord hangen. Wij de dagen van de week ouderwets met de hand door middel van een stuk plastic aangegeven. Het bord werd nooit bij gehouden vertelde mijn moeder. Ik heb met spullen uit mijn kast dit gemaakt. Daar vond ik arduino shields, utp kabel en lampjes die bij het bier zaten. Deze spullen heb ik hier voor gebruikt.

Wat het doet Het geeft de dag  van de week aan met een Arduino UNO en 7 leds. Ik heb dit gemaakt in twee dagen. Op dag één ging ik het aan elkaar knopen. En heb de code geschreven. Die onderaan deze pagina staat. De tweede dag heb ik alles geïnstalleerd en getest.

Hoe het werkt als je de Arduino aan zet moet je ook een internet kabel aan sluiten. Dan vraagt de arduino bij het opstarten aan een tijd server (time.nist.gov) de seconde na 1 jan 1970. En dan heb ik een libary die het converteerd naar dag van de week met schrikkeljaren er in. Key note als de stroom uitvalt, vergeet de Arduino de timestamp.

Hardware is een Arduino Uno (leds aan sturen) + Ethernet shield (voor tijd opvragen) + Protoboard (alleen handig voor de aan sluiting).

Software is Arduino ide van Arduino.cc

Source code

#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <Time.h>
#include <TimeLib.h>
long timeZone = +2 * 60 * 60;
int const NUM_PINS = 8;
int ledPins[] = {2, 2, 3, 5, 6, 7, 8, 9}; //13 not used start counting with index 1
byte mac[] = {
  0x90, 0xA2, 0xDA, 0x0D, 0xFE, 0xB5
};
unsigned int localPort = 8888;
char timeServer[] = "time.nist.gov";
const int NTP_PACKET_SIZE = 48;
byte packetBuffer[ NTP_PACKET_SIZE];
EthernetUDP Udp;
void setup() {
  for(int i = 1; i < NUM_PINS; i++) {
    pinMode(ledPins[i], OUTPUT);
  }
  for(int i = 1; i < NUM_PINS; i++) {
    digitalWrite(ledPins[i], HIGH);
  }
  delay(500);
  
  Serial.begin(9600);
  while (!Serial) {
    ;
  }
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    for (;;)
      ;
  }
  Udp.begin(localPort);
}
void loop() {
  sendNTPpacket(timeServer);
  delay(1000);
  if (Udp.parsePacket()) {
    Udp.read(packetBuffer, NTP_PACKET_SIZE);
    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
    unsigned long secsSince1900 = highWord << 16 | lowWord;
    Serial.print("Seconds since Jan 1 1900 = ");
    Serial.println(secsSince1900);
    Serial.print("Unix time = ");
    const unsigned long seventyYears = 2208988800UL;
    unsigned long epoch = secsSince1900 - seventyYears;
    Serial.println(epoch);
    setTime(epoch);
    adjustTime(timeZone);
    UpdateLeds(weekday());
    
    Serial.print("the day of the week = ");
    Serial.println(weekday());
  }
  delay(10000);
  Ethernet.maintain();
}
void sendNTPpacket(char* 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;
  // all NTP fields have been given values, now
  // you can send a packet requesting a timestamp:
  Udp.beginPacket(address, 123); //NTP requests are to port 123
  Udp.write(packetBuffer, NTP_PACKET_SIZE);
  Udp.endPacket();
}
void UpdateLeds(int dayOfWeek) {
  for(int i = 1; i < NUM_PINS; i++) {
    if(i == dayOfWeek) {
      digitalWrite(ledPins[i], HIGH);
    }
    else
    {
      digitalWrite(ledPins[i], LOW);
    }
  }
}

Type: