Бинарные часы на ESP 8266 - Своими руками
Своими руками

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

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

На одном из концов он припаял небольшую печатную плату с 3 контактами, для фиксации последнего светодиода.
Чтобы прикрепить светодиоды к доске, он использовал алюминиевые кронштейны.
Бинарные часы на ESP 8266Бинарные часы на ESP 8266Бинарные часы на ESP 8266Бинарные часы на ESP 8266Шаг четвертый: подключение WS2812b
Дальше подключает все согласно схемы. После подключения проверяет работу устройства, загрузив проверочный код.
Бинарные часы на ESP 8266Бинарные часы на ESP 8266Бинарные часы на ESP 8266Бинарные часы на ESP 8266

Шаг пятый: программное обеспечение
Дальше нужно установить следующие библиотеки:
FastLED (из диспетчера библиотек в Arduino IDE)
NTPClient (из диспетчера библиотек в Arduino IDE)
WifiManager
Загрузить код:
Бинарные часы на ESP 8266 Показать / Скрыть текст#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>
Все готово.
Бинарные часы на ESP 8266Бинарные часы на ESP 8266

SitesReady

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

Follow us

Don't be shy, get in touch. We love meeting interesting people and making new friends.