LED часы на arduino

Сегодня я расскажу Вам, как сделать программные LED часы на 7 сегментном дисплее и микроконтроллере Atmega 8A-PU. Часы умеют отображать время, настройка времени производится с помощью двух кнопок ( часы +, минуты +), третья кнопка запускает режим «срабатывания» (поочередно мигают индикаторы) , ну а при нажатии на кнопки, LED часы пикают. На фото ниже,показан финальный вариант часов в «бомбовом» оформлении)))
LED-chasy-
Для начала мы соберем все на макетной плате для проверки работы,

LED часы — компоненты для сборки и макетирования

LED часы — схема подключения

Для начала мы соберем все на макетной плате для проверки работы, и начнем с подключения кнопок к плате arduino

  • кнопка для установки часов — к аналоговому входу A1
  • кнопка для установки минут — к аналоговому входу A2
  • кнопка для светового эффекта на — к аналоговому входу A0

shema1

После подключения кнопок подключим плюс пищалки (buzzer) к аналоговому входу A5 ( цифровой вход 19) , а минус на GND

shema2

А теперь переходим к подключению 7 сегментного индикатора, сразу уточню, что подключать можно индикаторы с общим анодом , и с общим катодом. На макетке я использовал индикатор LN543GA , который когда-то выпаял из старой нерабочей магнитолы…

LN543GA

Для правильного подключения используйте резисторы и схему из даташита

LN543GA-front

На основе этого индикатора и будем разбираться в подключении к дисплея к ардуино. Для начала поищем и откроем даташит на этот дисплей и посмотрим распиновку ног, рабочее напряжение и ток.

LN543GA-pinout

ток работы сигмента от 30 до 50 мА , напряжение 5 вольт

LN543GA-pinout-2

Слева пины для дисплея с общим анодом, справа — с общим катодом

После «курения» даташита приступаем к подключению

  • подключаем сигменты A, B, C, D, E, F, G  к цифровым пинам на ардуино 2, 3, 4, 5, 6, 7, 8
  • подключаем разряды 1, 2, 3, 4 к цифровым пинам на ардуино 9, 10, 11, 12
  • сегменты которые отвечают за двоеточие ( в моем случае, это Lower collon и Upper collon) , подключаем к 13 пину на ардуино

LED часы — скетч

Если вы подключили все как у меня, смело заливайте скетч и тестируйте свои LED часы

#define MIDDLE 0 // G
#define UPPER_L 1 // F
#define LOWER_L 2 // E
#define BOTTOM 3 // D
#define LOWER_R 4 // C
#define UPPER_R 5 // B
#define TOP 6 // A
// pin 13 для отображения двоеточия
int groundPins[7] = {8, 7, 6, 5, 4, 3, 2}; // G, F, E, D, C, B, A
int digitPins[4] = {12, 11, 10, 9};
int ON = HIGH; // HIGH для подключения с общим анодом, LOW для подключения с общим катодом
int OFF = LOW; // LOW для подключения с общим катодом, HIGH для подключения с общим анодом
int number[10][7]; // Содержит информацию о том, какие сегменты, необходимые для каждой из 10 цифр
int digit[4];

int hours = 00;
int minutes = 00;
int elapsedMinutes = 0;
int seconds = 0;
int secon;
int hourset = A1;
int hoursetv = 0;
int minuteset = A2;
int minutesetv = 0;
int showsw = A0;
int showswv = 0;
unsigned long prevtime;
int showtime = 16380;
int delaytime = 200;
void setup()
{
pinMode(13, OUTPUT);
pinMode(hourset, INPUT);
pinMode(minuteset, INPUT);
pinMode(showsw, INPUT);
digitalWrite(hourset, HIGH);
digitalWrite(minuteset, HIGH);
digitalWrite(showsw, HIGH);
initNumber();
for(int i=0; i < 7; i++) {
pinMode(groundPins[i], OUTPUT);
digitalWrite(groundPins[i], HIGH); // HIGH для подключения с общим анодом, LOW для подключения с общим катодом
}
for(int i=0; i < 4; i++) { pinMode(digitPins[i], OUTPUT); digitalWrite(digitPins[i], LOW); // LOW для подключения с общим катодом, HIGH для подключения с общим анодом } } void loop() { int n = 0; unsigned long time = millis() – (elapsedMinutes * 60000); seconds = (time / 1000); if (seconds > 60) {
seconds = 0;
minutes++;
elapsedMinutes++;
if (minutes >= 60) {
minutes = 0;
hours++;
if (hours > 23) {
hours = 0;
}
}
}
n = (hours * 100) + minutes;
setDigit(n);

for(int g=0; g < 7; g++) {
digitalWrite(groundPins[g], LOW); // HIGH для подключения с общим анодом, LOW для подключения с общим катодом
for(int i=0; i < 4; i++) {
if (digit[i] < 0) { continue; } digitalWrite(digitPins[i], number[digit[i]][g]); } getDelay(); digitalWrite(groundPins[g], HIGH); // HIGH для подключения с общим анодом, LOW для подключения с общим катодом } if (time – prevtime > 500) {
prevtime = time;
if (secon == 1) {
secon = 0;
return;
}
if (secon == 0) {
secon = 1;
return;
}
}
if (secon == 1) {
digitalWrite(13, HIGH);
}
if (secon == 0) {
digitalWrite(13, LOW);
}
hoursetv = digitalRead(hourset); // Установка часов
if (hoursetv == LOW) {
hours++;
tone(19,10000);
delay(25);
noTone(19);
delay(100);
if (hours > 23) {
hours = 0;
}
}
minutesetv = digitalRead(minuteset); // Установка минут
if (minutesetv == LOW) {
minutes++;
tone(19,10000);
delay(25);
noTone(19);
delay(100);
if (minutes > 59) {
minutes = 0;
}
}
showswv = digitalRead(showsw);
if (showswv == LOW) {
showtime = 16380;
delaytime = 200;
}
}

void setDigit(int n) {
n = n % 20000;
digit[0] = n % 10;
digit[1] = (n / 10) % 10;
if ((digit[1] == 0) && (n < 10)) {
//digit[1] = -1;
}
digit[2] = (n / 100) % 10;
if ((digit[2] == 0) && (n < 100)) { //digit[2] = -1; } digit[3] = (n / 1000) % 10; if (digit[3] == 0) { //digit[3] = -1; } } void getDelay() { if (delaytime >= 7) {
delay(delaytime);
delaytime -= 1;
}
if (delaytime < 7) {
delayMicroseconds(showtime);
showtime -= 35;
if (showtime <= 1501) {
showtime = 1500;
}
}
}

