Перед началом данной статьи предоставлю доступ к созданной библиотеке, при помощи которой можно упростить программное написание и реализацию вывода чисел на индикатор. В данной статье будет использована эта библиотека:
https://github.com/AlexGyver/GyverLibs/tree/master/SevenSegmentsDisp
Семисегментные светодиодные индикаторы
Семисегментные светодиодные индикаторы являются самым простым способом вывода текстовой или численной информации непосредственно с платы Arduino.
Проще говоря, семисегментные индикаторы-«сборки» из светодиодов с общим анодом и катодом. Является простейшим представлением индикатора, который способен отображать арабские цифры, а также некоторые кириллические и латинские буквы. Подавая питание на один или несколько светодиодов, можно выводить цифры или некоторые буквы.
Обычно одного символа в большинстве крупных и сложных проектах недостаточно, поэтому такие сборки объединяют по две-три штуки, каждая из которых называется знакоместом, или же символом дисплея.
Именно такие сдвоенные, строенные или счетверенные светодиодные индикаторы используются в паре с микроконтроллером.
Отводы от сегментов соединяют параллельно для экономии управляющих выводов, поэтому для вывода информации используется динамическая индикация. То есть в определенный момент времени горит только одно знакоместо, которое после определенного времени переключается на следующее. Динамическая индикация на базе семисегментных индикаторов применяется для отображения информации. Например, температуры, напряжения, тока, скорости, времени, расстояния пройденного пути, количества срабатываний устройств или датчиков.
Подобные индикаторы можно подключать и напрямую, но из-за большого количества контактов, а следовательно, занятия весомого количества пинов, их используют совместно со специальными микросхемами-контроллерами. Большинство модулей уже укомплектованы с данными контроллерами, а значит передавать информацию на них можно по последовательному интерфейсу, используя всего пару проводов.
Динамическая индикация
Динамическая индикация в программном представлении имеет следующие особенности:
- Нормальный период индикации на стороне микроконтроллера: 300-5000 мкс(период влияет на мерцание дисплея,чем он меньше-тем чаще и незаметнее мерцает дисплей, при этом возрастает нагрузка на систему).
- Алгоритмы реализованы в библиотеке в качестве методов индикации .tick() и tickManual()
Код динамической индикации содержится в методе tickManual(), который вызывается в диапазоне нормального периода индикации при помощи таймера на micros() или прерывания таймера.
Однако при реализации вторым методом следует учесть то, что свободных таймеров в Arduino не так уж и много, и в большинстве случаев они уже заняты. Например, плата ATmega328p имеет в своем функционале три таймера, которые в свою очередь имеют следующее расположение:
- Таймер с номером 0 занят функциями времени milis(), micros(), delay();
- Первый занимается библиотекой <Servo.h>;
- Второй занят функцией tone(), noTone().
Следует помнить: Занимая один из таймеров, вы теряете два из шести каналов, использующихся для ШИМ.
Если у вас нет возможности занять таймер, то в таком случае лучше использовать дополнительный таймер на micros, встроенный в метод .tick().
При использовании метода .tick() его следует вставить в любой цикл.
Учтите, что в таком случае цикл loop или любой другой, используемый вами, не должен содержать delay()-его стоит заменить на таймер milis(), pulsein() и других блокирующих функций, следует ограничить длительность операций и оптимизировать быстроту цикла.
Код
#include <GyverTimers.h>
#include <SevenSegmentsDisp.h>
#define DATA_PIN 5
#define SCLK_PIN 6
#define RCLK_PIN 7
Disp595 disp(DATA_PIN, SCLK_PIN, RCLK_PIN);
void setup() {
Timer2.setPeriod(3000);
Timer2.enableISR(); // включаем прерывание
}
void loop() {
}
ISR(TIMER2_A) { // прерывание
disp.tick();
}
Подключение индикатора
Для подключения нам потребуются:
- Индикатор;
- Резистор;
- Макетная плата;
- Arduino UNO;
- Кабель USB.
Выводим схему соответствия сегментов индикатора цифровым выходам контроллера.
Также есть другая реализация данной cхемы с буквенными обозначениями выводов:
Код
void setup() {
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
}
void loop() {
int i = 2000;
digitalWrite(2, HIGH);
delay(i);
digitalWrite(2, LOW);
delay(i);
digitalWrite(3, HIGH);
delay(i);
digitalWrite(3, LOW);
delay(i);
digitalWrite(4, HIGH);
delay(i);
digitalWrite(4, LOW);
delay(i);
digitalWrite(5, HIGH);
delay(i);
digitalWrite(5, LOW);
delay(i);
digitalWrite(6, HIGH);
delay(i);
digitalWrite(6, LOW);
delay(i);
digitalWrite(7, HIGH);
delay(i);
digitalWrite(7, LOW);
delay(i);
digitalWrite(8, HIGH);
delay(i);
digitalWrite(8, LOW);
delay(i);
}
Вывод чисел от 0 до 9
void setup() {
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
}
void loop() {
int i = 1000;
// 0
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
delay(i);
// Удаляем все после работы
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
// 1
digitalWrite(2, HIGH);
digitalWrite(8, HIGH);
delay(i);
//
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
// 2
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
delay(i);
//
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
// 3
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(5, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
delay(i);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
// 4
digitalWrite(2, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(8, HIGH);
delay(i);
//
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
// 5
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
delay(i);
//
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
// 6
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
delay(i);
//
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
// 7
digitalWrite(2, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
delay(i);
//
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
// 8
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
delay(i);
// Удаляем все после работы
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
// 9
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
delay(i);
//
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
В данной статье мы научились подключать семисегментный индикатор к Arduino и выводить на нем числа.