цифровая электроника
вычислительная техника
встраиваемые системы

 



Четырехразрядный индикатор на TM1637 и Arduino DigiSpark

Автор: Mike(admin) от 25-04-2017, 19:05

Для того, чтобы сделать четырехразрядный таймер/счетчик или часы на Ardunio, можно воспользоваться модулем индикатора с микросхемой TM1637.


Четырехразрядный индикатор на TM1637 и Arduino DigiSpark

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


При вводе данных сигнал DIO не должен изменяться при высоком уровне сигнала CLK и должен изменяться при низком уровне сигнала CLK. Когда уровень сигнала CLK высокий и уровень сигнала DIO изменяется с высокого на низкий, начинается ввод данных. Когда уровень сигнала CLK низкий и уровень сигнала DIO изменяется с низкого на высокий, ввод данных заканчивается. Передача данных TM1637 осуществляется с ответом ACK. Для правильной передачи данных в микросхеме генерируется ответный ACK-сигнал, который опускает линию DIO в низкий логический уровень при спадающем фронте восьмого тактового сигнала. Сигнал DIO уже находится в низком логическом уровне в конце девятого такта. Для работы индикатора с Arduino необходимо подключить библиотеку, которую можно найти на https://github.com/reeedstudio/libraries/tree/master/DigitalTube.


С помощью индикатора на TM1637 можно сделать очень компактный таймер/счетчик, если подключить его к самой маленькой плате Arduino – Digispark. Схема подключения представлена ниже.


Четырехразрядный индикатор на TM1637 и Arduino DigiSpark. Схема подключения

Код (скетч) реализует таймер обратного отсчета и вызывает функцию будильника через заданное время (около 60 секунд). Импульсный выход, доступный на линии D2 платы Digispark (по истечении установленного времени), может быть использован для запуска внешней схемы сигнализации / сирены.



#include "TM1637.h" // подключение библиотеки
#define CLK 0 
#define DIO 1 
#define Pulse 2 // Выход для сигнализации 
int timer_val=1; // Обратный отсчет в минутах 
int timer_seconds=00; // Отображение секунд 
// Переменные для хранения индивидуальных номеров 
int firstnum=0; 
int secondnum=0; 
int thirdnum=0; 
int fournum=0; 
TM1637 tm1637(CLK,DIO); // Настройка индикатора
void setup(){ 
   pinMode(Pulse, OUTPUT); 
   digitalWrite(Pulse, LOW); 
   tm1637.init(); // Сброс дисплея 
   tm1637.set(BRIGHT_TYPICAL); // Уровень яркости 
   // BRIGHT_DARKEST = 0,BRIGHTEST = 7 BRIGHT_TYPICAL = 2;
   tm1637.point(POINT_ON); // Активация точки посредине 
   delay(1000); // Задержка 1 секунда
} 
void loop() { 
   // Проверка, запустился ли таймер 
   while (timer_val == 0 && timer_seconds == 0) { 
      tm1637.clearDisplay(); // Очистка дисплея 
      tm1637.display(0,0); 
      tm1637.display(1,0); 
      tm1637.display(2,0); 
      tm1637.display(3,0); 
      digitalWrite(Pulse, HIGH); // Активация сигнализации 
      delay(1000);  // Wait
      tm1637.clearDisplay(); 
      digitalWrite(Pulse, LOW); // Отключение сигнализации
      delay(500); // Ждем полсекунды
   } 
   // Распределяем минуты и сикунды по отдельным сегментам 
   if (timer_val > 9) { 
      firstnum = timer_val/10%10; 
      secondnum = timer_val%10; 
   } 
   else { 
      secondnum = timer_val; 
   } 
   if (timer_seconds > 9) { 
      thirdnum = timer_seconds/10%10; 
      fournum = timer_seconds%10; 
   } 
   else { 
      thirdnum = 0; 
      fournum = timer_seconds; 
   } 
   // Отображаем обратный отсчет
   tm1637.clearDisplay(); // Очистка дисплея
   if (timer_val > 9) { 
      tm1637.display(0,firstnum); 
   } 
   if (timer_val > 0) { 
      tm1637.display(1,secondnum); 
   } 
   if (timer_seconds > 9 || timer_val > 0) { 
      tm1637.display(2,thirdnum); 
   } 
   tm1637.display(3,fournum); 
   // Decrease seconds 
   timer_seconds=timer_seconds-1; 
   delay(1000); // Delay of 1 second 
   // Decrease timer 
   if (timer_seconds == -1) { 
      timer_val=timer_val-1; 
      timer_seconds=59; 
   } 
}



Теги: Arduino, Digispark, индикатор, TM1637, часы




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий
Цитата
  • Monti

  • 26 октября 2017 13:22
  • Группа: Гости
  • ICQ:
  • Регистрация: --
  • Статус:
  • Комментариев: 0
  • Публикаций: 0
^
Давно искал подобный код, для моего проекта нужно два таймера, которые в бесконечном цикле будут сменять друг друга, добавил "int timer_val1=2" изменил код, но у меня получилось: работает "int timer_val=1" после запускается "int timer_val1=2", а вот потом опять идет "int timer_val1=2". Добиться чтоб таймеры работали поочередно не получается
Цитата
  • nikizh

  • 6 мая 2018 08:58
  • Группа: Гости
  • ICQ:
  • Регистрация: --
  • Статус:
  • Комментариев: 0
  • Публикаций: 0
^
Здравствуйте,digitrode.ru.
Здравствуйте, Mike !
Вы можете дополнить скетч,
чтобы точки мигали в такт переключения цифр ?
Спасибо!
Цитата
  • Группа: Гости
  • ICQ:
  • Регистрация: --
  • Статус:
  • Комментариев: 0
  • Публикаций: 0
^
Здравствуйте! При компиляции останавливается на ошибке:
'class TM1637' has no member named 'set'
Подскажите куда копать?