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

Опубликовано От sheva
0 0
Read Time:9 Minute, 39 Second

Бинарные часы в последнее время стали популярные своей необычностью. Некоторые носят такие часы на руке, кто-то устанавливает в помещении. Конечно, многие не понимают, как по ним «читать» время, но сложного там ничего нет и разобраться может любой человек. А можно не разбираться и использовать их просто, как украшение комнаты.
В этой статье мастер-самодельщик расскажет, как он сделал бинарные часы своими руками.

Инструменты и материалы:
-Доска — 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>
Все готово.

Источник (Source)

Источник: https://usamodelkina.ru/

Happy
Happy
0 %
Sad
Sad
0 %
Excited
Excited
0 %
Sleepy
Sleepy
0 %
Angry
Angry
0 %
Surprise
Surprise
0 %

Average Rating

5 Star
0%
4 Star
0%
3 Star
0%
2 Star
0%
1 Star
0%

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *