Подключение 4-х разрядного семисегментного индикатора
- Войдите на сайт для отправки комментариев
Здравствуйте, уважаемы форумчане!
Я у вас тут новеньки, начинающий. В коде пока не особо разбираюсь, так что прошу помощи.
Есть семисегментник. К ардуино подцепил, работает прекрасно, но как всегда есть "но".
Код:
uint8_t buf[8] = { 0 }; // байт с информацией о «нажатой» клавише void setup() { Serial.begin(9600); // Устанавливаем скорость соединения pinMode(2, OUTPUT); // G pinMode(3, OUTPUT); // F pinMode(4, OUTPUT); // E pinMode(5, OUTPUT); // D pinMode(6, OUTPUT); // C pinMode(7, OUTPUT); // B pinMode(8, OUTPUT); // A pinMode(9, OUTPUT); // D4 pinMode(10, OUTPUT); // D3 pinMode(11, OUTPUT); // D2 pinMode(12, OUTPUT); // D1 // Так как модуль сегментных индикаторов имеет общий анод, то для того, чтобы // светился сегмент, вывод Arduino должно быть в высокоимпедансном состоянии // и наоборот // Выключаем все сегменты: digitalWrite(12, HIGH); digitalWrite(11, HIGH); digitalWrite(10, HIGH); digitalWrite(9, HIGH); delay(2000); // Пауза, чтобы «клавиатура» успела определиться в системе } void loop() { int dig1, dig2, dig3, dig4; // Цифры, которые будут последовательно вводиться int keys[10] = { 39, 30, 31, 32, 33, 34, 35, 36, 37, 38 }; // Массив с ASCII кодами цифер от 0 до 9 соответственно // Перебор с 0000 до 9999: for(dig1=0; dig1<10; dig1++) { for(dig2=0; dig2<10; dig2++) { for(dig3=0; dig3<10; dig3++) { for(dig4=0; dig4<10; dig4++) { pressKey(keys[dig1]); pressKey(keys[dig2]); pressKey(keys[dig3]); pressKey(keys[dig4]); pressKey(40); // Клавиша Enter // Текущий пароль будет отображаться в течение примерно 15-ти секунд (чуть больше времени задержки ввода) for(int i=0; i<1200; i++) { digLED(12, dig1); digLED(11, dig2); digLED(10, dig3); digLED(9, dig4); } } } } } } void pressKey(int dig) // Функция ввода { buf[2] = dig; Serial.write(buf, 8); // Нажать клавишу buf[0] = 0; buf[2] = 0; delay(20); Serial.write(buf, 8); // Отпустить клавишу delay(300); } // Возможно, существуют библиотеки для сегментных индикторов, но мне не захотелось с ними разбираться, // поэтому набросал свой алгоритм обхода сегментов индикатора void digLED(int pin, int dig) // Функция отображения цифер на индикаторе { digitalWrite(pin, LOW); switch(dig) { case 0: digitalWrite(8, LOW); digitalWrite(7, LOW); digitalWrite(6, LOW); digitalWrite(5, LOW); digitalWrite(4, LOW); digitalWrite(3, LOW); digitalWrite(2, HIGH); break; case 1: digitalWrite(8, HIGH); digitalWrite(7, LOW); digitalWrite(6, LOW); digitalWrite(5, HIGH); digitalWrite(4, HIGH); digitalWrite(3, HIGH); digitalWrite(2, HIGH); break; case 2: digitalWrite(8, LOW); digitalWrite(7, LOW); digitalWrite(6, HIGH); digitalWrite(5, LOW); digitalWrite(4, LOW); digitalWrite(3, HIGH); digitalWrite(2, LOW); break; case 3: digitalWrite(8, LOW); digitalWrite(7, LOW); digitalWrite(6, LOW); digitalWrite(5, LOW); digitalWrite(4, HIGH); digitalWrite(3, HIGH); digitalWrite(2, LOW); break; case 4: digitalWrite(8, HIGH); digitalWrite(7, LOW); digitalWrite(6, LOW); digitalWrite(5, HIGH); digitalWrite(4, HIGH); digitalWrite(3, LOW); digitalWrite(2, LOW); break; case 5: digitalWrite(8, LOW); digitalWrite(7, HIGH); digitalWrite(6, LOW); digitalWrite(5, LOW); digitalWrite(4, HIGH); digitalWrite(3, LOW); digitalWrite(2, LOW); break; case 6: digitalWrite(8, LOW); digitalWrite(7, HIGH); digitalWrite(6, LOW); digitalWrite(5, LOW); digitalWrite(4, LOW); digitalWrite(3, LOW); digitalWrite(2, LOW); break; case 7: digitalWrite(8, LOW); digitalWrite(7, LOW); digitalWrite(6, LOW); digitalWrite(5, HIGH); digitalWrite(4, HIGH); digitalWrite(3, HIGH); digitalWrite(2, HIGH); break; case 8: digitalWrite(8, LOW); digitalWrite(7, LOW); digitalWrite(6, LOW); digitalWrite(5, LOW); digitalWrite(4, LOW); digitalWrite(3, LOW); digitalWrite(2, LOW); break; case 9: digitalWrite(8, LOW); digitalWrite(7, LOW); digitalWrite(6, LOW); digitalWrite(5, LOW); digitalWrite(4, HIGH); digitalWrite(3, LOW); digitalWrite(2, LOW); break; } delay(3); digitalWrite(pin, HIGH); }
Индикатор с общим катодом (код под общий анод), соответственно поменял значения HIGH на LOW и наоборот. Подключил, и вместо ожидаемого результата (а должен он показывать значения начиная с 0000 до 9999) получилось так, что на всех сегментах загорается одинаковое число. Считалка идет так : 1111, 2222 и т.д. Потом снова по кругу. Код взят из статьи про брутфорс, индикатор там был модульный, с матричной разводкой и отдельным пином под питание. У меня же обычный 12-пиновый. Что нужно поменять в этом коде, чтобы все заработало так, как задумывалось?
Заранее огромное спасибо всем ответившим.
Что-то я не понял, Вы бы как-то понятнее объяснили. Он у Вас
работает прекрасно
или
Считалка идет так : 1111, 2222 и т.д. Потом снова по кругу.
Как-то одновременно эти два высказывания не могут быть истинными.
Так как?
Т.е. все сегменты горят. Выразился не так.
Ну, в общем, комментарием в строке 19 про "высокоимпедансное" состояние Вы изоядно повеселили. Постарайтесь не употреблять слов, значения которых не знаете.
А по сути, динамическая индикация делается не совсем так. Вернее, совсем не так.
Вот Вы можете объяснить словами что именно Вы делаете? Попробуйте описать. Просто словами.
Все дело в том, что код не мой. Взят из статьи на хабре. Сам в кодостроении профан. Если бы знал, как заставить эту схему "шуршать" как надо - думаю, сюда не обратился бы. Вкратце - контроллер сейчас эмулирует клавиатуру. Нужно сделать так, чтобы в момент ввода числа на компьютере, на индикаторе отображалось вводимое число. Т.е. как я понял нужно штудировать статьи про динамическую индикацию? Или есть какие-то готовые скетчи с таким принципом работы?
З.Ы. - Просто одни очень нехорошие люди залочили мак. Нужен для работы, поэтому пытаюсь вот таким вот образом осуществить перебор паролей. В сервис обращаться жаба душит, да и ближайший в 300 километрах от дома.
В общем, вот в этой теме, я другому новичку, наверное с пару недель рассказывал как работать с динамической индикацией. Сначала в простейшем случае. потом дошли до использования таймеров (с апрвилами их расчёта) и виртуальных экранов. Причём обсуждалась и схема и программа. Почитайте. Букв там много, но это полезно. Например, он там по ходу задавал вопросы. которые наверняка и у Вс возникнут. Думаю, прочитав ту тему, как-нибудь разберётесь.
Огромное Вам спасибо!
Добрый день, Евгений!
Читал я тему. Понял то, что ничего не понял. Видимо, для меня это темный лес. Скетч с "Велосипедом" под 4 разряда переделать только смог. Времени свободного как такового нет, да и домашний ноутбук в вечных разъездах. Если немного видоизменить код с велосипедом - заработает? И как это реализовать?
Так велосипед у Вас работает?
Там ведь есть функция putNumber, которая позволяет любое число выводить. Она там в строке 146 используется. Так что можете выводить числа, а не только педали крутить.
А в чём Вам нужна переделка?
Нужно, чтобы он выполнял те же функции, что и код в начале темы. Т.е. последовательно вводил числа от 0000 до 9999 с интервалом в 15 секунд и, соответственно, отображал вводимое число на индикаторе. Как я понял, в исходном коде за это отвечает часть:
Ну, так и делайте
Вроде, больше ничего не надо. Фунцкия putNumber определена в скетче велосипеда.
Здесь? Для вывода тысяч нужно что? Или можно её упростить?
И в каком месте кода её расположить? Будет ли 15-секундная задержка? Прошу прощения за такое количесвто вопросов.
Не, ну саму функцию-то не трогайте, она нормальная.
Вы мне не ответили на ворос, у Вас велосипед работает? Мне надо от чего-то отталкиваться.
Он (велосипед) вообще-то на трёхразрядный индикатор, а у Вас четырёхразрядный, Вы его уже переделали, он работает?
Велосипед работает на последних трех разрядах. На первом постоянно горит средний сегмент и мерцают верхний и нижний.
Евгений! Дико извиняюсь что отнял часть Вашего времени. Всё оказалось куда проще, чем казалось на первый взгляд. В коде, который я изначально скидывал, я допустил одну ошибку. А именно:
В этой части кода абсолютно все значения LOW и HIGH поменял на противоположные. Как теперь понял - не нужно было трогать digitalWrite (pin, LOW) и digitalWrite (pin, HIGH) в начале и в конце. В оригинальном коде значения стояли HIGH и LOW соответственно. Поменял - и все заработало. И все равно огромное Вам спасибо! Подогрели интерес к Arduino.)
Последний вопрос: Какие резисторы ставить на индикатор? Везде пишут по-разному. Где-то номиналом 100 Ом, где-то 1кОм, где-то только на пины разрядов, а где-то на все пины. Вы бы что посоветовали? Светодиоды на индикаторе красного цвета.
http://forum.cxem.net/index.php?/topic/41584-%D0%BE-%D1%81%D0%B2%D0%B5%D...
Но Вы не обльщайтесь. Работать это будет криво. Ни с того, ни с сего будет мерцать экран. Хотите нормально - делайте через таймеры, дожмите велосипед, например.
Про резисторы. Я что-то не помню Вашей схемы. Давайте схему - поговорим о резисторах.
Там есть два типа резисторов - персональные на каждый сегмент. И резисторы в базах транзисторов, которые стоят на цифрах (надеюь, у Вас стоят транзисторы на цифрах?) Вас какие резисторы иетерсуют? Ну, и схему давайте.
Сейчас счетчик до 100 прогнал - мерцаний пока не заметил. Схемы, в принципе нет. Сразу с выходов ардуино на индикатор. Думаю, за это меня отругают.)
P.S. - числа на индикаторе меняются так: 0000 => Гаснет => 0001 => Гаснет и т.д. По сути мне сейчас нужно ардуино не спалить и индикатор.
У вас самый большой минус программы. Ардуина работает только на индикатор. А вот если вы захотите сделать какое-то устройство, то будут траблы. Отображение должно быть или реализовано аппаратно, или программно в фоне. И повесте резисторы на a,b,c ...h - 100 ом -1к
Мне пока только это и нужно. Плюсом клавиатуру эмулирует, что как раз подходит для моей задачи.) Резисторы только на сегменты вешать? На разряды не нужны?
Что цифры (общие выводы) идут прямо на ноги ардуины?
Как, у Вас вообще никаких нет? Блин, стойкая Вам ардуина попадась. Другая бы давно сдохла.
Что делать я Вам сказал в прошлом посте.
Резисторы нашёл на 100 Ом и на 1 кОм. По десятку каждых набралось.
Написал тоже свою программу. Но у меня видно бракованый индикатор, пришлось ужать до одиночного. Он у меня оказался.
ПС: Может кому-то поможет.
А вот для одиночного