Четырехразрядный индикатор. Урок 24. Ардуино

lesson 24 cover
Четырехразрядный индикатор
Четырехразрядный индикатор

Привет! Мы рассмотрели одноразрядный индикатор. А теперь посмотрим на четырехразрядный 7 сегментный индикатор.

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

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

Для того, чтобы выполнить этот урок нам понадобиться.

  • Ардуино UNO
  • Макетная плата
  • Перемычки
  • 8 резисторов 220 Ом
  • 7-сегментный четырехразрядный индикатор
  • Кабель USB

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

Четырехразрядный индикатор
Схема подключения светодиодов в корпусе индикатора и контактов

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

Схема и программа

Принципиальная схема подключения Ардуино и индикатора
Принципиальная схема подключения Ардуино и индикатора

В схеме опять много проводов. Но смысл опять в том, чтобы соединить 8 светодиодов и 4 разряда с пинами Ардуино для их адресации.

Чтобы было проще понять какие пины соединять между собой обратим внимание на таблицу.

Цифровой пин АрдуиноПин индикатора
2B
3G
4C
5DP
6D
7E
8F
9A
104
113
122
131
Таблица соединения пинов Ардуино и индикатора

Напишем простой скетч, чтобы проверить индикатор и правильность схемы.

Проверяем работу индикатора
Проверяем работу индикатора
void setup(){
  for( int j=2; j <= 13; j++){
    pinMode(j, OUTPUT);
  }
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
}
void loop(){
  for( int j=2; j <= 9; j++){
    digitalWrite(j, LOW);
  }
    for(int i=2; i<=9; i++){
      digitalWrite(i, HIGH);
      delay(200);
    }
}

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

Выводим цифры в каждый разряд
Выводим цифры в каждый разряд
int a = 9;
int b = 2;
int c = 4;
int d = 6;
int e = 7;
int f = 8;
int g = 3;
int p = 5;
int d4 = 10;
int d3 = 11;
int d2 = 12;
int d1 = 13;
int x = 1;
int del = 500;
  
void setup(){
  for( int j=2; j <= 13; j++){
    pinMode(j, OUTPUT);
  }
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
}

void loop(){
  
    digit(x);
    delay(del);
    clean();
    x++;
    if (x == 10){x=0;}
  
}


void clean(){
  for( int j=2; j <= 9; j++){
    digitalWrite(j, LOW);
  }  
}
void digit(int x){
    switch (x) {
        case 1:
          digitalWrite (b,HIGH);
          digitalWrite (c,HIGH);
          break;
        case 2:
          digitalWrite (a,HIGH);
          digitalWrite (b,HIGH);
          digitalWrite (d,HIGH);
          digitalWrite (e,HIGH);
          digitalWrite (g,HIGH);
          break;
        case 3:
          digitalWrite (a,HIGH);
          digitalWrite (b,HIGH);
          digitalWrite (c,HIGH);
          digitalWrite (d,HIGH);
          digitalWrite (g,HIGH);
          break;
        case 4:
          digitalWrite (b,HIGH);
          digitalWrite (c,HIGH);
          digitalWrite (f,HIGH);
          digitalWrite (g,HIGH);
          break;
        case 5:
          digitalWrite (a,HIGH);
          digitalWrite (c,HIGH);
          digitalWrite (d,HIGH);
          digitalWrite (f,HIGH);
          digitalWrite (g,HIGH);
          break;
        case 6:
          digitalWrite (a,HIGH);
          digitalWrite (c,HIGH);
          digitalWrite (d,HIGH);
          digitalWrite (e,HIGH);
          digitalWrite (f,HIGH);
          digitalWrite (g,HIGH);
          break;
        case 7:
          digitalWrite (a,HIGH);
          digitalWrite (b,HIGH);
          digitalWrite (c,HIGH);
          break;
        case 8:
          digitalWrite (a,HIGH);
          digitalWrite (b,HIGH);
          digitalWrite (c,HIGH);
          digitalWrite (d,HIGH);
          digitalWrite (e,HIGH);
          digitalWrite (f,HIGH);
          digitalWrite (g,HIGH);
          break;
        case 9:
          digitalWrite (a,HIGH);
          digitalWrite (b,HIGH);
          digitalWrite (c,HIGH);
          digitalWrite (d,HIGH);
          digitalWrite (f,HIGH);
          digitalWrite (g,HIGH);
          break;         
        case 0:
          digitalWrite (a,HIGH);
          digitalWrite (b,HIGH);
          digitalWrite (c,HIGH);
          digitalWrite (d,HIGH);
          digitalWrite (e,HIGH);
          digitalWrite (f,HIGH);
          break;           
      }
  
}

Назовем сегменты переменными, чтобы проще к ним обращаться. И выведем одно число на каждом разряде.

