Часы на газоразрядных индикаторах

Исходный код

Прошей Iskra Mini кодом программы.

ledClock.ino
// библиотека для работы с адресными светодиодами
#include <Adafruit_NeoPixel.h>
// библиотека для работы I²C
#include <Wire.h>
// библиотека для работы с часами реального времени
#include "TroykaRTC.h"
// библиотека для работы с кнопками
#include "TroykaButton.h"
 
// инициализируем подключенную кнопку
TroykaButton button(10);
 
// номер пина, к которому подключена RGB-матрица
#define MATRIX_PIN    11
 
// количество светодиодов в матрице
#define LED_COUNT 40
 
// инициализация цепочки светодиодов подсветки цифр
Adafruit_NeoPixel matrix = Adafruit_NeoPixel(LED_COUNT, MATRIX_PIN, NEO_GRB + NEO_KHZ800);
 
// инициализация светодиода разграничителя
Adafruit_NeoPixel dot = Adafruit_NeoPixel(1, 12, NEO_GRB + NEO_KHZ800);
 
// размер массива для времени
#define LEN_TIME 12
// размер массива для даты
#define LEN_DATE 12
// размер массива для дня недели
#define LEN_DOW 12
 
// создаём объект для работы с часами реального времени
RTC clock;
 
// переменные для мигания
int ledState = ;
unsigned long previousMillis = ; 
unsigned long currentMillis ;
 
// массив для хранения текущего времени
char timeLEN_TIME;
// массив для хранения текущей даты
char dateLEN_DATE;
// массив для хранения текущего дня недели
char weekDayLEN_DOW;
 
int hour;
int minute;
 
int one;
int two;
int three;
int four;
 
int displaysettings=;
 
int red=150;
int green=200;
int blue= 50;
 
 
void setup()
{
// инициализация
  button.begin();
  matrix.begin();
  dot.begin();
  clock.begin();
 
  // метод установки времени и даты в модуль вручную
  // clock.set(hour,minute,0,27,07,2005,THURSDAY);    
  // метод установки времени и даты автоматически при компиляции
  clock.set(__TIMESTAMP__);
  // что бы время не менялось при прошивки или сбросе питания
  // закоментируйте оба метода clock.set();
 
  pinMode(10, INPUT_PULLUP);
}
 
void loop()
{
  // считываем состояние кнопки
  button.read();
  // запрашиваем данные с часов  
  clock.read();
 
 
 
  // считаем нажатия чтоб переходить из режима в режим  
  if (button.justPressed()){
    displaysettings = displaysettings + 1;
  }
 
  if(displaysettings==){
    // сохраняем текущее время 
    hour = clock.getHour();
    minute = clock.getMinute();
  }
 
  if(displaysettings == 1){
    // присваиваем значение считываемое с потенциометра
    hour = map (analogRead(A0),2, 1020, , 23);
    clock.set(hour,minute,,27,07,2005,THURSDAY);
  }
 
  if(displaysettings == 2){
    // присваиваем значение считываемое с потенциометра
    minute = map (analogRead(A0), 2, 1018, , 59);
    clock.set(hour,minute,,27,07,2005,THURSDAY);
  }
 
  if(displaysettings == 3){
    // присваиваем значение считываемое с потенциометра
    red = map (analogRead(A0),, 1023, , 255);
  }
 
  if(displaysettings == 4){
    // присваиваем значение считываемое с потенциометра
    green = map (analogRead(A0),, 1023, , 255);
  }
 
  if(displaysettings == 5){
    // присваиваем значение считываемое с потенциометра
    blue = map (analogRead(A0),, 1023, , 255);
  }
 
  if(displaysettings == 6){
    displaysettings = ;
  }
 
  // делим минуты и часы на разряды
  one = hour  10;
  two = hour % 10;
  three = minute  10;
  four = minute % 10;
 
  matrix.clear();
 
  // зажигаем нужные светодиоды
  matrix.setPixelColor(four, red, green, blue);
  matrix.setPixelColor(three + 10,  red, green, blue);
  matrix.setPixelColor(two + 20,  red, green, blue);
  matrix.setPixelColor(one + 30,  red, green, blue);
  matrix.show();
 
  // ждём одну секунду
  delay(10);
 
  // мигание разделителя
  blinking();
}
 
void blinking(){
  if (millis() - previousMillis >= 1000) {
    previousMillis = millis();
    if (ledState == ) {
      ledState = 1;
      dot.setPixelColor(, red, green, blue);
    } else {
      ledState = ;
      dot.setPixelColor(, , , );
      }
     dot.show();
    }
}

Как собрать?

А вот и архив CorelDRAW векторных файлов для резки

Обрати внимание, что я исходил из конкретной толщины прозрачного аркила (2,93 мм) и допусков, которые варьируются от материала к материалу и модели лазера.

Каждая цифра будущих часов это отдельная пластинка из прозрачного акрила, с двумя ножками для крепления и световодом в который будет светить светодиод.

Чтобы светодиоды не засвечивали соседние пластинки в блоке цифр, сделаем панель из чёрного, непрозрачного акрила с отверстиями ограничивающими световой поток.

Вставим пластинки с цифрами в светоограничивающую панель. Туда же отправим разделительные точки для индикации хода часов. Снизу в панели будут видны торчащие световоды каждой из цифр.Длина этих световодов такая чтобы светодиод прилегал к ним вплотную.

Сделаем площадку для адресных светодиодов так, чтобы каждый из них светил точно в световод пластинки с цифрой и оденем её на торчащие световоды

Обрати внимание, что у светодиодов есть один срезанный угол. Он нужен чтобы сориентировать тебя, где какой контакт

Распиновка светодиода WS2812B

Самое время установить светодиоды в свои места. Отогнем контактные ножки светодиодов, чтобы к ним было удобнее подпаяться и вставим их в посадочные места.

Спаяй все светодиоды между собой как показано на схеме и подключи сигнальные провода к и пинам Iskra Mini.

Нажми на схему спайки если тебе ничего не видно.

Для точной работы часов к Iskra mini добавим модуль часов реального времени. Это удобно сделать если использовать Troyka Mini IO.

Подключим кнопку и потенциометр

Теперь питание и линии DI светодиодов

Оцените статью
Рейтинг автора
5
Материал подготовил
Андрей Измаилов
Наш эксперт
Написано статей
116
Добавить комментарий