#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <NTPClient.h>
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <gpio.h>


#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     -1 
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define DATA_PIN     D3        //  OUT 1           =  data output pin voor de ledstrip 
#define LED_UP       D6        // Led Enter button =  power ON led 
#define LED_ENTER    D5        // Led Up button    =  internet verbinding OK led
#define LED_DOWN     D7        // Led Down  button
#define BUTTON_UP    21
#define BUTTON_ENTER 22
#define BUTTON_DOWN  D8
#define RELAY_1      D11
#define RELAY_2      D13
const int BEEPER =   9;


const char *ssid      = "telenet-AC36D28";   //  kkkk
const char *password  = "******";
 
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "europe.pool.ntp.org",0,60000);     // 2 uur bijtellen 3600 

void setup() {

  display.begin(SSD1306_SWITCHCAPVCC,0x3C);     	                          // oled display aanzetten
	display.clearDisplay();
  display.display() ;

  //pinMode(RELAY_1,      OUTPUT);
  //pinMode(RELAY_2,      OUTPUT);
  pinMode(BUTTON_UP,    INPUT);
  pinMode(BUTTON_ENTER, INPUT);
  pinMode(BUTTON_DOWN,  INPUT);
  pinMode(LED_UP,       OUTPUT); // Initialize the LED pin as an output
  pinMode(LED_ENTER,    OUTPUT); // Initialize the LED pin as an output
  pinMode(LED_DOWN,     OUTPUT); // Initialize the LED pin as an output
  pinMode(BEEPER,       OUTPUT);

  //digitalWrite(RELAY_1,   LOW);
  //digitalWrite(RELAY_2,   LOW);

  

  display.setTextSize(2);                                            // Oled scherm   uur:minuten:seconden  weergeven
	display.setTextColor(WHITE);   

  display.setCursor(0,20);
  display.println("Zoekt WiFi" );      

  display.display() ;
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED ) {
    delay ( 200 );
    digitalWrite(LED_ENTER,    HIGH);
    digitalWrite(LED_UP,       LOW);
    digitalWrite(LED_DOWN,     HIGH);
    digitalWrite(BEEPER,       HIGH); 

    delay ( 200 );

    digitalWrite(LED_ENTER,    LOW);
    digitalWrite(LED_UP,       HIGH);     }
    digitalWrite(LED_DOWN,     LOW);
    digitalWrite(BEEPER,       LOW);     

    digitalWrite(LED_ENTER,    HIGH);
    digitalWrite(LED_UP,       HIGH);
    digitalWrite(LED_DOWN,     HIGH);

    display.clearDisplay();
    display.setTextSize(2);                                            // Oled scherm   uur:minuten:seconden  weergeven
	  display.setCursor(10,20);
    display.println("Connected" ); 
    display.display() ;
    timeClient.begin();
        
    delay(2000);       
    

}
String weekDays[7]={"Zondag", "Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrijdag", "Zaterdag"};

String months[12]={"Januari", "February", "   Maart", "  April", "  Mei", "  Juni", "  Juli", "Augustus", "September", "Oktober", "November", "December"};


void loop() {

display.clearDisplay();
timeClient.update();
time_t epochTime = timeClient.getEpochTime();          // ruwe data klok
struct tm *ptm = gmtime ((time_t *)&epochTime);

int zomerwinter = ptm->tm_isdst;                      // winteruur = 1  ;  zomeruur = 0
if (zomerwinter == 1)
{timeClient.setTimeOffset(3600); }      // winteruur = 3600 seconden minder
else
{timeClient.setTimeOffset(7200); }      // zomeruur  = 7200 seconden bij ntp-tijd bijtellen
 
String formattedTime = timeClient.getFormattedTime();                   
display.setCursor(12, 0);                              // tijd in HH:MM:SS    
display.println(formattedTime);

display.setCursor(15,20);
String weekDay = weekDays[timeClient.getDay()];         // bvb Donderdag
display.println(weekDay); 

int currentMonth = ptm->tm_mon+1;                      // welke maand: 0 = Januari ,       4 = Mei,  11 = December

int monthDay = ptm->tm_mday;
display.setCursor(0,40);                               // welke dag:  bvb 24
display.println(monthDay);

String currentMonthName = months[currentMonth-1];
display.setCursor(30,40);                              // welke maand:  bvb November
display.println(currentMonthName);

int currentYear = ptm->tm_year+1900;                   // welk jaar // 

display.display();

}


