Бинарные часы в последнее время стали популярные своей необычностью. Некоторые носят такие часы на руке, кто-то устанавливает в помещении. Конечно, многие не понимают, как по ним «читать» время, но сложного там ничего нет и разобраться может любой человек. А можно не разбираться и использовать их просто, как украшение комнаты.
В этой статье мастер-самодельщик расскажет, как он сделал бинарные часы своими руками.
Инструменты и материалы:
-Доска — 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 контактами, для фиксации последнего светодиода.
Чтобы прикрепить светодиоды к доске, он использовал алюминиевые кронштейны.
Дальше подключает все согласно схемы. После подключения проверяет работу устройства, загрузив проверочный код.
#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>
Ингредиентыкабачки ( без шкурки и семян) - 2 кгпомидоры - 1 кгшампиньоны - 300 глук…
Ингредиентыслива (без косточек) — 1 кгчеснок — 3-4 зубчикаперец чили — 0,5 шт.соль — 0,5…
Ингредиентыпомидоры — 1,5 кгсладкий перец — 0,5 шт.чеснок — 3-4 зубчикасоль — 2 ст.л.сахар —…
Ингредиентыогурцы мелкие и средниестебли укропа и зонтики - 0.5 пучкаветочки мяты - 1 пучокчеснок -…
Ингредиентыпомидоры -2 кгвинный укусу светлый- 2 с.л.Пошаговый рецепт приготовленияДля приготовления томатов в собственном соку вымыть…
Ингредиентыпомидоры -1 кгзелень (петрушка, укроп, кинза) -200 г.чеснок - -3-4 зубчикаострый перец -1/2 шт.черный молотый…
Мы используем файлы cookie.