// hobbyprojects.com // apa102_NodeMCU_NTP_Propeller_Clock.ino #include #include #include const char *ssid = "Your_SSID"; const char *password = "Your_PASSWORD"; const long utcOffsetInSeconds = 19800; // Calculating Time with Time Zones: https://docstore.mik.ua/orelly/webprog/pcook/ch03_12.htm String color; int apa102Data = D3; int apa102Clock = D4; int sensorPin = D7; int input_state; byte Day,hours,minutes,seconds = 0; int i,k,val; byte a,c,z = 0; char s; unsigned nm; byte LED_red[] = {0b11100011,0b00000000,0b00000000,0b11111111}; byte LED_green[] = {0b11100011,0b00000000,0b11111111,0b00000000}; byte LED_blue[] = {0b11100011,0b11111111,0b00000000,0b00000000}; byte LED_yellow[] = {0b11100011,0b00000000,0b11111111,0b11111111}; byte LED_cyan[] = {0b11100011,0b11111111,0b11111111,0b00000000}; byte LED_magenta[] = {0b11100011,0b11111111,0b00000000,0b11111111}; byte LED_white[] = {0b11100011,0b11111111,0b11111111,0b11111111}; byte LED_black[] = {0b11100000,0b00000000,0b00000000,0b00000000}; const PROGMEM unsigned char data_blank[]={0b11100000,0b00000000,0b00000000,0b00000000}; const PROGMEM unsigned char data[]={ 0x3e,0x45,0x49,0x51,0x3e,0x00,0x00,0x21,0x7f,0x01,0x00,0x00,0x21,0x43,0x45,0x49,0x31,0x00,0x42,0x41,0x51,0x69,0x46,0x00, 0x0c,0x14,0x24,0x7f,0x04,0x00,0x72,0x51,0x51,0x51,0x5e,0x00,0x1e,0x29,0x49,0x49,0x06,0x00,0x40,0x47,0x48,0x50,0x60,0x00, 0x36,0x49,0x49,0x49,0x36,0x00,0x30,0x49,0x49,0x4a,0x3c,0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x31,0x49,0x49,0x49,0x46,0x00,0x1e,0x01,0x01,0x02,0x1f,0x00,0x1f,0x08,0x10,0x10,0x0f,0x00,0x0e,0x11,0x11,0x09,0x7f,0x00, 0x02,0x15,0x15,0x15,0x0f,0x00,0x18,0x05,0x05,0x05,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x20,0x18,0x20,0x7f,0x00,0x0e,0x11,0x11,0x11,0x0e,0x00,0x1f,0x08,0x10,0x10,0x0f,0x00, 0x0e,0x11,0x11,0x09,0x7f,0x00,0x02,0x15,0x15,0x15,0x0f,0x00,0x18,0x05,0x05,0x05,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x7f,0x40,0x40,0x00,0x1e,0x01,0x01,0x02,0x1f,0x00, 0x0e,0x15,0x15,0x15,0x0c,0x00,0x09,0x15,0x15,0x15,0x02,0x00,0x0e,0x11,0x11,0x09,0x7f,0x00,0x02,0x15,0x15,0x15,0x0f,0x00, 0x18,0x05,0x05,0x05,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x01,0x0e,0x01,0x7e,0x00,0x0e,0x15,0x15,0x15,0x0c,0x00, 0x0e,0x11,0x11,0x09,0x7f,0x00,0x1f,0x08,0x10,0x10,0x0f,0x00,0x0e,0x15,0x15,0x15,0x0c,0x00,0x09,0x15,0x15,0x15,0x02,0x00, 0x0e,0x11,0x11,0x09,0x7f,0x00,0x02,0x15,0x15,0x15,0x0f,0x00,0x18,0x05,0x05,0x05,0x1e,0x00,0x40,0x40,0x7f,0x40,0x40,0x00, 0x7f,0x08,0x10,0x10,0x0f,0x00,0x1e,0x01,0x01,0x02,0x1f,0x00,0x1f,0x08,0x10,0x10,0x08,0x00,0x09,0x15,0x15,0x15,0x02,0x00, 0x0e,0x11,0x11,0x09,0x7f,0x00,0x02,0x15,0x15,0x15,0x0f,0x00,0x18,0x05,0x05,0x05,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x48,0x48,0x48,0x40,0x00,0x1f,0x08,0x10,0x10,0x08,0x00,0x00,0x11,0x5f,0x01,0x00,0x00, 0x0e,0x11,0x11,0x09,0x7f,0x00,0x02,0x15,0x15,0x15,0x0f,0x00,0x18,0x05,0x05,0x05,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x49,0x49,0x49,0x46,0x00,0x02,0x15,0x15,0x15,0x0f,0x00,0x10,0x7e,0x11,0x01,0x02,0x00, 0x1e,0x01,0x01,0x02,0x1f,0x00,0x1f,0x08,0x10,0x10,0x08,0x00,0x0e,0x11,0x11,0x09,0x7f,0x00,0x02,0x15,0x15,0x15,0x0f,0x00, 0x18,0x05,0x05,0x05,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x01,0x0e,0x01,0x7e,0x00, 0x0e,0x15,0x15,0x15,0x0c,0x00,0x00,0x41,0x7f,0x01,0x00,0x00,0x0e,0x11,0x11,0x11,0x02,0x00,0x0e,0x11,0x11,0x11,0x0e,0x00, 0x1f,0x10,0x0c,0x10,0x0f,0x00,0x0e,0x15,0x15,0x15,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x01,0x0e,0x01,0x7e,0x00, 0x7e,0x01,0x0e,0x01,0x7e,0x00,0x7e,0x01,0x0e,0x01,0x7e,0x00,0x00,0x03,0x03,0x00,0x00,0x00,0x7f,0x08,0x10,0x10,0x0f,0x00, 0x0e,0x11,0x11,0x11,0x0e,0x00,0x7f,0x09,0x11,0x11,0x0e,0x00,0x7f,0x09,0x11,0x11,0x0e,0x00,0x18,0x05,0x05,0x05,0x1e,0x00, 0x1f,0x14,0x14,0x14,0x08,0x00,0x1f,0x08,0x10,0x10,0x08,0x00,0x0e,0x11,0x11,0x11,0x0e,0x00,0x02,0x01,0x11,0x5e,0x00,0x00, 0x0e,0x15,0x15,0x15,0x0c,0x00,0x0e,0x11,0x11,0x11,0x02,0x00,0x10,0x7e,0x11,0x01,0x02,0x00,0x09,0x15,0x15,0x15,0x02,0x00, 0x00,0x03,0x03,0x00,0x00,0x00,0x0e,0x11,0x11,0x11,0x02,0x00,0x0e,0x11,0x11,0x11,0x0e,0x00,0x1f,0x10,0x0c,0x10,0x0f,0x00}; WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds); void setup() { pinMode(sensorPin, INPUT_PULLUP); pinMode(apa102Data,OUTPUT); pinMode(apa102Clock,OUTPUT); color = "red"; Serial.begin(9600); WiFi.begin(ssid, password); while ( WiFi.status() != WL_CONNECTED ) { delay ( 500 ); Serial.print ( "." ); LED1_ON(); delay(250); LED1_OFF(); delay(250); } timeClient.begin(); update_time(); Serial.println(timeClient.getFormattedTime()); } void loop() { if(z == 0) { val = digitalRead(sensorPin); if(val == HIGH) { z = 1; update_time(); k = Day * 54; i = 0; color = "green"; while(i < 54) { c = (pgm_read_byte(&(data+k+66)[i])); display_col(); displayClear(); i++; } color = "cyan"; nm = seconds; nm = nm%10; display1(); color = "magenta"; nm = seconds/10; nm = nm%10; display1(); color = "white"; nm = 10; display1(); color = "yellow"; nm = minutes; nm = nm%10; display1(); color = "blue"; nm = minutes/10; nm = nm%10; display1(); color = "white"; nm = 10; display1(); color = "green"; nm = hours; nm = nm%10; display1(); color = "red"; nm = hours/10; nm = nm%10; display1(); } } if(z == 1) { val = digitalRead(sensorPin); if(val == LOW) { z = 0; } } } void display1() { int k = nm*6; int i = 5; while(i >= 0) { c = (pgm_read_byte(&(data+k)[i])); s=0; for(a = 0; a < 8; a++) { s <<= 1; s |= c & 1; c >>= 1; } s >>= 1; c = s; display_col(); displayClear(); i--; } } void display_col() { // Start Frame spiWrite(0x00); spiWrite(0x00); spiWrite(0x00); spiWrite(0x00); // LED frame if(c & 1) // if bit D0 bit is 1 rgbLEDon(); else rgbLEDoff(); if(c & 2) // if bit D1 bit is 1 rgbLEDon(); else rgbLEDoff(); if(c & 4) // if bit D2 bit is 1 rgbLEDon(); else rgbLEDoff(); if(c & 8) // if bit D3 bit is 1 rgbLEDon(); else rgbLEDoff(); if(c & 16) // if bit D4 bit is 1 rgbLEDon(); else rgbLEDoff(); if(c & 32) // if bit D5 bit is 1 rgbLEDon(); else rgbLEDoff(); if(c & 64) // if bit D6 bit is 1 rgbLEDon(); else rgbLEDoff(); // End frame spiWrite(0b11111111); } void rgbLEDon() { int k = 4; for(int i = 0; i < k; i++) { if(color == "red") a = LED_red[i]; else if(color == "green") a = LED_green[i]; else if(color == "blue") a = LED_blue[i]; else if(color == "yellow") a = LED_yellow[i]; else if(color == "cyan") a = LED_cyan[i]; else if(color == "magenta") a = LED_magenta[i]; else if(color == "white") a = LED_white[i]; else if(color == "black") a = LED_black[i]; spiWrite(a); } } void rgbLEDoff() { spiWrite(0b11100000); spiWrite(0b00000000); spiWrite(0b00000000); spiWrite(0b00000000); } void displayClear() { // Start Frame spiWrite(0x00); spiWrite(0x00); spiWrite(0x00); spiWrite(0x00); // LED frames for(int k = 0; k < 7; k++) { for(int i = 0; i < 4; i++) { a = pgm_read_byte(&(data_blank)[i]); spiWrite(a); } } // End frame spiWrite(0b11111111); } //----------------------------------- void spiWrite(uint8_t c) { uint8_t i; for (i=0; i<8 ;i++) { if (!(c&0x80)) { digitalWrite(apa102Data, LOW); } else { digitalWrite(apa102Data, HIGH); } digitalWrite(apa102Clock, HIGH); c <<= 1; digitalWrite(apa102Clock, LOW); } digitalWrite(apa102Data, HIGH); } void update_time() { timeClient.update(); Day = timeClient.getDay(); hours=timeClient.getHours(); minutes=(timeClient.getMinutes()); seconds=(timeClient.getSeconds()); } void LED1_ON() { // Start Frame spiWrite(0x00); spiWrite(0x00); spiWrite(0x00); spiWrite(0x00); // LED frame spiWrite(0b11100011); // The first three bits(MSB) of the LED frame should be ‘1’. The next 5 bits(LSB) are brightness value (0–31) spiWrite(0b00000000); // blue LED OFF) spiWrite(0b11111111); // green LED ON) spiWrite(0b00000000); // red LED OFF) // End frame spiWrite(0b11111111); } void LED1_OFF() { // Start Frame spiWrite(0x00); spiWrite(0x00); spiWrite(0x00); spiWrite(0x00); //LED frame spiWrite(0b11100000); // The first three bits(MSB) of the LED frame should be ‘1’. The next 5 bits(LSB) are brightness value (0–31) spiWrite(0b00000000); // blue LED OFF) spiWrite(0b00000000); // green LED OFF) spiWrite(0b00000000); // red LED OFF) // End frame spiWrite(0b11111111); }