два 8-ми сегментных индикаторов
- Войдите на сайт для отправки комментариев
Втр, 29/03/2016 - 11:16
здравствуйте, не могу понять про индикаторы. вообщем нужно по нажатии кнопки прибавлять цифру на индикаторе с 01 до 02 и т.д. до 99
примерный скетч набрасал, но это тупо каждая цифра 01,02,03,04 и т.д. набирается путем отдельной функции "void"
как сделать проще?
void loop() { if (millis()>dlya_sekund + 150){ if (digitalRead(12) == 0){ dlya_sekund = millis(); schet = schet +1; if (schet > 12){ schet = 1; } } else if (digitalRead(11) == 0){ dlya_sekund = millis(); schet = schet -1; if (schet < 0){ schet = 12; } } } if (schet == 1){ A01(); } else if (schet == 2){ A02(); } else if (schet == 3){ A03(); } else if (schet == 4){ A04(); } else if (schet == 5){ A05(); } else if (schet == 6){ A06(); } else if (schet == 7){ A07(); } else if (schet == 8){ A08(); } else if (schet == 9){ A09(); } else if (schet == 10){ A10(); } else if (schet == 11){ A11(); } else if (schet == 12){ A12(); } } void A01() { PORTD=(a0);// пишем "0" в порт D DDRB=B1; // первая цифра delay(70); PORTD=(a1);// пишем "1" в порт B DDRB=B10; //вторая цифра delay(70); pusk(); } void A02() { delay(70); PORTD=(a0);// пишем "0" в порт D DDRB=B1; delay(70); PORTD=(a2);// пишем "2" в порт В DDRB=B10; pusk(); } void A03() { delay(70); PORTD=(a0);// пишем "0" в порт D DDRB=B1; delay(70); PORTD=(a3);// пишем "3" в порт B DDRB=B10; pusk(); } void A04() { delay(70); PORTD=(a0);// пишем "0" в порт D DDRB=B1; delay(70); PORTD=(a4);// пишем "4" в порт B DDRB=B10; pusk(); } void A05() { delay(70); PORTD=(a0);// пишем "0" в порт D DDRB=B1; delay(70); PORTD=(a5);// пишем "5" в порт B DDRB=B10; pusk(); } void A06() { delay(70); PORTD=(a0);// пишем "0" в порт D DDRB=B1; delay(70); PORTD=(a6);// пишем "6" в порт B DDRB=B10; pusk(); } void A07() { delay(70); PORTD=(a0);// пишем "0" в порт D DDRB=B1; delay(70); PORTD=(a7);// пишем "7" в порт B DDRB=B10; pusk(); } void A08() { delay(70); PORTD=(a0);// пишем "0" в порт D DDRB=B1; delay(70); PORTD=(a8);// пишем "8" в порт B DDRB=B10; pusk(); } void A09() { delay(70); PORTD=(a0);// пишем "0" в порт D DDRB=B1; delay(70); PORTD=(a9);// пишем "9" в порт B DDRB=B10; pusk(); } void A10() { delay(70); PORTD=(a1);// пишем "1" в порт D DDRB=B1; delay(70); PORTD=(a0);// пишем "0" в порт B DDRB=B10; pusk(); } void A11() { delay(70); PORTD=(a1);// пишем "1" в порт D DDRB=B1; delay(70); PORTD=(a1);// пишем "1" в порт B DDRB=B10; pusk(); } void A12() { delay(70); PORTD=(a1);// пишем "1" в порт D DDRB=B1; delay(70); PORTD=(a2);// пишем "2" в порт B DDRB=B10; pusk(); }
за название темы прошу прощения))) хотел написать одно а потом написал другое))) и не склонил последнее слово)
Ну, что Вам сказать, скетч Вы привели неполный. Индикаторы подключены непонятно как (либо целиком к порту D, либо через дешифратор, хрен Вас разберёт). Что за задержки в 70мс можно только догадываться.
В общем, хотите нормального разговора, давайте. полный скетч, схему подключения и пояснения, что Вы хотите сделать.
и не пойму почему выход с 10 пина всего лишь 0.05мА? когда на остальных 250мА?
http://arduino.ru/forum/programmirovanie/semisegmentnyi-dvukhrazryadnyi-...
и не пойму почему выход с 10 пина всего лишь 0.05мА? когда на остальных 250мА?
Да, Вы как-то странно ток измеряете. Амперметр встраивается в цепь последовательно, а Вы как его к 6-му пину присобачили? Вы просто закоротили пин на землю и что-то там измеряете.
Значит, начнём с того, что эту схему выбрасываем.
Нагрузка на 8-ой и 9-пины здесь у Вас будет доходить до 160 ма, при предельно допустимой - 40.
В цепи пинов 0-7 необходимо вставлять токоограничивающие резисторы (в каждую свой), чтобы ток не превышал 20мА на каждом пине. Какие резисторы - зависит от Вашего семисегментника (какого цвета и т.п.). Если красный - я бы начал со 150 ом, а там померял бы ток и подобрал бы поточнее.
Программу тоже выбрасываем.
Вы не ответили, что у Вас делают 70мс задержки во всех функциях? Полагаю, чтобы успеть полюбоваться на светящуюся цифру? Это очень большие задержки, дисплей будет замето на глаз переключаться. Да и нужны они только когда цифра светится, а не когда погашена.
Запомните, задержка переключения цифр в семисегментике равна 20/<количество разрядов>, т.е. у Вас она равна 10мс. Кроме того, задержка здесь делается не делэями, я таймером иначе экран по-любому будет дёргаться, т.к. задержка у Вас будет зависеть от скорости loop.
Но, всё сразу - слишком много, давайте со схемы начнём. нарисуйте нормальную схему, а потом можно будет и о программе поговорить.
Кстати, что у Вас там на 10 пине? Светодиод? Тоже токоограничивающий резистор вставляйте.
спасибо большое!
Кстати, кнопки на пинах А1 и 12 притянуты к питанию, а на пине 11 почему-то нет. За что её так обидели? Притягивать надо все.
В принципе резисторы у кнопок можно и выкинуть, а пользоваться встроенными в контроллер. Для этого вместо INPUT соответсвующему пину надо говорить INPUT_PULLUP
на 10-ом светодиод, не светится... задержку 70 ставлю пока в протеусе гоняю, когда буду ставить на макетке, сделаю и резисторы и задержку меньше. но конечно думал вообще от нее избавиться - это не проблемма. без delay а с millis(). все будет работать, нашел библиотеку #include <SevSeg.h> не совсем могу разобраться с ней. в общем передумал такую большую программу строить строил для того что бы понять как все работает. с библиотекой все конечно проще. но где интерес. на счет библиотеки знаете что нибудь?
это из стандартного скетча. доделал только что бы на кнопку менялось число по возрастанию. не могу понять вот что, сегменты в первой цифре горят а во второй именно эти сегменты не светятся. т.е.
вот так выглядит цифра "8"
а вот так цифра "18"
может это просто глюк протеуса?
Нет, там надо не с миллис, а именно с таймером - так точнее и точно не будет дёргаться.
Библиотекой никогда не интересовался - это настолько простая операция. что тянуть сюда ещё чужие ошибки совсем не хочется - мне своих хватает.
Про цифру, думаю замените в 66 строке 1 на 2 и всё образуется, но, повторяю, библиотеку никогда не смотрел и смотреть не имею желания.
Это очень простая программа, давайте её напишем, только по-возможности не с протеусом с номальным живым железом. Вы нарисовали нормальную схему?
в 66 строке меняю- ничего не происходит. железа нормального нет пока. завтра будет, пойду куплю.
переписал немного код. но delay еще оставил
а на счет таймеров. я не могу понять... я пробовал понять - почитать, но без успеха... нудно как то)) можете сказать в чем смысл таймера? и когда он лучше? и чем.
Где резисторы в цепях пинов с 0 по 7? В каждой цепи должен быть свой резистор.
Зачем резисторы R4-R7? Они не нужны. Там транзисторы надо ставить. Иначе у Вас через эти два пина ток пойдёт в 4 раза больше предельно допустимого.
"Живого индикатора" у Вас пока нет или уже есть? Если есть, кто какой? Они бывают с общим анодом (ОА) и общим катодом (ОК). Пока не знаем какой у Вас, не понимаем как ставить транзисторы. ОА не лучше и не хуже, чем ОК, но схема делается по-разному.
а на счет таймеров. я не могу понять... я пробовал понять - почитать, но без успеха... нудно как то)) можете сказать в чем смысл таймера? и когда он лучше? и чем.
заводишь таймер, чтобы он тикал например, каждый 10мс. И он тикает именно каждые 10мс и ему глубоко плевать что у Вас делается в программе, какие там делэи и сколько времени занимает счёт - его дело тикать, он и тикает.
Т.е. с таймером мы гарантируем срабатывание через равные, правильные промежутки независимо от того, что делается в остальное программе.
Если же делать с миллис, то ничего этого не гарантируется, т.к. реально всё зависит от скорости выполнения loop. Если loop выполняется очень быстро, то с миллис можно сделать приемлемо, но если loop чуть тормознёт - всё поплывёт.
про индикаторы уже знаю, но планирую с обшим катодом. на схеме с общим катодом. покупать буду. пока определяюсь с элементами.
R4-R5 токоограничивающие,зачем на все пины ставить с 0 по 7 ставить. когда можно на 2 поставить? не упрек, просто думал так тоже нормально будет. просто из электротехники знаю, если через нагрузку идет ток, то не важно перед нагрузкой или после ставить резистор для уменьшения потребления нагрузки
R6-R7 думал для более четкого плюса на катоде. поэтому 470кОм думаю не помешают, а помехи уберут. в реальной схеме стять не будут. а вот в протеусе просто индикаторы "идиальные" и у них нет сопротивления. т.е. диоды без потребления. если поставить в разрыв с катодом "МИКРО"амперметр, то он даже показывает 000.
заводишь таймер, чтобы он тикал например, каждый 10мс. И он тикает именно каждые 10мс и ему глубоко плевать что у Вас делается в программе, какие там делэи и сколько времени занимает счёт - его дело тикать, он и тикает.
Т.е. с таймером мы гарантируем срабатывание через равные, правильные промежутки независимо от того, что делается в остальное программе.
Если же делать с миллис, то ничего этого не гарантируется, т.к. реально всё зависит от скорости выполнения loop. Если loop выполняется очень быстро, то с миллис можно сделать приемлемо, но если loop чуть тормознёт - всё поплывёт.
ааааа, крутая штука. т.е. светодиоды будут более равномерно переключаться. крутяк) а есть какой нибудь готовый шаблон, что бы на нем потренироваться?
R4-R5 токоограничивающие,зачем на все пины ставить с 0 по 7 ставить. когда можно на 2 поставить? не упрек, просто думал так тоже нормально будет. просто из электротехники знаю, если через нагрузку идет ток, то не важно перед нагрузкой или после ставить резистор для уменьшения потребления нагрузки
Так нельзя. Вот смотрите, какой именно ток они должны ограничивать? Очевидно, что ток всех сегментов (т.е. цифра 8 и точка). Нормальный ток светодиода - 20мА, стало быть, здесь Вам надо иметь ограничение 8х20 = 160мА. Отлично. Теперь представим себе, что у нас там цифра 1 без точки, т.е. горят 2 светодиода. А ток мы ограничиваем на 160мА. Стало быть эти два диода сожрут не по 20, как им положено, а по 80! Может быть сгорят, а может и нет, но если и не сгорят, то во-первых будут меньше служить, а во-вторых, цифра 1 будет светиться существенно ярче, чем 8-ка (т.к. там каждому меньше тока досталось). Понимаете?
Не нужны они там. Там нужен нормальный транзистор. Если у Вас общий катод, то транзистор (NPN) ставится так:
От пина ардуино через токоограничивающий резистор R1, подаём сигнал на базу. Отдельно от базы стоит поставить резистор R2 = примерно 10хR1 на GND. Эмиттер транзистора - на GND. Коллектор - на пин цифры индикатора. Никакого токоограничивающего резистора в цепи коллектора не надо, т.к. ток в этой цепи уже ограничен резисторами, который Вы поставите в цепь 0-7 пинов.
----------
Теперь скажите, а какая у Вас ардуина (uno, mega, nano)? Это важно.
а есть какой нибудь готовый шаблон, что бы на нем потренироваться?
там ровно три строки кода. Доберёмся. Давайте со схемой разгребём.
Скачайте книгу https://dl.dropboxusercontent.com/u/32245429/arduinoBasicConnections.pdf
Там на странице 9 есть схема подключения семисегментника (правда четырёхразрядного). Там, правда, лбщий анод, но разниуа только в том, как транзисторы соединять. Как надо для общего катода я Вам написал. Ещё там нет резисторов от базы к земле. Можно и без них, но очень рекомvендую. Это как раз защита от ЭМИ. У меня внук недавно собрал по той схеме (без резисторов), а потом прибежал ко мне: "дед, а чё у меня цифры на экране дёргаются, когда я настольную лампу включаю?" :)
Не нужны они там. Там нужен нормальный транзистор. Если у Вас общий катод, то транзистор (NPN) ставится так:
От пина ардуино через токоограничивающий резистор R1, подаём сигнал на базу. Отдельно от базы стоит поставить резистор R2 = примерно 10хR1 на GND. Эмиттер транзистора - на GND. Коллектор - на пин цифры индикатора. Никакого токоограничивающего резистора в цепи коллектора не надо, т.к. ток в этой цепи уже ограничен резисторами, который Вы поставите в цепь 0-7 пинов.
так транзисторы все таки надо ставить на эмиторы светодиодов? т.е. 8шт.?
Теперь скажите, а какая у Вас ардуина (uno, mega, nano)? Это важно.
Nano
Скачайте книгу https://dl.dropboxusercontent.com/u/32245429/arduinoBasicConnections.pdf
Там на странице 9 есть схема подключения семисегментника (правда четырёхразрядного). Там, правда, лбщий анод, но разниуа только в том, как транзисторы соединять. Как надо для общего катода я Вам написал. Ещё там нет резисторов от базы к земле. Можно и без них, но очень рекомvендую. Это как раз защита от ЭМИ. У меня внук недавно собрал по той схеме (без резисторов), а потом прибежал ко мне: "дед, а чё у меня цифры на экране дёргаются, когда я настольную лампу включаю?" :)
скачал книгу и понял)))
так транзисторы все таки надо ставить на эмиторы светодиодов? т.е. 8шт.?
Тогда я бы не стал использовать порт D целиком для подключения сегментов, т.к. 0 и 1 биты этого порта - это Rx и Tx соответсвенно. Формально их можно как-то использовать, но лучше не надо. CH340 может такого не пережить.
так?
Тогда я бы не стал использовать порт D целиком для подключения сегментов, т.к. 0 и 1 биты этого порта - это Rx и Tx соответсвенно. Формально их можно как-то использовать, но лучше не надо. CH340 может такого не пережить.
эх... тогда всю программу перепысывать))) CH340 мне и не нужен будет потом))) один раз залью, и будет агрегат работать) но для надежности конечно я бы переделал. т.е. я все кнопки перенесу на аналоговые входы. и у меня как раз освободятся 11 и 12. перенесу 10-й т.е. что бы на цифры шли с 2 по 12, а по коду то что?) и значально был вопрос как упростить код. или мы к этому перейдем еще?)
Нет. Вы эмиттер с коллектором, похоже, перепутали. Стрелочку у транзистора видите? Это эмиттер. Так вот теперь проведите пальцем по схеме от + к GND. (В данном случае, это от 0-7 пина ардуины, через экран и транзистор, к Gnd). Видите, у Вас ток против стрелки пошёл? Подключать надо наоборот эмиттером (со стрелкой) к земле, а коллектором к экрану. (А если бы был общий анод, то коллектором к питанию, а эмиттером к экрану - как в той книге, что я Вам дал). Тогда при прохождении от + к - ток будет идти по стрелке.
прошу прощения, вот так?
эх... тогда всю программу перепысывать)))
А её и так переписывать. И короче она станет раз в пять. дожмём схему, потом займёмся программой
симулятор включаю - вообще ничего не работает))) показывает 00
прошу прощения, вот так?
Примерно так. От R1-R3 можно избавиться, если в программе INPUT на INPUT_PULLUP заменить.
R4-R11 лучше подобрать на железе поточнее.
R12-R13 зависят от используемых транзисторов. Вы какие собираетесь ставить? Если собираетесь только покупать, то у Вас полная свобода - подойдёт любой NPN транзистор с током коллектора от 200mA. Например, копеечные 2N2222 - только в путь. Как выберете тип транзистора, прикинем какие там резисторы нужны.
симулятор включаю - вообще ничего не работает))) показывает 00
Мы ещё до программы не добрались. Вы торопитесь.
Сейчас я исчезаю. Появлюсь часов около восьми вечера.
в конечном итоге схема будет выглядеть так
и сразу забегу вперед, вместо светодиода D1 будет стоять схема управления нагрузкой 220В, как еще она будет реализована - я не знаю
вверх
Мы ещё до программы не добрались. Вы торопитесь.
Сейчас я исчезаю. Появлюсь часов около восьми вечера.
Что то вы пропали..
Простите, дейстаительно пропал. Вот вернулся.
У Вас эта схема собрана?
Теперь давайте сделаем программу, которая просто засветит одну цифру. Пока не будем париться про универсальность.
Для того, чтобы засветить одну цифру, надо:
1. подать HIGH на пин 10 (первая цифра) или 11 (вторая цифра).
2. подать HIGH на те пины из 0-7, которые отвечают за сегменты, которые должны светиться. Например, если подать HIGH на все сразу, то это будет восьмёрка с точкой.
Сделайет пока функцию, которая зажигает одну цифру (любую конкретную, мы следующим шпгом присаобачим универсальность).
Простите, дейстаительно пропал. Вот вернулся.
У Вас эта схема собрана?
Теперь давайте сделаем программу, которая просто засветит одну цифру. Пока не будем париться про универсальность.
Для того, чтобы засветить одну цифру, надо:
1. подать HIGH на пин 10 (первая цифра) или 11 (вторая цифра).
2. подать HIGH на те пины из 0-7, которые отвечают за сегменты, которые должны светиться. Например, если подать HIGH на все сразу, то это будет восьмёрка с точкой.
Сделайет пока функцию, которая зажигает одну цифру (любую конкретную, мы следующим шпгом присаобачим универсальность).
схема только в протеусе собрана. она тоже хорошо тестируется. пока не определился с управление мощностью, поэтому не собираю схему. тестирую в протеусе. потом на печатную плату перевожу сразу. если все токи устраивают.
Примерно так. От R1-R3 можно избавиться, если в программе INPUT на INPUT_PULLUP заменить.
R4-R11 лучше подобрать на железе поточнее.
R12-R13 зависят от используемых транзисторов. Вы какие собираетесь ставить? Если собираетесь только покупать, то у Вас полная свобода - подойдёт любой NPN транзистор с током коллектора от 200mA. Например, копеечные 2N2222 - только в путь. Как выберете тип транзистора, прикинем какие там резисторы нужны.
этот пост почему-то не видел.... транзисторы 2n3904 есть в наличии
светятся сразу 2 цифры. на оба катода почему-то приходит по (-) хотя посылаю на 10 pin -HIGH
Во-первых, явно сконфигурите пины на OUTPUT.
Во-вторых, если это можно в протеусе, не могли бы Вы писать не через порты, а через пины (потом поменяем, но пока отлаживаемся, так виднее, а то я на вскидку номера портов не помню и приходится смотреть). Давайте, перепишем, попробуем и выложим скетч
немного разобрался. но до конца не понял. переделал скетч
на контроллере если замкнуть на землю ногу и померить ток, то получаеться 0.25А, в предыдущей версии скетча почему-то было 0.05мА.
вот почему? потому что надо как-то объявить пины выходом? если да то как их группой объявить?
и переделал схему, на эмитор подал плюс вместо минуса. все заработало, загорелась одна цифра
этот пост почему-то не видел.... транзисторы 2n3904 есть в наличии
Ага, коффициент усиления очень низкий (от 30).
Светодиоды какого цвета (на экранчике)? Да, впрочем, ладно R12-R13 ставьте на 68 ом, если нет, то можно даже 62 - не умрёт, но меньше уже не стоит.
вот почему? потому что надо как-то объявить пины выходом? если да то как их группой объявить?
Про группы, давайте вернёмся, кргда всё заработает. Несложно, но вот когда всё будет работать - сделаем группами.
и переделал схему, на эмитор подал плюс вместо минуса. все заработало, загорелась одна цифра
Как хотите, можно и так. Я бы переделал программу, а не схему. Смотрите в чём разница.
Сейчас для того, чтобы зажечь цифру, Вам надо подать на пин базы тразнизстора LOW. А чтобы погасить - HIGH При включении МК (пока Ваша программа не успела туда ничего подать) там быдет LOW, и и цифра может мигнуть/дёрнуться.
А если Вы сделаете, как было раньше, то чтобы зажечь, подавать надо HIGH, а погасить - LOW. Поэспериментируйте и определитесь как Вы будете делать.
Как только убедитесь, что Вы можете уверено зажечь и погасить нужную цифру, перейдём с ледующему шагу - универсальной функции для любой цифры.
при подключении эмитора на минус у меня в коде было прописанно что 10 в HIGH а 11 в LOW но почему-то все равно горели 2 цифры... подключил эмитор на плюс и все заработало. вообщем передумал я немного, транзисторы буду ставить pnp т.к. с общим анодом буду применять индикатор и он будет 3-ех сегментный. вместо кнопок поставлю энкодер. т.к. буду регулировать сварочный импульс от 0.01 секунды. для споттера очень важно. думаю 0.1 будет много. на кузове остаються точки прожженые. а этого мне не нужно. но это уже другая тема. транзисторы 2n5551. но суть схемы понял. и еще рассчитать резисторы для индикатора как? потому что даташида не нашел на него.сколько вольт и ампер каждый сегмент сможет выдержить продолжительное время
Извините, что вмешиваюсь в ваш диалог. d13lider, вы как будете это собирать - делать печатную плату или навесным монтажом?
Извините, что вмешиваюсь в ваш диалог. d13lider, вы как будете это собирать - делать печатную плату или навесным монтажом?
Сразу на печатку
Извините, что вмешиваюсь в ваш диалог. d13lider, вы как будете это собирать - делать печатную плату или навесным монтажом?
До этого делал проект на автозапуск авто по Gsm все заработало, тоже разработал все в протеусе почти, кроме команд gsm модуля.
Тогда подумайте о том, чтобы используемые пины назначать не явно (2, 3, 4...), а через #define. Например,
Будете разводить плату, поймете почему.