| Ваш IP: 3.238.232.88 | Online(43) - гости: 15, боты: 28 | Загрузка сервера: 0.52 ::::::::::::

Большие часы на RGB светодиодной ленте WS2811 (ESP8266)

Часы построены на wi-fi модуле NodeMcu v3 с чипом ESP8266 (ESP-12e)(Arduino IDE), в качестве сегментов часов используется адресная светодиодная RGB лента на основе чипа WS2811 (SM16703). На индикаторы часов выводится текущее время (ЧЧ:ММ.СС) и раз в минуту на 3 секунды текущая дата.

Каждый пиксель RGB ленты содержит три RGB светодиода которыми управляет микросхема WS2811. Напряжение питания RGB ленты 12 В. Каждый сегмент индикатора содержит один пиксель ленты, из которых собраны семисегментные цифры часов. Текущее время считывается с NTP-сервера при помощи платы ESP8266.

NPT– это протокол, который используется для синхронизации часов компьютера или иного устройства с сервером времени по сети. Любое сетевое устройство может послать сетевой пакет определённого вида серверу времени, а тот в ответ пришлёт точное значение времени. Запросившее устройство установит это значение на своих системных часах. Таким образом осуществляется синхронизация времени.

Управление RGB лентой осуществляется модулем NodeMcu v3 с чипом ESP8266.

Основные характеристики NodeMcu v3 (ESP-12E)

  • поддержка WiFi протоколов 802.11 b/g/n
  • Wi-Fi Direct (P2P), soft-AP
  • встроенный стек TCP/IP
  • встроенный TR переключатель, balun, LNA, усилитель мощности и соответствие сети
  • встроенный PLL, регуляторы, и система управления питанием
  • выходная мощность +20.5 дБм в режиме 802.11b
  • SDIO 2.0, SPI, UART
  • STBC, 1×1 MIMO, 2×1 MIMO
  • A-MPDU & A-MSDU aggregation & 0.4μs guard interval
  • пробуждение и отправка пакетов за время до 22 мс
  • Номинальное напряжение: 3,3 В
  • Входное напряжение: 3,7–20 В
  • Максимальный потребляемый ток: 220 мА

Контакты Wi-Fi модуля NodeMcu v3

Так как в качестве индикатора часов используется адресная светодиодная лента, то для ее управления понадобится всего один пин платы ESP8266 D6.

Для сборки часов необходимо отдельных 45 пикселей ленты, которые спаяны по следующей схеме:

15 и 14 сегменты (пиксели) ленты используются для индикации двоеточия, а сегмент 30 для точки.

Каждая цифра содержит семь сегментов (пикселей) ленты.

Перед загрузкой скетча Вам необходимо ознакомится со следующей статьей — wi-fi модуль NodeMcu v3 с чипом ESP8266 (ESP-12e)(Arduino IDE), так же Вам понадобятся следующие библиотеки:

Перед загрузкой скетча следует обратить внимание на строку:

NTPClient timeClient(ntpUDP, «pool.ntp.org», 21600, 3600123);// 21600 — временной сдвиг в секундах от UTC

21600 (6 часов) — временной сдвиг в секундах от UTC, установите свой временной сдвиг для Вашего региона.

Так в скетче укажите имя Вашей Wi-Fi сети и пароль.

const char *ssid = «Имя_Wi-Fi_сети «;

const char *password = «Пароль«;

Установите яркость свечения светодиодов:

brignes = 250

яркость от 10 до 255

#include <NTPClient.h>
#include <ESP8266WiFi.h> 
#include <WiFiUdp.h> 
#include <Wire.h> 
#include <Adafruit_NeoPixel.h>
 WiFiUDP ntpUDP;
      /////////////////  https://www.ntppool.org/zone/@ - другие сервера  /////////////////////////////
      ///////////////// для России - ru.pool.ntp.org //////////////////////////////////////////////////
 NTPClient timeClient(ntpUDP, "pool.ntp.org", 21600,3600123);// 21600 - временной сдвиг в секундах от UTC 
 Adafruit_NeoPixel strip = Adafruit_NeoPixel(45, D6, NEO_GRB + NEO_KHZ400);//  кол-во пикселей, D6  
 const char *ssid = "Имя_Wi-Fi_сети "; 
 const char *password = "Пароль";
 String date_time,date;
 unsigned long times,times1;
 int ss,mm,hh,dd,mon,yer,brignes = 250;
 int hear10,hear0,min10,min0,sec10,sec0;
 int hhh,ss_old;
 
