| Ваш IP: 3.239.233.139 | Online(21) - гости: 14, боты: 7 | Загрузка сервера: 0.38 ::::::::::::

Большие часы на 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


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

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

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

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

  • Контроль уровня воды в аквариуме

    Схема контроля уровня воды в аквариуме представлена на рис.1. Как только поверхность специального зонда покрывается водой, импульсы генератора НЧ, реализованного на первом операционном усилителе D1.1, поступают на компаратор (D1.2), усиливаются и преобразуются в электрический сигнал, управляющий ключевым каскадом на реле К1. В качестве датчика зонда В1 используется отрезок одно или …Подробнее...
  • Передатчик на 27МГц для системы радиоуправления

    Генератор радиопередатчика собран на схеме кварцевой стабилизации частоты. L1C3 настроен на 27 МГц. Радиус действия передатчика 5…10м. Модуляция осуществляется с выхода микросхемы 561 серии напряжением на уровне 5-7В. Литература 500схем для радиолюбителей\Автор:Николаев А.П.Подробнее...
  • Усилитель мощности на диапазон 144 МГц

    Данный усилитель предназначен для усиления мощности передатчика карманной радиостанции в диапазоне 144 МГц. При подачи на его вход сигнала мощностью 0,05Вт и питании 24В усилитель выдает мощность 5-6Вт, а при питании его напряжением 12В он выдает 3-4Вт. Входное и выходное сопротивления равны 50 Ом. Описание: первый каскад работает в классе …Подробнее...
  • 4-х канальный УМЗЧ на TDA7385

    4-х канальный УМЗЧ на TDA7385

    На ИМС TDA7385 можно собрать простой и качественный 4-х канальный усилитель мощности звуковой частоты. Усилитель прост в сборке, так как имеет минимальный набор внешних компонентов, не нуждается в настройке. Основные характеристики усилителя на TDA7385: Максимальное напряжение питания 18 В Ток покоя 180 мА Выходная мощность при напряжении питания 14,4 В …Подробнее...
  • К1156ЕР5х — РЕГУЛИРУЕМЫЙ ПРЕЦИЗИОННЫЙ ПАРАЛЛЕЛЬНЫЙ СТАБИЛИЗАТОР

    К1156ЕР5х — РЕГУЛИРУЕМЫЙ ПРЕЦИЗИОННЫЙ ПАРАЛЛЕЛЬНЫЙ СТАБИЛИЗАТОР

    Микросхема серии К1156ЕР5х представляет собой трехвыводной регулируемый прецизионный параллельный стабилизатор с высокой температурной стабильностью. Аналогом микросхемы К1156ЕР5х является микросхема TL431 фирм MOTOROLA, TEXAS INSTRUMENTS. Назначение выводов: 1- опорное напряжение 2- анод 3- катод ОСОБЕННОСТИ • Опорное напряжение 2495 мВ ± 1%; • Типовое значение изменения опорного напряжения 5 мВ в рабочем диапазоне температур; • Типовое значение …Подробнее...