Категории: Часы

Бинарные часы на ESP 8266

Бинарные часы в последнее время стали популярные своей необычностью. Некоторые носят такие часы на руке, кто-то устанавливает в помещении. Конечно, многие не понимают, как по ним «читать» время, но сложного там ничего нет и разобраться может любой человек. А можно не разбираться и использовать их просто, как украшение комнаты.
В этой статье мастер-самодельщик расскажет, как он сделал бинарные часы своими руками.
Инструменты и материалы:
-Доска — 266 Х 111 Х 40 мм;
-Лабораторные пробирки — 32 шт;-Светодиодные модули WS2812B — 32 шт;
-Wemos D1 mini или любая другая плата ESP8266 (или ESP32);
-Конвертер логического уровня;
-Перемычки;
-Разъемы;
-Провода;-Штангенциркуль;-Сверлильный станок;-Стеклорез;
-Конденсатор 100 мкФ 16 В;
-Источник питания 5В;-Тунговое масло;
Шаг первый: подготовка корпуса
Первое, что нужно сделать, это подготовить доску. В САПР мастер сделал схему отверстий. Затем распечатал шаблон и наклеил его на доску.
Дальше нужно просверлить отверстия согласно шаблону. Диаметр отверстия должен соответствовать диаметру пробирок.
После сверления отверстий шлифует поверхность наждачной бумагой от 150 до 400 грит.
После шлифовки покрывает поверхность тунговым маслом.
Схему отверстий можно скачать ниже.
Схема отверстий Модель full.pdf
Шаг второй: подготовка пробирок
Пробирки, которые у него были, были намного длиннее, чем толщина доски. Значит нужно их разрезать.
Мастер пробовал несколько способов разрезать трубки. Самый рабочий вариант — отметить малярным скотчем линию реза, установить пробирку в сверлильный станок и отрезать стеклорезом по линии.
Дальше нужно вставить обрезанные пробирки в отверстия. Нужно чтобы нижняя выпуклая часть пробирок была на одном уровне. Для фиксации пробирок он использует прозрачный силикон,нанеся его по самому краю пробирки.
Шаг третий: монтаж светодиодов
Монтаж светодиодов очень простой, нужно просто припаять 3 провода (VCC — GND и Data Line), соединяющие каждый модуль WS2812b.
Поскольку расстояние между светодиодами одинаковое, мастер предварительно разрезает провод и припаивает их к светодиодам. Мастер использовал красный провод для VCC, черный для GND и зеленый для линии передачи данных.
На одном из концов он припаял небольшую печатную плату с 3 контактами, для фиксации последнего светодиода.
Чтобы прикрепить светодиоды к доске, он использовал алюминиевые кронштейны.
Шаг четвертый: подключение WS2812b
Дальше подключает все согласно схемы. После подключения проверяет работу устройства, загрузив проверочный код.