void initNumber() {
number[0][MIDDLE] = OFF;
number[0][UPPER_L] = ON;
number[0][LOWER_L] = ON;
number[0][BOTTOM] = ON;
number[0][LOWER_R] = ON;
number[0][UPPER_R] = ON;
number[0][TOP] = ON;

number[1][MIDDLE] = OFF;
number[1][UPPER_L] = OFF;
number[1][LOWER_L] = OFF;
number[1][BOTTOM] = OFF;
number[1][LOWER_R] = ON;
number[1][UPPER_R] = ON;
number[1][TOP] = OFF;

number[2][MIDDLE] = ON;
number[2][UPPER_L] = OFF;
number[2][LOWER_L] = ON;
number[2][BOTTOM] = ON;
number[2][LOWER_R] = OFF;
number[2][UPPER_R] = ON;
number[2][TOP] = ON;

number[3][MIDDLE] = ON;
number[3][UPPER_L] = OFF;
number[3][LOWER_L] = OFF;
number[3][BOTTOM] = ON;
number[3][LOWER_R] = ON;
number[3][UPPER_R] = ON;
number[3][TOP] = ON;

number[4][MIDDLE] = ON;
number[4][UPPER_L] = ON;
number[4][LOWER_L] = OFF;
number[4][BOTTOM] = OFF;
number[4][LOWER_R] = ON;
number[4][UPPER_R] = ON;
number[4][TOP] = OFF;

number[5][MIDDLE] = ON;
number[5][UPPER_L] = ON;
number[5][LOWER_L] = OFF;
number[5][BOTTOM] = ON;
number[5][LOWER_R] = ON;
number[5][UPPER_R] = OFF;
number[5][TOP] = ON;

number[6][MIDDLE] = ON;
number[6][UPPER_L] = ON;
number[6][LOWER_L] = ON;
number[6][BOTTOM] = ON;
number[6][LOWER_R] = ON;
number[6][UPPER_R] = OFF;
number[6][TOP] = ON;

number[7][MIDDLE] = OFF;
number[7][UPPER_L] = OFF;
number[7][LOWER_L] = OFF;
number[7][BOTTOM] = OFF;
number[7][LOWER_R] = ON;
number[7][UPPER_R] = ON;
number[7][TOP] = ON;

number[8][MIDDLE] = ON;
number[8][UPPER_L] = ON;
number[8][LOWER_L] = ON;
number[8][BOTTOM] = ON;
number[8][LOWER_R] = ON;
number[8][UPPER_R] = ON;
number[8][TOP] = ON;

number[9][MIDDLE] = ON;
number[9][UPPER_L] = ON;
number[9][LOWER_L] = OFF;
number[9][BOTTOM] = ON;
number[9][LOWER_R] = ON;
number[9][UPPER_R] = ON;
number[9][TOP] = ON;
}

У меня получилось так

LED-chasy-na-arduino-nano

Ну а теперь немного рассмотрим сам скетч, как настраивать под свои типы дисплеев и свои подключения к платам arduino. Если у Вас другое подключение сегментов и разрядности, меняйте значения в строках скетча

int groundPins[7] = {8, 7, 6, 5, 4, 3, 2}; // G, F, E, D, C, B, A
int digitPins[4] = {12, 11, 10, 9};

и для точки в строке

pinMode(13, OUTPUT);

и еще

if (secon == 1) {
digitalWrite(13, HIGH);
}
if (secon == 0) {
digitalWrite(13, LOW);
}

Для подключения разных типов индикаторов ( с общим анодом или общим катодом) меняем согласно комментариям значения в строках

int ON = HIGH; // HIGH для подключения с общим анодом, LOW для подключения с общим катодом
int OFF = LOW; // LOW для подключения с общим катодом, HIGH для подключения с общим анодом

еще в коде

for(int i=0; i < 7; i++) { pinMode(groundPins[i], OUTPUT); digitalWrite(groundPins[i], HIGH); // HIGH для подключения с общим анодом, LOW для подключения с общим катодом } for(int i=0; i < 4; i++) { pinMode(digitPins[i], OUTPUT); digitalWrite(digitPins[i], LOW); // LOW для подключения с общим катодом, HIGH для подключения с общим анодом }

и еще…

for(int g=0; g < 7; g++) { digitalWrite(groundPins[g], LOW); // HIGH для подключения с общим анодом, LOW для подключения с общим катодом for(int i=0; i < 4; i++) { if (digit[i] < 0) { continue; } digitalWrite(digitPins[i], number[digit[i]][g]); } getDelay(); digitalWrite(groundPins[g], HIGH); // HIGH для подключения с общим анодом, LOW для подключения с общим катодом }

После правильной настройки часов и проверки работоспособности на макетной плате, заливаем скетч в микроконтроллер Atmega 8A-PU (ссылка на статью) и радуемся

sketch

На микроконтроллере можно так же выставить фюзы для работы от встроеного вкварца.. На работоспособность скетча не влияет…

Ну и от меня еще немного фото процесса )))

IMG_20151025_165416291

IMG_20151025_165441792

IMG_20151111_105323096_HDR

IMG_20151111_105421331

IMG_20151111_105830804

IMG_20151111_105830804

IMG_20151111_111106804_HDR

IMG_20151111_112738420

IMG_20151111_122849846

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

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

Arduino © 2016