Подключение семисегментного индикатора к плате Arduino может быть реализовано разными способами, в зависимости от требуемой функциональности и сложности. В этой статье мы рассмотрим три подхода к подключению и программированию семисегментного индикатора, начиная от простого переключения цифр и заканчивая более продвинутым управлением с использованием кнопок и обработкой дребезга контактов.
Для начала разберемся с самим индикатором - это сборка светодиодов с общим катодом или анодом. Ниже представлена самая удачная, на мой взгляд схема, простая и понятная.
Хочется обратить внимание, на то, что каждый из светодиодов (сегментов) должен подключаться через отдельный резистор! В обратном случае вы получите изменение яркости всего модуля в зависимости от количества горящих сегментов.
Чтобы разобраться подробно, почему так происходит, приглашаю вас пройти курс по электронике: https://stepik.org/course/109078
Итак, самый простой метод управления, когда светодиоды управляются с помощью набора строк digitalWrite() мы пропустим, так-как будем считать это простым миганием светодиодами.
1. Вы цифрами управляете? Нет, просто показываем!
Первый и самый простой метод к котором - это отображения цифр от 0 до 9. Используя массив pins для указания номеров выводов, к которым подключены сегменты, и массив digits для определения состояния каждого сегмента при отображении определенной цифры, можно легко переключаться между цифрами в цикле. В этом случае функция showDigit включает нужные сегменты для отображения заданной цифры.
byte pins[7] = {2,3,4,5,6,7,8};
byte digits[10][7] = {{1,1,1,1,1,1,0},//0
{0,1,1,0,0,0,0},//1
{1,1,0,1,1,0,1},//2
{1,1,1,1,0,0,1},//3
{0,1,1,0,0,1,1},//4
{1,0,1,1,0,1,1},//5
{1,0,1,1,1,1,1},//6
{1,1,1,0,0,0,0},//7
{1,1,1,1,1,1,1},//8
{1,1,1,1,0,1,1}};//9
void showDigit(int d){
for (int i=0;i<=6;i++){
digitalWrite(pins[i],digits[d][i]);
}
}
void setup() {
for (int i=0;i<=6;i++){
pinMode(pins[i],OUTPUT);
}
}
void loop() {
for (int i=0;i<=9;i++){
showDigit(i);
delay(1000);
}
}
2. Добавление кнопок для управления
Во втором методе мы расширяем базовую функциональность, добавляя возможность управления отображаемой цифрой с помощью кнопок. Для этого используем две кнопки: одну для уменьшения, а другую для увеличения текущей цифры на индикаторе. Использование delay позволяет нам задержать переключение между цифрами, чтобы пользователь мог легче управлять процессом.
#define BUTTON_MIN_PIN 9
#define BUTTON_MAX_PIN 10
byte pins[7] = {2,3,4,5,6,7,8};
byte digits[10][7] = {{1,1,1,1,1,1,0},//0
{0,1,1,0,0,0,0},//1
{1,1,0,1,1,0,1},//2
{1,1,1,1,0,0,1},//3
{0,1,1,0,0,1,1},//4
{1,0,1,1,0,1,1},//5
{1,0,1,1,1,1,1},//6
{1,1,1,0,0,0,0},//7
{1,1,1,1,1,1,1},//8
{1,1,1,1,0,1,1}};//9
int digit = 0;
void showDigit(int d){
for (int i=0;i<=6;i++){
digitalWrite(pins[i],digits[d][i]);
}
}
void setup() {
for (int i=0;i<=6;i++){
pinMode(pins[i],OUTPUT);
}
pinMode(BUTTON_MIN_PIN, INPUT_PULLUP);
pinMode(BUTTON_MAX_PIN, INPUT_PULLUP);
showDigit(digit);
}
void loop() {
if (!digitalRead(BUTTON_MIN_PIN) and digit>0){
digit-=1;
showDigit(digit);
delay(1000);
}
if (!digitalRead(BUTTON_MAX_PIN) and digit<9){
digit+=1;
showDigit(digit);
delay(1000);
}
}
3. Улучшенная обработка кнопок
Третий метод включает в себя продвинутую обработку нажатий кнопок, учитывая дребезг контактов и количество нажатий. Это достигается за счет использования таймеров и состояний для каждой кнопки, что позволяет более точно реагировать на действия пользователя и предотвращать ложные срабатывания!
Подробнее об этом методе обработки кнопок - можно прочитать тут:
https://t.me/burmistrov_robotics/28
#define BUTTON_MIN_PIN 9
#define BUTTON_MAX_PIN 10
uint8_t buttonMinState = 0;
uint8_t buttonMinPressed = 0;
uint32_t buttonMinTimer = 0;
uint8_t buttonMaxState = 0;
uint8_t buttonMaxPressed = 0;
uint32_t buttonMaxTimer = 0;
byte pins[7] = {2,3,4,5,6,7,8};
byte digits[10][7] = {{1,1,1,1,1,1,0},//0
{0,1,1,0,0,0,0},//1
{1,1,0,1,1,0,1},//2
{1,1,1,1,0,0,1},//3
{0,1,1,0,0,1,1},//4
{1,0,1,1,0,1,1},//5
{1,0,1,1,1,1,1},//6
{1,1,1,0,0,0,0},//7
{1,1,1,1,1,1,1},//8
{1,1,1,1,0,1,1}};//9
int digit = 0;
void buttonsControl(){
buttonMinState = !digitalRead(BUTTON_MIN_PIN);
if (millis() - buttonMinTimer > 50) {
if (!buttonMinPressed and buttonMinState){
buttonMinTimer = millis();
digit-=1;
showDigit(digit);
buttonMinPressed = 1;
}
else if (buttonMinPressed and !buttonMinState and digit>0){
buttonMinPressed = 0;
}
}
buttonMaxState = !digitalRead(BUTTON_MAX_PIN);
if (millis() - buttonMaxTimer > 50) {
if (!buttonMaxPressed and buttonMaxState and digit<9){
buttonMaxTimer = millis();
digit+=1;
showDigit(digit);
buttonMaxPressed = 1;
}
else if (buttonMaxPressed and !buttonMaxState){
buttonMaxPressed = 0;
}
}
}
void showDigit(int d){
for (int i=0;i<=6;i++){
digitalWrite(pins[i],digits[d][i]);
}
}
void setup() {
for (int i=0;i<=6;i++){
pinMode(pins[i],OUTPUT);
}
pinMode(BUTTON_MIN_PIN, INPUT_PULLUP);
pinMode(BUTTON_MAX_PIN, INPUT_PULLUP);
showDigit(digit);
}
void loop() {
buttonsControl();
}
Каждый из этих методов подходит для разных ситуаций и уровней сложности проектов. Начиная с простого переключения цифр и заканчивая более сложным управлением с помощью кнопок и обработкой дребезга, Arduino предоставляет гибкие возможности для реализации разнообразных идей.
Проект в TinkerCad: https://www.tinkercad.com/things/1Y2wSHslqNY-7-segmentnyj-indikator
Удачи в собственных разработках!