Последнее время наблюдается тенденция роста числа проектов на Arduino с использованием различных дисплеев, индикаторов и других способов отображения и вывода информации. Поэтому я считаю нужным рассмотреть вопрос о подключении семисегментных светодиодных индикаторов к плате Arduino UNO. О том, что такое семисегментный индикатор (далее просто индикатор или семисегментник) и как с ним работать было сказано ранее. В данном проекте мы осуществим подключение 4-х индикаторного модуля к плате Arduino UNO.
Данный модуль работает только в динамической индикации и сделан таким образом, что все выводы, отвечающие за формирование цифры соединены параллельно и образуют своего рода шину. По данной шине будет передаваться определенная цифра, точнее сказать на ней будет появляться напряжение, зажигающие тот или иной сегмент семисегментника. Включение того или иного индикатора осуществляется при помощи четырех выводов которые являются своего рода управляющими. Подключение к ним осуществляется через 4 транзистора.
Для того чтобы зажечь определённый индикатор нужно подать на его общий вывод логический ноль или по другому подать ноль. Привожу схему подключения семисегментного модуля из 4-х индикаторов к плате ArduinoUNO.
В данном примере мы получаем аналоговое значение через переменное сопротивление и выводим его на 4 индикатора. Переменное сопротивление подключается к выводу A0. Максимально возможное значение составляет 1024, минимальное соответственно 0. Вращая ручку переменного сопротивления мы меняем показания «дисплея».
Схема питается от источника тока в 5 Вольт. Подключение необходимо осуществлять через токоограничивающие резисторы. Такие резисторы при напряжении в 5 Вольт составляют в пределах 330-470 Ом. Это необходимо для защиты микроконтроллера Arduinoот значительных токов, которые могут вывести ее из строя.
На модули есть выводы с обозначениями «G,F,E,D,C,B,A» их нужно подключить к следующим выводам Arduino «8,7,6,5,4,3,2»
А так это выглядит в собраном виде
const int numeral[10] = { //ABCDEFG /dp B11111100, // 0 B01100000, // 1 B11011010, // 2 B11110010, // 3 B01100110, // 4 B10110110, // 5 B00111110, // 6 B11100000, // 7 B11111110, // 8 B11100110, // 9 }; // pins for decimal point and each segment // DP,G,F,E,D,C,B,A const int segmentPins[] = { 13,8,7,6,5,4,3,2 }; const int nbrDigits= 4; // the number of digits in the LED display //dig 0 1 2 3 const int digitPins[nbrDigits] = { 9,10,11,12 }; void setup() { for(int i=0; i < 8; i++) { pinMode(segmentPins[i], OUTPUT); // set segment and DP pins to output } for(int i=0; i < nbrDigits; i++) { pinMode(digitPins[i], OUTPUT); } } void loop() { int value = analogRead(0); showNumber(value); } void showNumber( int number) { if(number == 0) { showDigit( 0, nbrDigits-1) ; // display 0 in the rightmost digit } else { // display the value corresponding to each digit // leftmost digit is 0, rightmost is one less than the number of places for( int digit = nbrDigits-1; digit >= 0; digit--) { if(number > 0) { showDigit( number % 10, digit) ; number = number / 10; } } } } // Displays given number on a 7-segment display at the given digit position void showDigit( int number, int digit) { digitalWrite( digitPins[digit], HIGH ); for(int segment = 1; segment < 8; segment++) { boolean isBitSet = bitRead(numeral[number], segment); // isBitSet will be true if given bit is 1 // isBitSet = ! isBitSet; // Code Option* // uncomment the above Code Option line for common anode display digitalWrite( segmentPins[segment], isBitSet); } delay(5); digitalWrite( digitPins[digit], LOW ); }
В данном коде мы сначала объявили массив значений для отображения каждого сегмента индикатора. Для того чтобы зажечь тот или иной сегмент и сформировать из него цифру нужно на выводы подать напряжение.
Комментарии