|
// Часы с переводом с летнего на зимний и обратно |
|
// WEMOS D1 Mini и лента WS2812 (3 на вертикальные сегменты, 2 на горизонтальные, всего 74 с двумя точками) |
|
|
|
#include <NTPClient.h> |
|
#include <ESP8266WiFi.h> |
|
#include <WiFiUdp.h> |
|
|
|
#define LED_PIN 2 // номер пина к которому подключаем ленту (на плате Wemos 2 = D4) |
|
#define LED_NUM 74 // количество светодиодов |
|
#include "FastLED.h" |
|
CRGB leds[LED_NUM]; |
|
byte digits[10][18] = |
|
{ |
|
{1,1,1, 1,1,1, 1,1, 1,1,1, 1,1,1, 1,1, 0,0 }, // Digit 0 |
|
{0,0,0, 0,0,0, 0,0, 1,1,1, 1,1,1, 0,0, 0,0 }, // 1 |
|
{0,0,0, 1,1,1, 1,1, 0,0,0, 1,1,1, 1,1, 1,1 }, // 2 |
|
{0,0,0, 0,0,0, 1,1, 1,1,1, 1,1,1, 1,1, 1,1 }, // 3 |
|
{1,1,1, 0,0,0, 0,0, 1,1,1, 1,1,1, 0,0, 1,1 }, // 4 |
|
{1,1,1, 0,0,0, 1,1, 1,1,1, 0,0,0, 1,1, 1,1 }, // 5 |
|
{1,1,1, 1,1,1, 1,1, 1,1,1, 0,0,0, 1,1, 1,1 }, // 6 |
|
{0,0,0, 0,0,0, 0,0, 1,1,1, 1,1,1, 1,1, 0,0 }, // 7 |
|
{1,1,1, 1,1,1, 1,1, 1,1,1, 1,1,1, 1,1, 1,1 }, // 8 |
|
{1,1,1, 0,0,0, 1,1, 1,1,1, 1,1,1, 1,1, 1,1 } // 9 |
|
}; |
|
|
|
bool Dot = true; // Состояние точки |
|
long ledColor = CRGB::Aqua ; // Используется в ф-ции Time2Array для задания цвета точек |
|
|
|
const char* ssid = "Точка доступа"; |
|
const char* password = "пароль к точке доступа"; |
|
|
|
#define CLBUTTOM 0 // номер кнопки переключения с зимнего на летнее время (0 = D3 контакт) |
|
|
|
byte hour, minute; |
|
boolean second = true; |
|
|
|
WiFiUDP ntpUDP; |
|
NTPClient timeClient(ntpUDP); |
|
|
|
void setup(){ |
|
Serial.begin(115200); |
|
|
|
pinMode(CLBUTTOM, INPUT); // назначить выводу порт ввода |
|
// подтянем пин физически резистором 10к |
|
|
|
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, LED_NUM); |
|
FastLED.setBrightness(50); |
|
|
|
WiFi.begin(ssid, password); |
|
|
|
while ( WiFi.status() != WL_CONNECTED ) { |
|
delay ( 500 ); Serial.print ( "." ); |
|
} |
|
|
|
timeClient.begin(); // Инициализация клиента времени |
|
timeClient.setTimeOffset(10800); // Наш часовой пояс +3 UTC |
|
} |
|
|
|
void loop() { |
|
if (digitalRead(CLBUTTOM) == HIGH) { // Летнее или зимнее время |
|
timeClient.setTimeOffset(10800); // Serial.println("HIGH"); |
|
} else { |
|
timeClient.setTimeOffset(7200); // Serial.println("LOW"); |
|
} |
|
|
|
// Следующие строки гарантируют, что мы получим правильную дату и время: |
|
while(!timeClient.update()) { |
|
timeClient.forceUpdate(); |
|
} |
|
// Примечание: иногда NTP-клиент извлекает 1970-е годы. Чтобы этого не произошло, нам нужно принудительно установить обновление. |
|
|
|
hour = timeClient.getHours(); // Часы |
|
minute = timeClient.getMinutes();// Минуты |
|
|
|
// Смена режима часовых точек |
|
if (Dot) Dot = false; |
|
else Dot = true; |
|
// Или так |
|
// Dot = !Dot; |
|
|
|
TimeToArray(); |
|
|
|
// for(int i=0;i<LED_NUM;i++){ Serial.print(leds[i]); Serial.print(" "); }; |
|
|
|
FastLED.show(); |
|
|
|
delay(1000); |
|
} |
|
|
|
// Функция перевода числа в точки на дисплее |
|
void TimeToArray(){ |
|
int Now = (hour*100+minute); // Записываем время в виде числа типа 1843 (18:43) |
|
int cursor = LED_NUM; |
|
|
|
// Serial.print(hour); Serial.print(" : "); Serial.print(minute); Serial.print(" = "); Serial.println(Now); |
|
|
|
// Смена режима точек |
|
if (Dot){leds[36]=ledColor; leds[37]=ledColor; } |
|
else {leds[36]=0x000000; leds[37]=0x000000; } |
|
|
|
for(int i=1;i<=4;i++){ |
|
int digit = Now % 10; // get last digit in time |
|
if (i==1){ |
|
cursor =56; |
|
for(int k=0; k<18;k++){ |
|
if (digits[digit][k]== 1){leds[cursor]=ledColor;} |
|
else if (digits[digit][k]==0){leds[cursor]=0x000000;}; |
|
cursor ++; |
|
}; |
|
} |
|
else if (i==2){ |
|
cursor =38; |
|
for(int k=0; k<18;k++){ |
|
if (digits[digit][k]== 1){leds[cursor]=ledColor;} |
|
else if (digits[digit][k]==0){leds[cursor]=0x000000;}; |
|
cursor ++; |
|
}; |
|
} |
|
else if (i==3){ |
|
cursor =18; |
|
for(int k=0; k<18;k++){ |
|
if (digits[digit][k]== 1){leds[cursor]=ledColor;} |
|
else if (digits[digit][k]==0){leds[cursor]=0x000000;}; |
|
cursor ++; |
|
}; |
|
} |
|
else if (i==4){ |
|
cursor =0; |
|
for(int k=0; k<18;k++){ |
|
if (digits[digit][k]== 1){leds[cursor]=ledColor;} |
|
else if (digits[digit][k]==0){leds[cursor]=0x000000;}; |
|
cursor ++; |
|
}; |
|
} |
|
Now /= 10; |
|
} |
|
} |