Теперь осталось только научить программу выводить числа от 1 до 9999 и использовать точку. Давайте попробуем.

Разные цифры в разных разрядах
Разные цифры в разных разрядах

Полный текст программы

int a = 9;
int b = 2;
int c = 4;
int d = 6;
int e = 7;
int f = 8;
int g = 3;
int p = 5;
int d4 = 10;
int d3 = 11;
int d2 = 12;
int d1 = 13;
int x = 1;
int r = 0;
int del = 500;
  
void setup(){
  for( int j=2; j <= 13; j++){
    pinMode(j, OUTPUT);
  }
}

void loop(){
    BigDigit(1234);
}

void BigDigit(int x){
  r = 3;
  do{    
    rank(r);
    digit(x%10);
    x = x/10;
    r--;
  }while(x);

}

void rank(int x){
  digitalWrite(d1, HIGH);
  digitalWrite(d2, HIGH);
  digitalWrite(d3, HIGH);
  digitalWrite(d4, HIGH);

  switch(x){
    case 0: 
      digitalWrite(d1, LOW);
      break;
    case 1: 
      digitalWrite(d2, LOW);
      break;
    case 2: 
      digitalWrite(d3, LOW);
      break;
    case 3: 
      digitalWrite(d4, LOW);
      break;
  }
}
void clean(){
  for( int j=2; j <= 9; j++){
    digitalWrite(j, LOW);
  }  
}
void digit(int x){
    clean();
    switch (x) {
        case 1:
          digitalWrite (b,HIGH);
          digitalWrite (c,HIGH);
          break;
        case 2:
          digitalWrite (a,HIGH);
          digitalWrite (b,HIGH);
          digitalWrite (d,HIGH);
          digitalWrite (e,HIGH);
          digitalWrite (g,HIGH);
          break;
        case 3:
          digitalWrite (a,HIGH);
          digitalWrite (b,HIGH);
          digitalWrite (c,HIGH);
          digitalWrite (d,HIGH);
          digitalWrite (g,HIGH);
          break;
        case 4:
          digitalWrite (b,HIGH);
          digitalWrite (c,HIGH);
          digitalWrite (f,HIGH);
          digitalWrite (g,HIGH);
          break;
        case 5:
          digitalWrite (a,HIGH);
          digitalWrite (c,HIGH);
          digitalWrite (d,HIGH);
          digitalWrite (f,HIGH);
          digitalWrite (g,HIGH);
          break;
        case 6:
          digitalWrite (a,HIGH);
          digitalWrite (c,HIGH);
          digitalWrite (d,HIGH);
          digitalWrite (e,HIGH);
          digitalWrite (f,HIGH);
          digitalWrite (g,HIGH);
          break;
        case 7:
          digitalWrite (a,HIGH);
          digitalWrite (b,HIGH);
          digitalWrite (c,HIGH);
          break;
        case 8:
          digitalWrite (a,HIGH);
          digitalWrite (b,HIGH);
          digitalWrite (c,HIGH);
          digitalWrite (d,HIGH);
          digitalWrite (e,HIGH);
          digitalWrite (f,HIGH);
          digitalWrite (g,HIGH);
          break;
        case 9:
          digitalWrite (a,HIGH);
          digitalWrite (b,HIGH);
          digitalWrite (c,HIGH);
          digitalWrite (d,HIGH);
          digitalWrite (f,HIGH);
          digitalWrite (g,HIGH);
          break;         
        case 0:
          digitalWrite (a,HIGH);
          digitalWrite (b,HIGH);
          digitalWrite (c,HIGH);
          digitalWrite (d,HIGH);
          digitalWrite (e,HIGH);
          digitalWrite (f,HIGH);
          break;           
      }
  delay(5);
}

Библиотека fDigitsSegtPin.h

Используем библиотеку fDigitsSegtPin.h
Используем библиотеку fDigitsSegtPin.h

Как видите, код программы получается довольно громоздким. И было бы неплохо запаковать его в отдельную библиотеку. К счастью, такая библиотека уже есть. Это fDigitsSegtPin.h Установим ее через менеджер и используем для вывода десятичных цифр.

#include <fDigitsSegtPin.h>
fDigitsSegtPin Display(7, 6, 5, 4, 3, 10, 2, 11, 12, 8, 9, 13);

void setup() {
    Display.begin();
    Display.doPrint_lastDot = 1;
    Display.doPrint_firstZero = 1;
    Display.doReport_overRange = 1;
}

void loop() {
    for(float i = 0.01; i < 10000; i += 0.01) Display.print(i);
}

Заключение

Мы рассмотрели четырехразрядный 7 сегментный индикатор. Написали программу для вывода больших цифр на индикатор и попробовали простую библиотеку для вывода цифр с точкой.

Где купить

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

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