├── README.md ├── NeoPixel_7_Segment_Clock └── NeoPixel_7_Segment_Clock.ino └── Digital_Clock └── Digital_Clock.ino /README.md: -------------------------------------------------------------------------------- 1 | # Neopixel-7-Segment-Digital-Clock 2 | *Digital Clock using WS2812b RGB 7 Segment Digit Display & ESP8266* 3 | 4 | whats new in V.2 5 | - Added support for the RTC module so continuous internet connection won't required. 6 | - Updates the current time automatically at the startup if connected to internet. 7 | - Display color changes automatically after a predefined time interval. 8 | - Reduced brightness and color changing at night mode. 9 | -------------------------------------------------------------------------------- /NeoPixel_7_Segment_Clock/NeoPixel_7_Segment_Clock.ino: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | #define PIXEL_PER_SEGMENT 2 // Number of LEDs in each Segment 10 | #define PIXEL_DIGITS 4 // Number of connected Digits 11 | #define PIXEL_PIN 2 // GPIO Pin 12 | #define PIXEL_DASH 1 // Binary segment 13 | 14 | #define LDR_PIN A0 // LDR pin 15 | #define DHT_PIN 13 // DHT Sensor pin 16 | #define BUTTON_PIN 12 // Button pin 17 | 18 | // Uncomment the type of sensor in use 19 | #define DHT_TYPE DHT11 // DHT 11 20 | //#define DHT_TYPE DHT22 // DHT 22 (AM2302) 21 | //#define DHT_TYPE DHT21 // DHT 21 (AM2301) 22 | 23 | #define TIME_FORMAT 12 // 12 = 12 hours format || 24 = 24 hours format 24 | 25 | Adafruit_NeoPixel strip = Adafruit_NeoPixel((PIXEL_PER_SEGMENT * 7 * PIXEL_DIGITS) + (PIXEL_DASH * 2), PIXEL_PIN, NEO_GRB + NEO_KHZ800); 26 | DHT dht(DHT_PIN, DHT_TYPE); 27 | 28 | // set Wi-Fi SSID and password 29 | const char *ssid = "SSID"; 30 | const char *password = "PASSWORD"; 31 | 32 | WiFiUDP ntpUDP; 33 | // 'time.nist.gov' is used (default server) with +1 hour offset (3600 seconds) 60 seconds (60000 milliseconds) update interval 34 | NTPClient timeClient(ntpUDP, "time.nist.gov", 19800, 60000); //GMT+5:30 : 5*3600+30*60=19800 35 | 36 | int period = 1000; //Update frequency 37 | unsigned long time_now = 0; 38 | int Second, Minute, Hour; 39 | 40 | // set default brightness 41 | int Brightness = 32; 42 | // current temperature, updated in loop() 43 | int Temperature; 44 | 45 | bool Show_Temp = false; 46 | 47 | //Digits array 48 | byte digits[12] = { 49 | //abcdefg 50 | 0b1111110, // 0 51 | 0b0011000, // 1 52 | 0b0110111, // 2 53 | 0b0111101, // 3 54 | 0b1011001, // 4 55 | 0b1101101, // 5 56 | 0b1101111, // 6 57 | 0b0111000, // 7 58 | 0b1111111, // 8 59 | 0b1111101, // 9 60 | 0b1100110, // C 61 | 0b1100011, // F 62 | }; 63 | 64 | //Clear all the Pixels 65 | void clearDisplay() { 66 | for (int i = 0; i < strip.numPixels(); i++) { 67 | strip.setPixelColor(i, strip.Color(0, 0, 0)); 68 | } 69 | strip.show(); 70 | } 71 | 72 | void setup() { 73 | Serial.begin(115200); 74 | strip.begin(); 75 | strip.show(); 76 | 77 | dht.begin(); 78 | pinMode(BUTTON_PIN, INPUT); 79 | 80 | WiFi.begin(ssid, password); 81 | Serial.print("Connecting."); 82 | while ( WiFi.status() != WL_CONNECTED ) { 83 | delay(500); 84 | Serial.print("."); 85 | } 86 | Serial.println("connected"); 87 | timeClient.begin(); 88 | delay(10); 89 | } 90 | 91 | void loop() { 92 | if (WiFi.status() == WL_CONNECTED) { // check WiFi connection status 93 | int sensor_val = analogRead(LDR_PIN); 94 | Brightness = map(sensor_val, 100, 1024, 128, 4); 95 | timeClient.update(); 96 | int Hours; 97 | unsigned long unix_epoch = timeClient.getEpochTime(); // get UNIX Epoch time 98 | Second = second(unix_epoch); // get seconds 99 | Minute = minute(unix_epoch); // get minutes 100 | Hours = hour(unix_epoch); // get hours 101 | 102 | if (TIME_FORMAT == 12) { 103 | if (Hours > 12) { 104 | Hour = Hours - 12; 105 | } 106 | else 107 | Hour = Hours; 108 | } 109 | else 110 | Hour = Hours; 111 | } 112 | 113 | if (digitalRead(BUTTON_PIN) == LOW) { 114 | Show_Temp = true; 115 | } 116 | else 117 | Show_Temp = false; 118 | 119 | if (Show_Temp) { 120 | Temperature = dht.readTemperature(); 121 | Serial.println(Temperature); 122 | clearDisplay(); 123 | writeDigit(0, Temperature / 10); 124 | writeDigit(1, Temperature % 10); 125 | writeDigit(2, 10); 126 | strip.setPixelColor(28, strip.Color(Brightness, Brightness, Brightness)); 127 | strip.show(); 128 | delay(3000); 129 | clearDisplay(); 130 | Show_Temp = false; 131 | } 132 | while (millis() > time_now + period) { 133 | time_now = millis(); 134 | disp_Time(); // Show Time 135 | } 136 | } 137 | 138 | void disp_Time() { 139 | clearDisplay(); 140 | writeDigit(0, Hour / 10); 141 | writeDigit(1, Hour % 10); 142 | writeDigit(2, Minute / 10); 143 | writeDigit(3, Minute % 10); 144 | writeDigit(4, Second / 10); 145 | writeDigit(5, Second % 10); 146 | disp_Dash(); 147 | strip.show(); 148 | } 149 | 150 | void disp_Dash() { 151 | int dot, dash; 152 | for (int i = 0; i < 2; i++) { 153 | dot = 2 * (PIXEL_PER_SEGMENT * 7) + i; 154 | for (int j = 0; j < PIXEL_DASH; j++) { 155 | dash = dot + j * (2 * (PIXEL_PER_SEGMENT * 7) + 2); 156 | Second % 2 == 0 ? strip.setPixelColor(dash, strip.Color(Brightness, Brightness, Brightness)) : strip.setPixelColor(dash, strip.Color(0, 0, 0)); 157 | } 158 | } 159 | } 160 | 161 | void writeDigit(int index, int val) { 162 | byte digit = digits[val]; 163 | int margin; 164 | if (index == 0 || index == 1 ) margin = 0; 165 | if (index == 2 || index == 3 ) margin = 1; 166 | if (index == 4 || index == 5 ) margin = 2; 167 | for (int i = 6; i >= 0; i--) { 168 | int offset = index * (PIXEL_PER_SEGMENT * 7) + i * PIXEL_PER_SEGMENT + margin * 2; 169 | uint32_t color; 170 | if (digit & 0x01 != 0) { 171 | if (index == 0 || index == 1 ) color = strip.Color(Brightness, 0, 0); 172 | if (index == 2 || index == 3 ) color = strip.Color(0, Brightness, 0); 173 | if (index == 4 || index == 5 ) color = strip.Color(0, 0, Brightness); 174 | } 175 | else 176 | color = strip.Color(0, 0, 0); 177 | 178 | for (int j = offset; j < offset + PIXEL_PER_SEGMENT; j++) { 179 | strip.setPixelColor(j, color); 180 | } 181 | digit = digit >> 1; 182 | } 183 | } 184 | -------------------------------------------------------------------------------- /Digital_Clock/Digital_Clock.ino: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | #define PIXEL_PER_SEGMENT 2 // Number of LEDs in each Segment 9 | #define PIXEL_DIGITS 4 // Number of connected Digits 10 | #define PIXEL_PIN 2 // GPIO Pin 11 | #define PIXEL_DASH 1 // Binary segment 12 | 13 | #define LDR_PIN A0 // LDR pin 14 | #define BUTTON_PIN 12 // Button pin 15 | 16 | #define TIME_FORMAT 12 // 12 = 12 hours format || 24 = 24 hours format 17 | 18 | Adafruit_NeoPixel strip = Adafruit_NeoPixel((PIXEL_PER_SEGMENT * 7 * PIXEL_DIGITS) + (PIXEL_DASH * 2), PIXEL_PIN, NEO_GRB + NEO_KHZ800); 19 | 20 | // set Wi-Fi SSID and password 21 | const char *ssid = "SSID"; 22 | const char *password = "PASSWORD"; 23 | 24 | RTC_DS3231 rtc; 25 | 26 | bool Set_Time = false; 27 | bool night_mode = false; 28 | int brightness_threshold = 50; 29 | 30 | WiFiUDP ntpUDP; 31 | // 'time.nist.gov' is used (default server) with +1 hour offset (3600 seconds) 60 seconds (60000 milliseconds) update interval 32 | NTPClient timeClient(ntpUDP, "time.nist.gov", 19800, 60000); // GMT calculation >> GMT+5:30 : (5*3600)+(30*60) = 19800 33 | 34 | int period = 30000; // screen update interval 35 | unsigned long time_now = -30000; 36 | int Second, Minute, Hour; 37 | 38 | // set default brightness 39 | uint32_t r = 180, g = 0, b = 0; 40 | 41 | //Digits array 42 | byte digits[12] = { 43 | //abcdefg 44 | 0b1111110, // 0 45 | 0b0011000, // 1 46 | 0b0110111, // 2 47 | 0b0111101, // 3 48 | 0b1011001, // 4 49 | 0b1101101, // 5 50 | 0b1101111, // 6 51 | 0b0111000, // 7 52 | 0b1111111, // 8 53 | 0b1111101, // 9 54 | 0b1100110, // C 55 | 0b1100011, // F 56 | }; 57 | 58 | //Clear all the Pixels 59 | void clearDisplay() { 60 | for (int i = 0; i < strip.numPixels(); i++) { 61 | strip.setPixelColor(i, strip.Color(0, 0, 0)); 62 | } 63 | strip.show(); 64 | } 65 | 66 | void setup() { 67 | Serial.begin(115200); 68 | strip.begin(); 69 | strip.show(); 70 | if (! rtc.begin()) { 71 | Serial.println("Couldn't find RTC"); 72 | Serial.flush(); 73 | abort(); 74 | } 75 | //attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), ISR, RISING); 76 | WiFi.begin(ssid, password); 77 | Serial.print("Connecting..."); 78 | delay(1000); 79 | 80 | if ( WiFi.status() == WL_CONNECTED ) { 81 | Serial.println("connected"); 82 | for (int i = 0; i < strip.numPixels(); i++) { 83 | strip.setPixelColor(i, strip.Color(60, 60, 60)); 84 | } 85 | strip.show(); 86 | Set_Time = true; 87 | } 88 | else 89 | Set_Time = false; 90 | } 91 | /* 92 | ICACHE_RAM_ATTR void ISR() { 93 | Set_Time = true; 94 | } 95 | */ 96 | void loop() { 97 | if (Set_Time) { 98 | timeClient.begin(); 99 | 100 | // check WiFi connection status 101 | if (WiFi.status() == WL_CONNECTED) { 102 | timeClient.update(); 103 | unsigned long unix_epoch = timeClient.getEpochTime(); // get UNIX Epoch time 104 | Second = second(unix_epoch); // get seconds 105 | Minute = minute(unix_epoch); // get minutes 106 | Hour = hour(unix_epoch); // get hours 107 | 108 | if (TIME_FORMAT == 12) { 109 | if (Hour >= 13) { 110 | Hour = Hour - 12; 111 | } 112 | if (Hour == 00) { 113 | Hour = 12; 114 | } 115 | else 116 | Hour = Hour; 117 | } 118 | else if (TIME_FORMAT == 24) { 119 | Hour = Hour; 120 | } 121 | Serial.print(Hour); 122 | Serial.print(":"); 123 | Serial.print(Minute); 124 | Serial.print(":"); 125 | Serial.print(Second); 126 | Serial.println(" "); 127 | rtc.adjust(DateTime(2020, 1, 1, Hour, Minute, Second)); 128 | Serial.println("Time Set"); 129 | WiFi.disconnect(); 130 | Set_Time = false; 131 | } 132 | } 133 | else { 134 | DateTime now = rtc.now(); 135 | 136 | Second = now.second(); 137 | Minute = now.minute(); 138 | Hour = now.hour(); 139 | 140 | if (TIME_FORMAT == 12) { 141 | if (Hour >= 13) { 142 | Hour = Hour - 12; 143 | } 144 | if (Hour == 00) { 145 | Hour = 12; 146 | } 147 | else 148 | Hour = Hour; 149 | } 150 | else if (TIME_FORMAT == 24) { 151 | Hour = Hour; 152 | } 153 | 154 | uint32_t sensor_val = analogRead(LDR_PIN); 155 | if (sensor_val < brightness_threshold) { 156 | r = 6; 157 | g = 6; 158 | b = 6; 159 | night_mode = true; 160 | time_now = -30000; 161 | } 162 | else if (sensor_val > brightness_threshold && night_mode) { 163 | ESP.restart(); 164 | } 165 | if (!night_mode) { 166 | disp_Dash(); 167 | } 168 | while (millis() > time_now + period) { 169 | time_now = millis(); 170 | Serial.print("Time Now : "); 171 | Serial.print(Hour); 172 | Serial.print(":"); 173 | Serial.print(Minute); 174 | Serial.print(":"); 175 | Serial.print(Second); 176 | Serial.println(" "); 177 | disp_Time(); // Show Time 178 | } 179 | } 180 | } 181 | 182 | 183 | void disp_Time() { 184 | clearDisplay(); 185 | writeDigit(0, Hour / 10); 186 | writeDigit(1, Hour % 10); 187 | writeDigit(2, Minute / 10); 188 | writeDigit(3, Minute % 10); 189 | writeDigit(4, Second / 10); 190 | writeDigit(5, Second % 10); 191 | strip.show(); 192 | } 193 | 194 | void disp_Dash() { 195 | int dot, dash; 196 | for (int i = 0; i < 2; i++) { 197 | dot = 2 * (PIXEL_PER_SEGMENT * 7) + i; 198 | for (int j = 0; j < PIXEL_DASH; j++) { 199 | dash = dot + j * (2 * (PIXEL_PER_SEGMENT * 7) + 2); 200 | Second % 2 == 0 ? strip.setPixelColor(dash, strip.Color(r / 3, g / 3, b / 3)) : strip.setPixelColor(dash, strip.Color(0, 0, 0)); 201 | } 202 | } 203 | strip.show(); 204 | } 205 | 206 | void writeDigit(int index, int val) { 207 | byte digit = digits[val]; 208 | int margin; 209 | if (index == 0 || index == 1 ) margin = 0; 210 | if (index == 2 || index == 3 ) margin = 1; 211 | if (index == 4 || index == 5 ) margin = 2; 212 | for (int i = 6; i >= 0; i--) { 213 | int offset = index * (PIXEL_PER_SEGMENT * 7) + i * PIXEL_PER_SEGMENT + margin * 2; 214 | uint32_t color; 215 | if (digit & 0x01 != 0) { 216 | if (!night_mode) { 217 | if (r > 0 && b == 0) { 218 | r--; 219 | g++; 220 | } 221 | if (g > 0 && r == 0) { 222 | g--; 223 | b++; 224 | } 225 | if (b > 0 && g == 0) { 226 | r++; 227 | b--; 228 | } 229 | } 230 | color = strip.Color(r / 3, g / 3, b / 3); 231 | } 232 | else 233 | color = strip.Color(0, 0, 0); 234 | 235 | for (int j = offset; j < offset + PIXEL_PER_SEGMENT; j++) { 236 | strip.setPixelColor(j, color); 237 | } 238 | digit = digit >> 1; 239 | } 240 | } 241 | --------------------------------------------------------------------------------