4-разрядный 7-сегментный индикатор hs420561k-32 в связке с 74HC595 и arduino

4-разрядный 7-сегментный индикатор hs420561k-32

Сегодня в статье я хочу реализовать основу для нового простенького проекта – погодный термометр. Мой старый аналоговый градусник видимо сломался и показывает сейчас +16, хотя за окном в самом разгаре осень и gismeteo утверждает, что сейчас не теплее +3 — +4 градусов. В связи с этим я решил сделать цифровой термометр, из запчастей не хватает только самого градусника – его уже заказ и через пару недель, когда товар приедет, будет продолжение статьи. А пока можно разобраться с выводом информации, для этих целей у меня завалялся 4-разрядный 7-сегментный индикатор hs420561k-32. Есть куда более удачные и прокаченные версии подобных индикаторов, с уже встроенными микрочипами управления. Но с такими модулями не интересно разбираться, там всего 4 или 5 ног – две и которых это питание. Мне, как новичку, куда больше доставляет удовольствия разбираться во всем самому. И индикатор hs420561k-32 в этом отношении меня полностью устраивает. Ниже приведена фотография собранной на макетной плате схемы.


4-разрядный 7-сегментный индикатор hs420561k-32 в связке с 74HC595. Фото 1

Что такое 4-разрядный 7-сегментный индикатор hs420561k-32

Как можно увидеть на фото, 4-разрядный 7-сегментный индикатор идеально подходит для задуманного прибора. Один разряд будет отвечать за вывод минуса, при необходимости, второй и третий разряд оставим для вывода градусов, а четвертый будет просто для красоты, всегда выводить значок градусов.

В первую очередь нужно разобраться, как работает индикатор. У модуля 12 ног, 4 из них являются катодами, и каждый отвечает за один разряд из четырех – на какую ногу будет подан минус, тот разряд и будет активным. 8 других являются анодами и каждая отвечает за один из 7 сегментов и за точку внизу цифры. Таким образом, мы можем управлять каждым сегментом и разрядом. Единственная проблема кроется в том, что выводить можно одновременно только одну цифру на каждом разряде. Побороть это не сложно, достаточно просто за очень короткий промежуток времени по очереди выводить нужную информацию на каждый из разрядов. Человеческий глаз не сможет уловить переключение и будет казаться, что одновременно горят все разряды. Даже фотокамера не смогла это уловить – это видно по фотографии, которую я прикладывал выше.
Посмотреть какая нога индикатора за что отвечает, можно по картинке ниже.

4-разрядный 7-сегментный индикатор hs420561k-32 в связке с 74HC595. Datasheet

Для удобства работы и чтобы закрепить знания из прошлой статьи про сдвиговый регистр я решил использовать в схеме микросхему 74HC595. Это снизит количество задействованных пинов ардуино. Ниже я привел схему подключений, она получилось кривая, надеюсь, со временем я научусь рисовать их качественней :). P.S. На схеме я не нарисовал 3 резистора — пропустил, их нужно добавить между пинами arduino и ножками hs420561k-32 с именами A, F и B.

4-разрядный 7-сегментный индикатор hs420561k-32 в связке с 74HC595. Схема подключения

Что использовалось в проекте

Скетч для управлением индикатором hs420561k-32

Теперь остается только написать скетч, его код приведен ниже, а также доступен для скачивания тут: скачать.

//Пин подключен к SH_CP входу 74HC595
int clockPin = 6;
//Пин подключен к ST_CP входу 74HC595
int latchPin = 7;
//Пин подключен к DS входу 74HC595
int dataPin = 8;

// Пины разрядов цифер
int pins_numbers[4] = {2, 3, 4, 5};
// Биты для отображения цифер от 0-9, минуса и символ градуса цельсия
byte numbers_array[12] = {
    B00111111, B00000110, B01011011, B01001111, // 0 1 2 3
    B01100110, B01101101, B01111101, B00000111, // 4 5 6 7
    B01111111, B01101111, B01000000, B01100011 // 8 9 - о
  };
 
void setup() {
  //устанавливаем режим OUTPUT
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);

  for(int i; i<4; i++){
    pinMode(pins_numbers[i], OUTPUT);
  }
}
 
void loop() {
  // включить сразу несколько цифр нельзя, поэтому очень быстро показываем по одной
  showNumber(1, 11);
  showNumber(2, 7);
  showNumber(3, 2);
  showNumber(4, 10);
}
 
void showNumber(int numNumber, int number){
  // зажигаем нужные сегменты 
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, numbers_array[number]); 
  digitalWrite(latchPin, HIGH);

  // включаем нужный разряд(одну из четырех цифр)
  int num_razryad = pins_numbers[numNumber-1];
  for(int i; i<4; i++){
    // выключаем все
    digitalWrite(pins_numbers[i], HIGH);
  }
  // включаем нужную
  digitalWrite(num_razryad, LOW);
    
  delay(5);
}
Рассказать друзьям:


4-разрядный 7-сегментный индикатор hs420561k-32 в связке с 74HC595 и arduino: 4 комментария

  1. Немного доделал)
    int clockPin = 6;
    //Пин подключен к ST_CP входу 74HC595
    int latchPin = 7;
    //Пин подключен к DS входу 74HC595
    int dataPin = 8;

    // Пины разрядов цифер
    int pins_numbers[4] = {2, 3, 4, 5};
    // Биты для отображения цифер от 0-9, минуса и символ градуса цельсия
    const byte numbers_array[11] = {
    0B00000011, 0B10011111, 0B00100101, 0B00001101, // 0 1 2 3
    0B10011001, 0B01001001, 0B01000001, 0B00011111, // 4 5 6 7
    0B00000001, 0B00001001, 0B11111101,}; // 8 9 —

    void setup() {
    //устанавливаем режим OUTPUT
    pinMode(latchPin, OUTPUT);
    pinMode(clockPin, OUTPUT);
    pinMode(dataPin, OUTPUT);

    for(int i; i<4; i++){
    pinMode(pins_numbers[i], OUTPUT);
    }
    }
    void show(int number)
    {
    if(number=0){ showNumber(1, number);}
    if(number=10){ showNumber(1, number%10);showNumber(2, number/10);}
    if(number=100){ showNumber(1, number%10);showNumber(2, number/10%10);showNumber(3, number/100);}
    if(number=1000){ showNumber(1, number%10);showNumber(2, number/10%10);showNumber(3, number/100%10);showNumber(4, number/1000);}

    }
    void loop() {
    // включить сразу несколько цифр нельзя, поэтому очень быстро показываем по одной
    show(8272);
    }

    void showNumber(int numNumber, int number){
    // зажигаем нужные сегменты
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, LSBFIRST, numbers_array[number]);
    digitalWrite(latchPin, HIGH);

    // включаем нужный разряд(одну из четырех цифр)
    int num_razryad = pins_numbers[numNumber-1];
    for(int i; i<4; i++){
    // выключаем все
    digitalWrite(pins_numbers[i], false);
    }
    // включаем нужную
    digitalWrite(num_razryad, true);

    delay(5);
    }

  2. А можно ли использовать этот скетч для двухсегментного индикатора с общим анодом?
    Что нужно поправить в коде?

    1. этот код можно за основу взять, только подправить под вывод двух чисел — эксперементировать нужно, зависит от распиноаки индикатора

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

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

*