Saushin-Eldar | Дата: Понедельник, 23.02.2015, 18:55 | Сообщение # 1 |
1.5 Вольт
Группа: Пользователи
Сообщений: 1
Репутация: 0
Статус: Offline
| Чтобы подключить 1 семисегментный индикатор на прямую к Arduino, надо задействовать минимум 9 контактов. Конечно же это много. Тем более четырехразрядный семисигментный индикатор потребует 12 контактов! Поэтому я начал собирать информацию о подключении таких индикаторов, дабы задействовать как можно меньше контактов.
Вот такие варианты подключения я нашел в интернете: 1. с помощью микросхемы MAX7221 - можно управлять сразу 8-мью разрядами, но цена ей около 800р. 2. с помощью микросхемы 74HC164 - цена 15р. Поэтому я и выбрал второй вариант.
Схема подключения:
Как все будет происходить: Первой микросхемой мы будем управлять сегментами, загружая в нее биты нужных сегментов. Второй микросхемой мы будем управлять разрядами по очереди, т.е можно подключить максимум 8 разрядов, но! чем больше разрядов, тем больше будет рябить индикатор.
Что будет делать код: 1. Получаем число. 2. Получаем каждую цифру по отдельности. 3. Загружаем первую цифру в первую микросхему. 4. Включаем второй микросхемой первый разряд (получили цифру в 1ом разряде). 5. Выключаем второй микросхемой первый разряд. 6. Загружаем вторую цифру в первую микросхему. 7. Включаем второй микросхемой второй разряд (получили цифру в 2ом разряде). 8. Выключаем второй микросхемой второй разряд. 9. И т.д до 4го разряда (если число четырехзначное).
Сам код: Код #define data 12 #define clock 13 #define dataind 7 #define clockind 8
byte ind0 = B11111111; // для очистки разрядов byte ind1 = B01111111; // для вкл 1го разряда byte ind2 = B10111111; // для вкл 2го разряда byte ind3 = B11011111; // для вкл 3го разряда byte ind4 = B11101111; // для вкл 4го разряда
byte zero = B11111100; // для вкл нужных сегментов цифр byte one = B01100000; byte two = B11011010; byte three = B11110010; byte four = B01100110; byte five = B10110110; byte six = B10111110; byte seven = B11100000; byte eight = B11111110; byte nine = B11110110;
void setup() { pinMode(data, OUTPUT); // управление сегментами pinMode(clock, OUTPUT); // управление сегментами pinMode(dataind, OUTPUT); // управление разрядами pinMode(clockind, OUTPUT); // управление разрядами pinMode(0, INPUT); // входящее значение с контакта А0 (потенциометр) Serial.begin(9600); // просто так }
void loop() { int val0 = analogRead(0); // считываем значение, число сохраняем // в отдельной переменной для // дальнейшей обработки int val1 = val0 % 10; // вычисляем остаток от деления: так найдем цифру для 1го разряда if (val1 == 1) { shiftOut(data, clock, LSBFIRST, one); } else if (val1 == 2) { shiftOut(data, clock, LSBFIRST, two); } else if (val1 == 3) { shiftOut(data, clock, LSBFIRST, three); } else if (val1 == 4) { shiftOut(data, clock, LSBFIRST, four); } else if (val1 == 5) { shiftOut(data, clock, LSBFIRST, five); } else if (val1 == 6) { shiftOut(data, clock, LSBFIRST, six); } else if (val1 == 7) { shiftOut(data, clock, LSBFIRST, seven); } else if (val1 == 8) { shiftOut(data, clock, LSBFIRST, eight); } else if (val1 == 9) { shiftOut(data, clock, LSBFIRST, nine); } else { shiftOut(data, clock, LSBFIRST, zero); // даем найденной цифре // побитовое значение, чтобы занести в сдвиговый регистр (первая микросхема)
} delay(1); shiftOut(dataind, clockind, LSBFIRST, ind1); // включаем первый разряд delay(4); shiftOut(dataind, clockind, LSBFIRST, ind0); // выключаем все разряды int val2 = ((val0 - val1) / 10) % 10; //здесь находим вторую цифру // для второго разряда if(val0 >= 10) // производим проверку на двузначность числа { if (val2 == 1) { shiftOut(data, clock, LSBFIRST, one); } else if (val2 == 2) { shiftOut(data, clock, LSBFIRST, two); } else if (val2 == 3) { shiftOut(data, clock, LSBFIRST, three); } else if (val2 == 4) { shiftOut(data, clock, LSBFIRST, four); } else if (val2 == 5) { shiftOut(data, clock, LSBFIRST, five); } else if (val2 == 6) { shiftOut(data, clock, LSBFIRST, six); } else if (val2 == 7) { shiftOut(data, clock, LSBFIRST, seven); } else if (val2 == 8) { shiftOut(data, clock, LSBFIRST, eight); } else if (val2 == 9) { shiftOut(data, clock, LSBFIRST, nine); } else { shiftOut(data, clock, LSBFIRST, zero); } delay(1); shiftOut(dataind, clockind, LSBFIRST, ind2); // получили цифру во втором сегменте delay(4); shiftOut(dataind, clockind, LSBFIRST, ind0); } int val3 = ((val0 - val2*10 - val1) / 100) % 10; // находим 3ью цифру if(val0 >= 100) // производим проверку на трехзначность числа { if (val3 == 1) { shiftOut(data, clock, LSBFIRST, one); } else if (val3 == 2) { shiftOut(data, clock, LSBFIRST, two); } else if (val3 == 3) { shiftOut(data, clock, LSBFIRST, three); } else if (val3 == 4) { shiftOut(data, clock, LSBFIRST, four); } else if (val3 == 5) { shiftOut(data, clock, LSBFIRST, five); } else if (val3 == 6) { shiftOut(data, clock, LSBFIRST, six); } else if (val3 == 7) { shiftOut(data, clock, LSBFIRST, seven); } else if (val3 == 8) { shiftOut(data, clock, LSBFIRST, eight); } else if (val3 == 9) { shiftOut(data, clock, LSBFIRST, nine); } else { shiftOut(data, clock, LSBFIRST, zero); } delay(1); shiftOut(dataind, clockind, LSBFIRST, ind3); delay(4); shiftOut(dataind, clockind, LSBFIRST, ind0); } int val4 = ((val0 - val3*100 - val2*10 - val1) / 1000) % 10; if(val0 >= 1000) // производим проверку на четырехзначность числа { if (val4 == 1) { shiftOut(data, clock, LSBFIRST, one); } else if (val4 == 2) { shiftOut(data, clock, LSBFIRST, two); } else if (val4 == 3) { shiftOut(data, clock, LSBFIRST, three); } else if (val4 == 4) { shiftOut(data, clock, LSBFIRST, four); } else if (val4 == 5) { shiftOut(data, clock, LSBFIRST, five); } else if (val4 == 6) { shiftOut(data, clock, LSBFIRST, six); } else if (val4 == 7) { shiftOut(data, clock, LSBFIRST, seven); } else if (val4 == 8) { shiftOut(data, clock, LSBFIRST, eight); } else if (val4 == 9) { shiftOut(data, clock, LSBFIRST, nine); } else { shiftOut(data, clock, LSBFIRST, zero); } delay(1); shiftOut(dataind, clockind, LSBFIRST, ind4); // получили 4ую цифру delay(4); shiftOut(dataind, clockind, LSBFIRST, ind0); } } // и все заново Недостатки: 1. Когда в первом сегменте горит какое либо число, то в остальных появляется слабое фантомное свечение того же числа. Возможно вторая микросхема не выдает точную логическую единицу. Возможно нужны подтягивающие резисторы. 2. Чем больше цифр на индикаторе, тем больше рябь. Но с помощью задерки добился наименьшей ряби. 3. Код создан для целых чисел. Кто умеет делать библиотеки, попробуйте сделать)) 4. Для работы индикатора число должно постоянно приходить.
|
|
| |