void setup(){
  Serial.begin(9600);strip.begin();
  WiFi.begin(ssid, password);
  while ( WiFi.status() != WL_CONNECTED ){delay (500);Serial.print (".");timeClient.begin();}
  Serial.print("ok");
  pinMode(2, OUTPUT);
}
 
void loop(){
 
  //// Time //////////////////////////////////////////
  if(millis()-times>=1000){times=millis();
   while(!timeClient.update()){timeClient.forceUpdate();}
   hh = timeClient.getHours();
   mm = timeClient.getMinutes();
   ss = timeClient.getSeconds();
  date_time = timeClient.getFormattedDate();
  int index_date = date_time.indexOf("T");
  date = date_time.substring(0, index_date);
  char charBufVar[11];date.toCharArray(charBufVar, 11);
   dd = int(charBufVar[0]-'0')*10+int(charBufVar[1]-'0');
   mon = int(charBufVar[3]-'0')*10+int(charBufVar[4]-'0');
   yer = int(charBufVar[8]-'0')*10+int(charBufVar[9]-'0');
  }
  //// ws2812 /////////////////////////////////////////
 
 if(ss>10&&ss<15){hear10=dd/10;hear0=dd%10;min10=mon/10;min0=mon%10;sec10=yer/10;sec0=yer%10;hhh=1;}
  else{hear10=hh/10;hear0=hh%10;min10=mm/10;min0=mm%10;sec10=ss/10;sec0=ss%10;hhh=0;}
 
 
  switch(hear10){   
    case 0: ws(0,1);ws(1,1);ws(2,1);ws(3,1);ws(4,1);ws(5,1);ws(6,0);break;
    case 1: ws(0,0);ws(1,1);ws(2,1);ws(3,0);ws(4,0);ws(5,0);ws(6,0);break;
    case 2: ws(0,1);ws(1,2);ws(2,0);ws(3,1);ws(4,1);ws(5,0);ws(6,1);break;
    case 3: ws(0,1);ws(1,1);ws(2,1);ws(3,1);ws(4,0);ws(5,0);ws(6,1);break;
    case 4: ws(0,0);ws(1,1);ws(2,1);ws(3,0);ws(4,0);ws(5,1);ws(6,1);break;
    case 5: ws(0,1);ws(1,0);ws(2,1);ws(3,1);ws(4,0);ws(5,1);ws(6,1);break;
    case 6: ws(0,1);ws(1,0);ws(2,1);ws(3,1);ws(4,1);ws(5,1);ws(6,1);break;
    case 7: ws(0,1);ws(1,1);ws(2,1);ws(3,0);ws(4,0);ws(5,0);ws(6,0);break;
    case 8: ws(0,1);ws(1,1);ws(2,1);ws(3,1);ws(4,1);ws(5,1);ws(6,1);break;
    case 9: ws(0,1);ws(1,1);ws(2,1);ws(3,1);ws(4,0);ws(5,1);ws(6,1);break;
   case 10: ws(0,0);ws(1,0);ws(2,0);ws(3,0);ws(4,0);ws(5,0);ws(6,0);break;// " "
   case 11: ws(0,0);ws(1,0);ws(2,0);ws(3,1);ws(4,1);ws(5,1);ws(6,1);break;// "t"
   case 12: ws(0,1);ws(1,1);ws(2,0);ws(3,0);ws(4,1);ws(5,1);ws(6,1);break;// "P"
   case 13: ws(0,0);ws(1,1);ws(2,1);ws(3,0);ws(4,1);ws(5,1);ws(6,1);break;// "H"
   case 14: ws(0,1);ws(1,0);ws(2,0);ws(3,1);ws(4,1);ws(5,1);ws(6,1);break;// "C"
   case 15: ws(0,1);ws(1,1);ws(2,0);ws(3,0);ws(4,0);ws(5,1);ws(6,1);break;// градус
    }
   switch(hear0){   
    case 0: ws(7,1);ws(8,1);ws(9,1);ws(10,1);ws(11,1);ws(12,1);ws(13,0);break;
    case 1: ws(7,0);ws(8,1);ws(9,1);ws(10,0);ws(11,0);ws(12,0);ws(13,0);break;
    case 2: ws(7,1);ws(8,2);ws(9,0);ws(10,1);ws(11,1);ws(12,0);ws(13,1);break;
    case 3: ws(7,1);ws(8,1);ws(9,1);ws(10,1);ws(11,0);ws(12,0);ws(13,1);break;
    case 4: ws(7,0);ws(8,1);ws(9,1);ws(10,0);ws(11,0);ws(12,1);ws(13,1);break;
    case 5: ws(7,1);ws(8,0);ws(9,1);ws(10,1);ws(11,0);ws(12,1);ws(13,1);break;
    case 6: ws(7,1);ws(8,0);ws(9,1);ws(10,1);ws(11,1);ws(12,1);ws(13,1);break;
    case 7: ws(7,1);ws(8,1);ws(9,1);ws(10,0);ws(11,0);ws(12,0);ws(13,0);break;
    case 8: ws(7,1);ws(8,1);ws(9,1);ws(10,1);ws(11,1);ws(12,1);ws(13,1);break;
    case 9: ws(7,1);ws(8,1);ws(9,1);ws(10,1);ws(11,0);ws(12,1);ws(13,1);break;
   case 10: ws(7,0);ws(8,0);ws(9,0);ws(10,0);ws(11,0);ws(12,0);ws(13,0);break;// " "
   case 11: ws(7,0);ws(8,0);ws(9,0);ws(10,1);ws(11,1);ws(12,1);ws(13,1);break;// "t"
   case 12: ws(7,1);ws(8,1);ws(9,0);ws(10,0);ws(11,1);ws(12,1);ws(13,1);break;// "P"
   case 13: ws(7,0);ws(8,1);ws(9,1);ws(10,0);ws(11,1);ws(12,1);ws(13,1);break;// "H"
   case 14: ws(7,1);ws(8,0);ws(9,0);ws(10,1);ws(11,1);ws(12,1);ws(13,1);break;// "C"
   case 15: ws(7,1);ws(8,1);ws(9,0);ws(10,0);ws(11,0);ws(12,1);ws(13,1);break;// градус   
    } 
 
/// двоеточие и запятая
   if(hhh==0){
   if(ss!=ss_old){times1=millis();}  
   if(millis()-times1<500){ws(14,1);ws(15,1);ws(30,1); digitalWrite(2, HIGH);}
   else{ws(14,0);ws(15,0);ws(30,0); digitalWrite(2, LOW);}
   ss_old=ss;}
 
   if(hhh==1){ws(14,1);ws(15,0);ws(30,1); digitalWrite(2, LOW);}
 
   switch(min10){   
    case 0: ws(16,1);ws(17,1);ws(18,1);ws(19,1);ws(20,1);ws(21,1);ws(22,0);break;
    case 1: ws(16,0);ws(17,1);ws(18,1);ws(19,0);ws(20,0);ws(21,0);ws(22,0);break;    
    case 2: ws(16,1);ws(17,2);ws(18,0);ws(19,1);ws(20,1);ws(21,0);ws(22,1);break;
    case 3: ws(16,1);ws(17,1);ws(18,1);ws(19,1);ws(20,0);ws(21,0);ws(22,1);break;
    case 4: ws(16,0);ws(17,1);ws(18,1);ws(19,0);ws(20,0);ws(21,1);ws(22,1);break;
    case 5: ws(16,1);ws(17,0);ws(18,1);ws(19,1);ws(20,0);ws(21,1);ws(22,1);break;
    case 6: ws(16,1);ws(17,0);ws(18,1);ws(19,1);ws(20,1);ws(21,1);ws(22,1);break;
    case 7: ws(16,1);ws(17,1);ws(18,1);ws(19,0);ws(20,0);ws(21,0);ws(22,0);break;
    case 8: ws(16,1);ws(17,1);ws(18,1);ws(19,1);ws(20,1);ws(21,1);ws(22,1);break;
    case 9: ws(16,1);ws(17,1);ws(18,1);ws(19,1);ws(20,0);ws(21,1);ws(22,1);break;
   case 10: ws(16,0);ws(17,0);ws(18,0);ws(19,0);ws(20,0);ws(21,0);ws(22,0);break;// " " 
   case 11: ws(16,0);ws(17,0);ws(18,0);ws(19,1);ws(20,1);ws(21,1);ws(22,1);break;// "t" 
   case 12: ws(16,1);ws(17,1);ws(18,0);ws(19,0);ws(20,1);ws(21,1);ws(22,1);break;// "P"
   case 13: ws(16,0);ws(17,1);ws(18,1);ws(19,0);ws(20,1);ws(21,1);ws(22,1);break;// "H"
   case 14: ws(16,1);ws(17,0);ws(18,0);ws(19,1);ws(20,1);ws(21,1);ws(22,1);break;// "C"
   case 15: ws(16,1);ws(17,1);ws(18,0);ws(19,0);ws(20,0);ws(21,1);ws(22,1);break;// градус  
    }
   switch(min0){   
    case 0: ws(23,1);ws(24,1);ws(25,1);ws(26,1);ws(27,1);ws(28,1);ws(29,0);break;
    case 1: ws(23,0);ws(24,1);ws(25,1);ws(26,0);ws(27,0);ws(28,0);ws(29,0);break;
    case 2: ws(23,1);ws(24,2);ws(25,0);ws(26,1);ws(27,1);ws(28,0);ws(29,1);break;
    case 3: ws(23,1);ws(24,1);ws(25,1);ws(26,1);ws(27,0);ws(28,0);ws(29,1);break;
    case 4: ws(23,0);ws(24,1);ws(25,1);ws(26,0);ws(27,0);ws(28,1);ws(29,1);break;
    case 5: ws(23,1);ws(24,0);ws(25,1);ws(26,1);ws(27,0);ws(28,1);ws(29,1);break;
    case 6: ws(23,1);ws(24,0);ws(25,1);ws(26,1);ws(27,1);ws(28,1);ws(29,1);break;
    case 7: ws(23,1);ws(24,1);ws(25,1);ws(26,0);ws(27,0);ws(28,0);ws(29,0);break;
    case 8: ws(23,1);ws(24,1);ws(25,1);ws(26,1);ws(27,1);ws(28,1);ws(29,1);break;
    case 9: ws(23,1);ws(24,1);ws(25,1);ws(26,1);ws(27,0);ws(28,1);ws(29,1);break;
   case 10: ws(23,0);ws(24,0);ws(25,0);ws(26,0);ws(27,0);ws(28,0);ws(29,0);break;// " " 
   case 11: ws(23,0);ws(24,0);ws(25,0);ws(26,1);ws(27,1);ws(28,1);ws(29,1);break;// "t" 
   case 12: ws(23,1);ws(24,1);ws(25,0);ws(26,0);ws(27,1);ws(28,1);ws(29,1);break;// "P"
   case 13: ws(23,0);ws(24,1);ws(25,1);ws(26,0);ws(27,1);ws(28,1);ws(29,1);break;// "H"
   case 14: ws(23,1);ws(24,0);ws(25,0);ws(26,1);ws(27,1);ws(28,1);ws(29,1);break;// "C"
   case 15: ws(23,1);ws(24,1);ws(25,0);ws(26,0);ws(27,0);ws(28,1);ws(29,1);break;// градус  
    } 
 
 
 
   switch(sec10){   
    case 0: ws(31,1);ws(32,1);ws(33,1);ws(34,1);ws(35,1);ws(36,1);ws(37,0);break;
    case 1: ws(31,0);ws(32,1);ws(33,1);ws(34,0);ws(35,0);ws(36,0);ws(37,0);break;
    case 2: ws(31,1);ws(32,2);ws(33,0);ws(34,1);ws(35,1);ws(36,0);ws(37,1);break;
    case 3: ws(31,1);ws(32,1);ws(33,1);ws(34,1);ws(35,0);ws(36,0);ws(37,1);break;
    case 4: ws(31,0);ws(32,1);ws(33,1);ws(34,0);ws(35,0);ws(36,1);ws(37,1);break;
    case 5: ws(31,1);ws(32,0);ws(33,1);ws(34,1);ws(35,0);ws(36,1);ws(37,1);break;
    case 6: ws(31,1);ws(32,0);ws(33,1);ws(34,1);ws(35,1);ws(36,1);ws(37,1);break;
    case 7: ws(31,1);ws(32,1);ws(33,1);ws(34,0);ws(35,0);ws(36,0);ws(37,0);break;
    case 8: ws(31,1);ws(32,1);ws(33,1);ws(34,1);ws(35,1);ws(36,1);ws(37,1);break;
    case 9: ws(31,1);ws(32,1);ws(33,1);ws(34,1);ws(35,0);ws(36,1);ws(37,1);break;
   case 10: ws(31,0);ws(32,0);ws(33,0);ws(34,0);ws(35,0);ws(36,0);ws(37,0);break;// " " 
   case 11: ws(31,0);ws(32,0);ws(33,0);ws(34,1);ws(35,1);ws(36,1);ws(37,1);break;// "t" 
   case 12: ws(31,1);ws(32,1);ws(33,0);ws(34,0);ws(35,1);ws(36,1);ws(37,1);break;// "P"
   case 13: ws(31,0);ws(32,1);ws(33,1);ws(34,0);ws(35,1);ws(36,1);ws(37,1);break;// "H"
   case 14: ws(31,1);ws(32,0);ws(33,0);ws(34,1);ws(35,1);ws(36,1);ws(37,1);break;// "C"
   case 15: ws(31,1);ws(32,1);ws(33,0);ws(34,0);ws(35,0);ws(36,1);ws(37,1);break;// градус    
    }
   switch(sec0){   
    case 0: ws(38,1);ws(39,1);ws(40,1);ws(41,1);ws(42,1);ws(43,1);ws(44,0);break;
    case 1: ws(38,0);ws(39,1);ws(40,1);ws(41,0);ws(42,0);ws(43,0);ws(44,0);break;
    case 2: ws(38,1);ws(39,2);ws(40,0);ws(41,1);ws(42,1);ws(43,0);ws(44,1);break;
    case 3: ws(38,1);ws(39,1);ws(40,1);ws(41,1);ws(42,0);ws(43,0);ws(44,1);break;
    case 4: ws(38,0);ws(39,1);ws(40,1);ws(41,0);ws(42,0);ws(43,1);ws(44,1);break;
    case 5: ws(38,1);ws(39,0);ws(40,1);ws(41,1);ws(42,0);ws(43,1);ws(44,1);break;
    case 6: ws(38,1);ws(39,0);ws(40,1);ws(41,1);ws(42,1);ws(43,1);ws(44,1);break;
    case 7: ws(38,1);ws(39,1);ws(40,1);ws(41,0);ws(42,0);ws(43,0);ws(44,0);break;
    case 8: ws(38,1);ws(39,1);ws(40,1);ws(41,1);ws(42,1);ws(43,1);ws(44,1);break;
    case 9: ws(38,1);ws(39,1);ws(40,1);ws(41,1);ws(42,0);ws(43,1);ws(44,1);break;
   case 10: ws(38,0);ws(39,0);ws(40,0);ws(41,0);ws(42,0);ws(43,0);ws(44,0);break;// " " 
   case 11: ws(38,0);ws(39,0);ws(40,0);ws(41,1);ws(42,1);ws(43,1);ws(44,1);break;// "t" 
   case 12: ws(38,1);ws(39,1);ws(40,0);ws(41,0);ws(42,1);ws(43,1);ws(44,1);break;// "P"
   case 13: ws(38,0);ws(39,1);ws(40,1);ws(41,0);ws(42,1);ws(43,1);ws(44,1);break;// "H"
   case 14: ws(38,1);ws(39,0);ws(40,0);ws(41,1);ws(42,1);ws(43,1);ws(44,1);break;// "C"
   case 15: ws(38,1);ws(39,1);ws(40,0);ws(41,0);ws(42,0);ws(43,1);ws(44,1);break;// градус    
    } 
  strip.show();
  delay(100);
  }
 
 void ws(int ind, bool datt){
  if(datt==1){strip.setPixelColor(ind, strip.Color(brignes, brignes, brignes));}
  if(datt==0){strip.setPixelColor(ind, strip.Color(0, 0, 0));}
  }