Шаг пятый: программное обеспечение
Дальше нужно установить следующие библиотеки:
FastLED (из диспетчера библиотек в Arduino IDE)
NTPClient (из диспетчера библиотек в Arduino IDE)
WifiManager
Загрузить код:
#include <ESP8266WiFi.h>  #include <ESP8266mDNS.h>  #include <WiFiUdp.h>  #include <NTPClient.h>  #include <DNSServer.h>  #include <ESP8266WebServer.h>  #include <WiFiManager.h>  #include <FastLED.h>  #include <Ticker.h>  Ticker ticker;    void tick()  {    //toggle state    int state = digitalRead(BUILTIN_LED);  // get the current state of GPIO1 pin    digitalWrite(BUILTIN_LED, !state);     // set pin to the opposite state  }    //gets called when WiFiManager enters configuration mode  void configModeCallback (WiFiManager *myWiFiManager) {    Serial.println("Entered config mode");    Serial.println(WiFi.softAPIP());    //if you used auto generated SSID, print it    Serial.println(myWiFiManager->getConfigPortalSSID());    //entered config mode, make led toggle faster    ticker.attach(0.2, tick);  }    #define LED_PIN     D5  #define COLOR_ORDER GRB  #define CHIPSET     WS2812  #define NUM_LEDS    32  #define BRIGHTNESS  100  //#define FRAMES_PER_SECOND 60    //const char *ssid     = "Your-WIFI-NAME";  //const char *password = "Your-WIFI-Password";  const long utcOffsetInSeconds = -10800; //(this is your  local time difference vs UTC)  CRGB leds[NUM_LEDS];    // Define NTP Client to get time  WiFiUDP ntpUDP;  NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds); //(by default it updates every 60 seconds so it doesn´t make so many requests)  int H, h, M, m, hora, minutos, pos, sum, numer;  long colorH, colorh, color2puntos, colorM, colorm;  int matrizpos[9];  int array1[9] = {1, 0, 0, 0, 0, 0, 0, 0, 0};  int array2[9] = {1, 1, 0, 0, 0, 0, 0, 0, 0};  int array3[9] = {1, 1, 1, 0, 0, 0, 0, 0, 0};  int array4[9] = {1, 1, 1, 1, 0, 0, 0, 0, 0};  int array5[9] = {1, 1, 1, 1, 1, 0, 0, 0, 0};  int array6[9] = {1, 1, 1, 1, 1, 1, 0, 0, 0};  int array7[9] = {1, 1, 1, 1, 1, 1, 1, 0, 0};  int array8[9] = {1, 1, 1, 1, 1, 1, 1, 1, 0};  int primero1[3] = {1, 0, 0};  int primero2[3] = {1, 1, 0};  unsigned long previousMillis = 0;  unsigned long previousMillis2 = 0;  unsigned long vloc = 20000;  unsigned long lastMillis;  boolean B2puntos;  boolean marca = false;    //Functions:  void Prendeh(int valor) {  }    void ArrayShaker (int num, int ubi) {    int posicion = 0;    long color = 0;      switch (ubi) {      case 2:        posicion = 3;        color = colorh;        break;      case 3:        posicion = 14;        color = colorM;        break;      case 4:        posicion = 23;        color = colorm;        break;    }    if ( ubi != 1) {      switch (num) {        case 0: for (int z = 0; z < 9; z++) {            leds[z + posicion] = CRGB::Black;          }            break;        case 1:          for (int i = 0; i < 9; i++)          { int pos = random(9);            int t = array1[i];            array1[i] = array1[pos];            array1[pos] = t;          }          for (int z = 0; z < 9; z++) {            if (array1[z] == 1) {              leds[z + posicion] = color;            }            else {              leds[z + posicion] = CRGB::Black;            }          }            break;        case 2:          for (int i = 0; i < 9; i++)          {            int pos = random(9);            int t = array2[i];            array2[i] = array2[pos];            array2[pos] = t;          }          for (int z = 0; z < 9; z++) {            if (array2[z] == 1) {              leds[z + posicion] = color;            }            else {              leds[z + posicion] = CRGB::Black;            }          }          break;        case 3:          for (int i = 0; i < 9; i++)          {            int pos = random(9);            int t = array3[i];            array3[i] = array3[pos];            array3[pos] = t;          }          for (int z = 0; z < 9; z++) {            if (array3[z] == 1) {              leds[z + posicion] = color;            }            else {              leds[z + posicion] = CRGB::Black;            }          }          break;        case 4:          for (int i = 0; i < 9; i++)          {            int pos = random(9);            int t = array4[i];            array4[i] = array4[pos];            array4[pos] = t;          }          for (int z = 0; z < 9; z++) {            if (array4[z] == 1) {              leds[z + posicion] = color;            }            else {              leds[z + posicion] = CRGB::Black;            }          }          break;        case 5:          for (int i = 0; i < 9; i++)          {            int pos = random(9);            int t = array5[i];            array5[i] = array5[pos];            array5[pos] = t;          }          for (int z = 0; z < 9; z++) {            if (array5[z] == 1) {              leds[z + posicion] = color;            }            else {              leds[z + posicion] = CRGB::Black;            }          }          break;        case 6:          for (int i = 0; i < 9; i++)          {            int pos = random(9);            int t = array6[i];            array6[i] = array6[pos];            array6[pos] = t;          }          for (int z = 0; z < 9; z++) {            if (array6[z] == 1) {              leds[z + posicion] = color;            }            else {              leds[z + posicion] = CRGB::Black;            }          }          break;        case 7:          for (int i = 0; i < 9; i++)          {            int pos = random(9);            int t = array7[i];            array7[i] = array7[pos];            array7[pos] = t;          }          for (int z = 0; z < 9; z++) {            if (array7[z] == 1) {              leds[z + posicion] = color;            }            else {              leds[z + posicion] = CRGB::Black;            }          }          break;        case 8:          for (int i = 0; i < 9; i++)          {            int pos = random(9);            int t = array8[i];            array8[i] = array8[pos];            array8[pos] = t;          }          for (int z = 0; z < 9; z++) {            if (array8[z] == 1) {              leds[z + posicion] = color;            }            else {              leds[z + posicion] = CRGB::Black;            }          }          break;        case 9: for (int z = 0; z < 9; z++) {            leds[z + posicion] = color;          }          break;      }    }      else {      switch (num) {        case 0:          for (int s = 0; s < 4; s++) {            leds[s] = CRGB::Black;          }          break;        case 1:          for (int r = 0; r < 3; r++)          { int pos = random(3);            int t = primero1[r];            primero1[r] = primero1[pos];            primero1[pos] = t;          }          for (int s = 0; s < 3; s++) {            if (primero1[s] == 1) {              leds[s] = colorH;            }            else {              leds[s] = CRGB::Black;            }          }            break;        case 2:          for (int r = 0; r < 3; r++)          { int pos = random(3);            int t = primero2[r];            primero2[r] = primero2[pos];            primero2[pos] = t;          }          for (int s = 0; s < 3; s++) {            if (primero2[s] == 1) {              leds[s] = colorH;            }            else {              leds[s] = CRGB::Black;            }          }          break;        case 3:          for (int z = 0; z < 4; z++) {            leds[z + posicion] = colorH;          }          break;      }    }  }    void blinkingcolon() {      unsigned long currentMillis = millis();    const long interval = 1000;    long Ttransc = 0;    Ttransc = currentMillis - previousMillis;    if (Ttransc > interval) {      previousMillis = currentMillis;      if (B2puntos == false ) {        leds[12] = color2puntos;        leds[13] = color2puntos;        B2puntos = true;      }      else {        leds[12] = 0x000000;        leds[13] = 0x000000;        B2puntos = false;      }    }  }    void updatenumbers() {    unsigned long currentMillis2 = millis();    const long interval2 = vloc;    long Ttransc2 = 0;    Ttransc2 = currentMillis2 - previousMillis2;    if (Ttransc2 > interval2) {      previousMillis2 = currentMillis2;      ArrayShaker(H, 1);      ArrayShaker(h, 2);      ArrayShaker(M, 3);      ArrayShaker(m, 4);    }    }  void ReadTime() {    timeClient.update();    //Get the values of each digit Hh:Mm    hora = timeClient.getHours();    H = hora / 10;    h = hora - (H * 10);    minutos = timeClient.getMinutes();    M = minutos / 10;    m = minutos - (M * 10);  }    void colorSelect() {    colorH = 0xFF0000;    colorh = 0xFFFF00;    color2puntos = 0x00FF00;    colorM = 0xFF007F;    colorm = 0x20B2AA;  }    void setup() {    Serial.begin(115200);    //randomSeed(analogRead(0));    //set led pin as output    pinMode(BUILTIN_LED, OUTPUT);    ticker.attach(0.6, tick);      FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );    FastLED.setBrightness( BRIGHTNESS );    timeClient.begin();    FastLED.clear();      WiFiManager wifiManager; //  wifiManager.resetSettings();    wifiManager.setAPCallback(configModeCallback);    if (!wifiManager.autoConnect("Mega-Reloj")) {      Serial.println("failed to connect and hit timeout");      //reset and try again, or maybe put it to deep sleep      ESP.reset(      );      delay(1000);    }    //if you get here you have connected to the WiFi    Serial.println("connected...yeey :)");    ticker.detach();    //keep LED on    digitalWrite(BUILTIN_LED, LOW);    }  /*Wiring/location of numbers:    H from LED 0 to 2    h from LED 3 to 11 (ubi 2)    : LEDS 12 and 13    M from LED 14 to 22 (ubi 3)    m from LED 23 to 31 (ubi 4)  */    void loop() {    ReadTime();      //Select color.    colorSelect();    //Assign and Randomize the position vector corresponding to each digit (ArrayShaker)    updatenumbers();    blinkingcolon();    Serial.print(", ");    Serial.print(timeClient.getHours());    Serial.print(":");    Serial.print(timeClient.getMinutes());    Serial.print(":");    Serial.println(timeClient.getSeconds());    delay(1000);    FastLED.show()<br>

