Сегодня в статье я хочу реализовать основу для нового простенького проекта – погодный термометр. Мой старый аналоговый градусник видимо сломался и показывает сейчас +16, хотя за окном в самом разгаре осень и gismeteo утверждает, что сейчас не теплее +3 — +4 градусов. В связи с этим я решил сделать цифровой термометр, из запчастей не хватает только самого градусника – его уже заказ и через пару недель, когда товар приедет, будет продолжение статьи. А пока можно разобраться с выводом информации, для этих целей у меня завалялся 4-разрядный 7-сегментный индикатор hs420561k-32. Есть куда более удачные и прокаченные версии подобных индикаторов, с уже встроенными микрочипами управления. Но с такими модулями не интересно разбираться, там всего 4 или 5 ног – две и которых это питание. Мне, как новичку, куда больше доставляет удовольствия разбираться во всем самому. И индикатор hs420561k-32 в этом отношении меня полностью устраивает. Ниже приведена фотография собранной на макетной плате схемы.
Что такое 4-разрядный 7-сегментный индикатор hs420561k-32
Как можно увидеть на фото, 4-разрядный 7-сегментный индикатор идеально подходит для задуманного прибора. Один разряд будет отвечать за вывод минуса, при необходимости, второй и третий разряд оставим для вывода градусов, а четвертый будет просто для красоты, всегда выводить значок градусов.
В первую очередь нужно разобраться, как работает индикатор. У модуля 12 ног, 4 из них являются катодами, и каждый отвечает за один разряд из четырех – на какую ногу будет подан минус, тот разряд и будет активным. 8 других являются анодами и каждая отвечает за один из 7 сегментов и за точку внизу цифры. Таким образом, мы можем управлять каждым сегментом и разрядом. Единственная проблема кроется в том, что выводить можно одновременно только одну цифру на каждом разряде. Побороть это не сложно, достаточно просто за очень короткий промежуток времени по очереди выводить нужную информацию на каждый из разрядов. Человеческий глаз не сможет уловить переключение и будет казаться, что одновременно горят все разряды. Даже фотокамера не смогла это уловить – это видно по фотографии, которую я прикладывал выше.
Посмотреть какая нога индикатора за что отвечает, можно по картинке ниже.
Для удобства работы и чтобы закрепить знания из прошлой статьи про сдвиговый регистр я решил использовать в схеме микросхему 74HC595. Это снизит количество задействованных пинов ардуино. Ниже я привел схему подключений, она получилось кривая, надеюсь, со временем я научусь рисовать их качественней :). P.S. На схеме я не нарисовал 3 резистора — пропустил, их нужно добавить между пинами arduino и ножками hs420561k-32 с именами A, F и B.
Что использовалось в проекте
- Arduino (я использовал arduino nano, но можно любую другую). Покупал тут: arduino nano
- Дисплей hs420561k-32. Покупал тут: Аналог дисплея hs420561k-32
- 1 Сдвиговый регистр 74HC595. Покупал тут: сдвиговые регистры 10 штук
- 8 резисторов сопротивлением 300 Ом. Покупал тут:набор резисторов 700 шт. От 10 Ом до 1 МОм
- Несколько соединительных проводов. Покупал тут: соединительные провода
- Макетная плата. Я использовал с 830 отверстиями. Покупал тут: макетная плата
Скетч для управлением индикатором 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); }
Немного доделал)
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 аналоговых входа и 2 цифровых входа, следовательно, на выходе 4 4-х разрядных 7-ми сигментных индикатора.
Как прикажете жить с такими желаниями? И главное — что делать?
Добрый день! Сдвиговые регистры можно подключать каскадами. То есть Вы можете создать каскад из 4х сдвиговых регистров и с помощью них управлять своими 4-я индикаторами. В таком случае количество задействованных пинов ардуино не изменится.