Процесс сборки часов

Разметка

Пропил сегментов часов

Заливка сегментов  эпоксидной смолой  (с белым  красителем)

Сборка схемы индикаторов

Тестовый запуск

Видео

Форум — http://forum.rcl-radio.ru/viewtopic.php?id=245

Часть вторая — https://rcl-radio.ru/?p=91651


Фото и видео материалы представлены: Кириллом Никофоровым (сборка и отладка проекта)

Добавить комментарий

Войти с помощью: 

Случайные статьи

  • Значения ТЭДС для термопары типа М (Медь / копель) ТМК

    Значения ТЭДС для термопары типа М (Медь / копель) ТМК

    Термопара (термоэлектрический преобразователь) — устройство, применяемое в промышленности, научных исследованиях, медицине, в системах автоматики. Применяется в основном для измерения температуры. Принцип действия основан на эффекте Зеебека или, иначе, термоэлектрическом эффекте. Между соединёнными проводниками имеется контактная разность потенциалов; если стыки связанных в кольцо проводников находятся при одинаковой температуре, сумма таких разностей …Подробнее...
  • Индикатор выходной мощности с логарифмической шкалой

    Индикатор выходной мощности с логарифмической шкалой

    Индикатор выходной мощности выполнен на основе стрелочного индикатора М476\1, но можно использовать другой стрелочный прибор с полным током отклонения стрелки не более 200мА. Динамический диапазон индикатора 43дБ, а крайние значения регистрирующей мощности от 0,1 до 200Вт. Расширение динамического диапазона достигается  применением ОУ. Р1(стрелочный прибор) включен в диагональ моста образованного диодами …Подробнее...
  • Простой измеритель емкости

    Принцип измерения: Регулировка заключается в установке максимальных границ на каждом диапазоне с помощью переключаемых резисторов (47кОм), в качестве которых лучше поставить подстроечники(для калибровки диапазонов по эталонным конденсаторам). Измерить разбит на 4 диапазона, при измерении емкости следим за показаниями индикатора, шкалу индикатора лучше разбить на 10 частей, так на пример на …Подробнее...
  • Электронный выключатель по хлопку

    Электронный выключатель по хлопку изготовил Д. Бхаттачария («Electronics for you” №5/2004). Выключатель срабатывает на включение при пяти хлопках в ладоши (в течение 10 с), а на выключение 2 при одном хлопке. Схема выключателя показана на рис.1. В устройстве используется конденсаторный микрофон, преобразующий звук хлопка в электрический сигнал с последующим усилением …Подробнее...
  • Большие часы на  RGB светодиодной ленте WS2811 (ESP8266)

    Большие часы на RGB светодиодной ленте WS2811 (ESP8266)

    Часы построены на wi-fi модуле NodeMcu v3 с чипом ESP8266 (ESP-12e)(Arduino IDE), в качестве сегментов часов используется адресная светодиодная RGB лента на основе чипа WS2811 (SM16703). На индикаторы часов выводится текущее время (ЧЧ:ММ.СС) и раз в минуту на 3 секунды текущая дата. Каждый пиксель RGB ленты содержит три RGB светодиода …Подробнее...