Все готово.

SitesReady

Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного. - Альберт Эйнштейн

Share
Опубликовано
SitesReady

Последние записи

Кабачковая икра с яблоками и грибами

Ингредиентыкабачки ( без шкурки и семян) - 2 кгпомидоры - 1 кгшампиньоны - 300 глук…

4 недели ago

Вяленые сливы на зиму

Ингредиентыслива (без косточек) — 1 кгчеснок — 3-4 зубчикаперец чили — 0,5 шт.соль — 0,5…

1 месяц ago

Сладкие консервированные помидоры с лимонной кислотой

Ингредиентыпомидоры — 1,5 кгсладкий перец — 0,5 шт.чеснок — 3-4 зубчикасоль — 2 ст.л.сахар —…

1 месяц ago

Маринованные огурцы с мятой

Ингредиентыогурцы мелкие и средниестебли укропа и зонтики - 0.5 пучкаветочки мяты - 1 пучокчеснок -…

1 месяц ago

Томаты в собственном соку

Ингредиентыпомидоры -2 кгвинный укусу светлый- 2 с.л.Пошаговый рецепт приготовленияДля приготовления томатов в собственном соку вымыть…

1 месяц ago

Соус из томатов с зеленью и чесноком

Ингредиентыпомидоры -1 кгзелень (петрушка, укроп, кинза) -200 г.чеснок - -3-4 зубчикаострый перец -1/2 шт.черный молотый…

1 месяц ago

Мы используем файлы cookie.