Помогите с семи-сегментным четырёх-разрядным индикатором
- Войдите на сайт для отправки комментариев
Чт, 25/01/2018 - 16:40
Вообщем идея такая: Ардуино считывает с датчика температуру и разбивает на десятки и единицы. Потом выводит на дисплей.
А проблема такая: Выводить выводит, НО число градусов мигают, а значок градуса не мигает. Надо чтобы вообще ничего не мигало!!!
Помогите пожалуйста!!!
Ниже код скетча.
#include "DHT.h" #define DHTPIN 2 // вывод, к которому подключается датчик #define DHTTYPE DHT22 // DHT 22 (AM2302) byte oc; byte tc; int t = 0; int an1 = 51; int an2 = 50; int an3 = 52; int an4 = 53; int is1 = 34; int is2 = 32; int is4 = 30; int is5 = 28; int is7 = 26; int is10 = 24; int is11 = 22; DHT dht(DHTPIN, DHTTYPE); void setup() { pinMode(an1, OUTPUT); pinMode(an2, OUTPUT); pinMode(an3, OUTPUT); pinMode(an4, OUTPUT); pinMode(is1, OUTPUT); pinMode(is2, OUTPUT); pinMode(is4, OUTPUT); pinMode(is5, OUTPUT); pinMode(is7, OUTPUT); pinMode(is10, OUTPUT); pinMode(is11, OUTPUT); dht.begin(); } void loop() { int t = dht.readTemperature(); byte oc = t / 10; byte tc = t % 10; if(oc == 0){ digitalWrite(an1, LOW); digitalWrite(an2, HIGH); digitalWrite(an3, LOW); digitalWrite(an4, LOW); digitalWrite(is1, LOW); digitalWrite(is2, LOW); digitalWrite(is4, LOW); digitalWrite(is5, HIGH); digitalWrite(is7, LOW); digitalWrite(is10, LOW); digitalWrite(is11, LOW); delay(15); } if(oc == 1){ digitalWrite(an1, LOW); digitalWrite(an2, HIGH); digitalWrite(an3, LOW); digitalWrite(an4, LOW); digitalWrite(is1, HIGH); digitalWrite(is2, HIGH); digitalWrite(is4, LOW); digitalWrite(is5, HIGH); digitalWrite(is7, LOW); digitalWrite(is10, HIGH); digitalWrite(is11, HIGH); delay(15); } if(oc == 2){ digitalWrite(an1, LOW); digitalWrite(an2, HIGH); digitalWrite(an3, LOW); digitalWrite(an4, LOW); digitalWrite(is11, LOW); digitalWrite(is7, LOW); digitalWrite(is5, LOW); digitalWrite(is1, LOW); digitalWrite(is2, LOW); digitalWrite(is10, HIGH); digitalWrite(is4, HIGH); delay(15); } if(oc == 3){ digitalWrite(an1, LOW); digitalWrite(an2, HIGH); digitalWrite(an3, LOW); digitalWrite(an4, LOW); digitalWrite(is1, HIGH); digitalWrite(is2, LOW); digitalWrite(is4, LOW); digitalWrite(is5, LOW); digitalWrite(is7, LOW); digitalWrite(is10, HIGH); digitalWrite(is11, LOW); delay(15); } if(oc == 4){ digitalWrite(an1, LOW); digitalWrite(an2, HIGH); digitalWrite(an3, LOW); digitalWrite(an4, LOW); digitalWrite(is1, HIGH); digitalWrite(is2, HIGH); digitalWrite(is4, LOW); digitalWrite(is5, LOW); digitalWrite(is7, LOW); digitalWrite(is10, LOW); digitalWrite(is11, HIGH); delay(15); } if(tc == 0){ digitalWrite(an1, LOW); digitalWrite(an2, LOW); digitalWrite(an3, HIGH); digitalWrite(an4, LOW); digitalWrite(is1, LOW); digitalWrite(is2, LOW); digitalWrite(is4, LOW); digitalWrite(is5, HIGH); digitalWrite(is7, LOW); digitalWrite(is10, LOW); digitalWrite(is11, LOW); delay(15); } if(tc == 1){ digitalWrite(an1, LOW); digitalWrite(an2, LOW); digitalWrite(an3, HIGH); digitalWrite(an4, LOW); digitalWrite(is1, HIGH); digitalWrite(is2, HIGH); digitalWrite(is4, LOW); digitalWrite(is5, HIGH); digitalWrite(is7, LOW); digitalWrite(is10, HIGH); digitalWrite(is11, HIGH); delay(15); } if(tc == 2){ digitalWrite(an1, LOW); digitalWrite(an2, LOW); digitalWrite(an3, HIGH); digitalWrite(an4, LOW); digitalWrite(is11, LOW); digitalWrite(is7, LOW); digitalWrite(is5, LOW); digitalWrite(is1, LOW); digitalWrite(is2, LOW); digitalWrite(is10, HIGH); digitalWrite(is4, HIGH); delay(15); } if(tc == 3){ digitalWrite(an1, LOW); digitalWrite(an2, LOW); digitalWrite(an3, HIGH); digitalWrite(an4, LOW); digitalWrite(is1, HIGH); digitalWrite(is2, LOW); digitalWrite(is4, LOW); digitalWrite(is5, LOW); digitalWrite(is7, LOW); digitalWrite(is10, HIGH); digitalWrite(is11, LOW); delay(15); } if(tc == 4){ digitalWrite(an1, LOW); digitalWrite(an2, LOW); digitalWrite(an3, HIGH); digitalWrite(an4, LOW); digitalWrite(is1, HIGH); digitalWrite(is2, HIGH); digitalWrite(is4, LOW); digitalWrite(is5, LOW); digitalWrite(is7, LOW); digitalWrite(is10, LOW); digitalWrite(is11, HIGH); delay(15); } if(tc == 5){ digitalWrite(an1, LOW); digitalWrite(an2, LOW); digitalWrite(an3, HIGH); digitalWrite(an4, LOW); digitalWrite(is1, HIGH); digitalWrite(is2, LOW); digitalWrite(is4, LOW); digitalWrite(is5, LOW); digitalWrite(is7, HIGH); digitalWrite(is10, LOW); digitalWrite(is11, LOW); delay(15); } if(tc == 6){ digitalWrite(an1, LOW); digitalWrite(an2, LOW); digitalWrite(an3, HIGH); digitalWrite(an4, LOW); digitalWrite(is1, LOW); digitalWrite(is2, LOW); digitalWrite(is4, LOW); digitalWrite(is5, LOW); digitalWrite(is7, HIGH); digitalWrite(is10, LOW); digitalWrite(is11, LOW); delay(15); } if(tc == 7){ digitalWrite(an1, LOW); digitalWrite(an2, LOW); digitalWrite(an3, HIGH); digitalWrite(an4, LOW); digitalWrite(is1, HIGH); digitalWrite(is2, HIGH); digitalWrite(is4, LOW); digitalWrite(is5, HIGH); digitalWrite(is7, LOW); digitalWrite(is10, HIGH); digitalWrite(is11, LOW); delay(15); } if(tc == 8){ digitalWrite(an1, LOW); digitalWrite(an2, HIGH); digitalWrite(an3, LOW); digitalWrite(an4, LOW); digitalWrite(is11, LOW); digitalWrite(is7, LOW); digitalWrite(is5, LOW); digitalWrite(is1, LOW); digitalWrite(is2, LOW); digitalWrite(is10, LOW); digitalWrite(is4, LOW); delay(15); } if(tc == 9){ digitalWrite(an1, LOW); digitalWrite(an2, LOW); digitalWrite(an3, HIGH); digitalWrite(an4, LOW); digitalWrite(is11, LOW); digitalWrite(is7, LOW); digitalWrite(is5, LOW); digitalWrite(is1, HIGH); digitalWrite(is2, LOW); digitalWrite(is10, LOW); digitalWrite(is4, LOW); delay(15); } digitalWrite(an1, LOW); digitalWrite(an2, LOW); digitalWrite(an3, LOW); digitalWrite(an4, HIGH); digitalWrite(is11, LOW); digitalWrite(is7, LOW); digitalWrite(is5, LOW); digitalWrite(is1, HIGH); digitalWrite(is2, HIGH); digitalWrite(is10, LOW); digitalWrite(is4, HIGH); delay(15); }
категорически не использовать Delay,
не считывать так часто температуру - зачем? обновлять информацию по таймеру millis - сохранять значения в некий буфер, и из него уже выводить в каждом цикле loop,
если этого не хватит - все равно будет моргать - избавляться от digitalWrite - переходить на прямой вывод в порты МК
откуда вы взяли этот код, можно узнать? Мне интересно, откуда данные, что выводить цифры нужно именно так? Сами вряд ли догадались бы.... О процедурах и циклах ничего не слышали?
Что за индикатор, как он устроен? На сдвиговых регистрах?
откуда вы взяли этот код, можно узнать? Мне интересно, откуда данные, что выводить цифры нужно именно так? Сами вряд ли догадались бы.... О процедурах и циклах ничего не слышали?
Что за индикатор, как он устроен? На сдвиговых регистрах?
явно не сдвиговый - слишком много ног используется
Можете объясниь по подробнее. Я новичок в ардуине))
Писал сам. До-лго и тер-пе-ли-во! :)
явно не сдвиговый - слишком много ног используется
Да, уже по коду разобрался - динамика. Ноги an1-an4 управляют включением каждого знакоместа, ноги is - отдельные сегменты.
Автор. знак градуса у вас тоже мигает. Просто на фоне цифр это незаметно, потому что вы выодите знак градуса вдвое чаще, чем цифры.
Чтобы ничего не мигало - поменяйте все delay(15) на delay(5), к примеру. Только не читайте так часто температуру , читайте дачтчик раз в минуту.
Это 5462bs.
Пинов 12
-Это моя чуда-юда! )))
Если поменять на 5 миллисекунд, то цифры вообще не загораются. Еле заметно!
Сейчас только заметил, что если включать значок сначала, то еденицы показывает норально, НО значок градуса стаёт мигать!
явно не сдвиговый - слишком много ног используется
Да, уже по коду разобрался - динамика. Ноги an1-an4 управляют включением каждого знакоместа, ноги is - отдельные сегменты.
Автор. знак градуса у вас тоже мигает. Просто на фоне цифр это незаметно, потому что вы выодите знак градуса вдвое чаще, чем цифры.
Чтобы ничего не мигало - поменяйте все delay(15) на delay(5), к примеру. Только не читайте так часто температуру , читайте дачтчик раз в минуту.
Я и так знаю что мигает, НО это не заметно!
Можете объясниь по подробнее. Я новичок в ардуине))
много объяснять :(
не с того начали, учитесь постепенно, например так:
1. сделайте пока получение температуры например каждые 5 минут через таймер millis и вывод ее в терминал
2. меняете вывод в терминал на разбиение на отдельные цифры и сохранение в некий буфер
3. пишите отдельную функцию например на входе номер разряда индикатора и цифру/знак
4. внутри цикла loop делаете цикл по разрядам с 1 по 4ый, внутри цикла соответственно из буфера отображаем на нужном разряде нужный знак
5. в принципе все - проект готов
вот вам пример, но вряд ли он поможет, у меня сдвиговый регистр - немного логика отличается,
да и иногда проще с нуля написать чем выковыривать из чужого проекта
Если поменять на 5 миллисекунд, то цифры вообще не загораются. Еле заметно!
Я понял в чем дело.
Вы зажигаете первый раз ряд на 15мс, потом зажигаете второй тоже на 15мс (первый при этом гаснет), потом зажигаете знак градуса (цифры погасли) . На этом цикл заканчивается и вы идете считывать температуру. Дело это не быстрое, скажем миллисекунд 500. Все это время цифры у вас выключены, а знак градуса - горит. Потом все сначала.
В итоге каждая цифра у вас загорается на 15мс раз в полсекунды. а все остальное время горит знак градуса.
Вам надо переделать чтнеие температуры с датчика на неблокирующий вызов - чтобы программа не ждала полсекунды. Возможно, придется писать чтение температуры вручную, без библиотек.
Если поменять на 5 миллисекунд, то цифры вообще не загораются. Еле заметно!
Я понял в чем дело.
Вы зажигаете первый раз ряд на 15мс, потом зажигаете второй тоже на 15мс (первый при этом гаснет), потом зажигаете знак градуса (цифры погасли) . На этом цикл заканчивается и вы идете считывать температуру. Дело это не быстрое, скажем миллисекунд 500. Все это время цифры у вас выключены, а знак градуса - горит. Потом все сначала.
В итоге каждая цифра у вас загорается на 15мс раз в полсекунды. а все остальное время горит знак градуса.
Вам надо переделать чтнеие температуры с датчика на неблокирующий вызов - чтобы программа не ждала полсекунды. Возможно, придется писать чтение температуры вручную, без библиотек.
А если прерывания использовать!
что вы собрались прерывать?
ТС - вот почитайте
http://codius.ru/articles/Arduino_UNO_4%D1%80%D0%B0%D0%B7%D1%80%D1%8F%D0%B4%D0%BD%D1%8B%D0%B9_7%D1%81%D0%B5%D0%B3%D0%BC%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%B8%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_12_pin_3641BS_red
я неделю назад, пока еще был один 4х разрядный индикатор начинал изучать именно с этого примера и спокойно вывел все данные на индикатор без миганий и прочего...
и код в разы короче
при этом он в примере далек от идеала и на деле очень просто еще сокращается и оптимизируется
ELITE. ну вы хоть со своими "познаниями" не лезьте! Не путайте человека, ему эта статья не нужна, у него нет проблем с выводом цифр на индикатор. Его проблема - создание скетча, который разом делает более одной задачи. Если б вы по этой статье писали его скетч - у вас бы тоже все мигало.
b707 я по ней и писал - ничего не мигало даже при 100 одновлениях экрана в секунду (собственно оно и задано было delay(1); ... которую я просто убюрал и всё отлично работало не мигая
при этом я тогда еще кромеdelay(1); и не знал ничего - поэтому первую кнопку на нем делал - и тоже ничего не мигало....
хоть я и новичек - но даже так явно видно - что проблема с выводе на экран изза кучи делаев, а не изза нехватки скорости выполнять более 1 действия
b707 я по ней и писал - ничего не мигало даже при 100 одновлениях экрана в секунду (собственно оно и задано было delay(1); ... которую я просто убюрал и всё отлично работало не мигая
добавьте в тот ваш код чтение температуры с датчика - замигает
хоть я и новичек - но даже так явно видно - что проблема с выводе на экран изза кучи делаев, а не изза нехватки скорости выполнять более 1 действия
а вот и нет. В данном случае делаи не являются причиной проблем, хотя. конечно, при переписывании кода их нужно убрать.
читаю пример, и нифига не могу понять зачем в процедуре
void displayMessage(int dig[4][8]) {
после зажигания сегмента, тут же через миллисекунду его гасить?
он же (сегмент) все равно погаснет если цифра/символ на индикаторе другая будет,
а если та - же - он (сегмент) будет просто гореть.
читаю пример, и нифига не могу понять зачем в процедуре
void displayMessage(int dig[4][8]) {
после зажигания сегмента, тут же через миллисекунду его гасить?
он же (сегмент) все равно погаснет если цифра/символ на индикаторе другая будет,
а если та - же - он (сегмент) будет просто гореть.
Не смотрел пример, но могу предположить, что зажигаются и гасятся сегменты/цифры так для того, чтобы визуально все это хозяйство имело одинаковую яркость - на свечение каждого отводится одинаковое время, значит и общая яркость у них не будет вразнобой.
читаю пример, и нифига не могу понять зачем в процедуре
void displayMessage(int dig[4][8]) {
после зажигания сегмента, тут же через миллисекунду его гасить?
он же (сегмент) все равно погаснет если цифра/символ на индикаторе другая будет,
а если та - же - он (сегмент) будет просто гореть.
Не смотрел пример, но могу предположить, что зажигаются и гасятся сегменты/цифры так для того, чтобы визуально все это хозяйство имело одинаковую яркость - на свечение каждого отводится одинаковое время, значит и общая яркость у них не будет вразнобой.
мысль хорошая, но сделана тогда криво, т.к. равномерно надо гасить/выравнивать целиком индикаторы а не сегменты, и я делал аналогично - но там задежки микросекундами меряется а не миллисекундами.
да вообще на прямую цеплять к ардуине индикатор - это дикое раточительство выходов ....
давно копеешные индикаторы с драйвером продают - 3-4 провода управления на всё
да вообще на прямую цеплять к ардуине индикатор - это дикое раточительство выходов ....
давно копеешные индикаторы с драйвером продают - 3-4 провода управления на всё
почему нет - если Мега да еще с одним действием - для тренировки самое то
Есть ряд проектов на индикаторах.
У тебя большие задержки 15 мс. Расчет простой, берем 25 кадров в секунду, разбиваем на 3 индикатора в динамической индикации, получаем 1000мс/75= 13 мс, у тебя 15 мс delay(15)
Реально на практике 25 кадров в секунду все равно видна пульсация, надо брать 50 - 100 кадров в секунду. Если нужно поищу свой код, с регулировкой яркости.
По поводу уменьшения яркости при уменьшении задержки. Во первых опрос датчика в начале каждого лупа занимает время, т.е перед каждой отрисовкой в динамике задержка до 10 мс на считывание. Я бы ввел некоторый счетчик до 20 и проверку ==0 запрос температуры ==5 считывание температуры. Во вторых если запитались через резисторы, потеря яркости. В динамической индикации цепляют напрямую к выводам индикатора, кратковременная яркость не убьет светодиоды, но в динамике будет хорошо смотреться, и желательно предусмотреть защиту по току на случай зависания, убьется сегмент.
По поводу вашего кода, еще непонятно опрос датчика. Обычно он состоит из 2х фаз, запрос на преобразование температуры, ожидание 15-100 мс, считывание температуры, у тебя в коде только считывание, т.е. считывается одна и та же цифра.
Реально на практике 25 кадров в секунду все равно видна пульсация, надо брать 50 - 100 кадров в секунду. Если нужно поищу свой код, с регулировкой яркости.
реально выше 20 выдит менее 1% людей, а выше 24 и вовсе единицы во всем вире
а то, что у вас "пульсирует" - знаит код не верный
вы гасите индикаторы и заново зажигаете с новыми цифрами - вот ваши и пульсации!, тк между гашением и включением проходит весьма долгое время
а вы попробуйне НЕ гасить индикатор а гасить и зажигать нужные сигменты, при этом если это будет единовременно - то будет лучше
и никаких пульсаций не будет вообще
я тоже столкнулся с "мерцанием", когда использовал штатную библиотеку, но стоило из неё выкинуть лишний код и убрать очистку (гашение) экрана перед каждым обновлением данных - как пульсации пропали
ну и схемотехника - конденсаторы где они должны быть - там они должны быть!
А проблема такая: Выводить выводит, НО число градусов мигают, а значок градуса не мигает. Надо чтобы вообще ничего не мигало!!!
Помогите пожалуйста!!!
Я выше написал пару соображений.
Реально на практике 25 кадров в секунду все равно видна пульсация, надо брать 50 - 100 кадров в секунду. Если нужно поищу свой код, с регулировкой яркости.
реально выше 20 выдит менее 1% людей, а выше 24 и вовсе единицы во всем вире
Я где то читал что кошки еще выше частоту воспринимают.
а то, что у вас "пульсирует" - знаит код не верный
вы гасите индикаторы и заново зажигаете с новыми цифрами - вот ваши и пульсации!, тк между гашением и включением проходит весьма долгое время
а вы попробуйне НЕ гасить индикатор а гасить и зажигать нужные сигменты, при этом если это будет единовременно - то будет лучше
и никаких пульсаций не будет вообще
я тоже столкнулся с "мерцанием", когда использовал штатную библиотеку, но стоило из неё выкинуть лишний код и убрать очистку (гашение) экрана перед каждым обновлением данных - как пульсации пропали
ну и схемотехника - конденсаторы где они должны быть - там они должны быть!
Я штатные библиотеки даже не видел, поэтому у меня этих проблем нету. При сдвиге в порт закидывается новый байт.
Но у меня есть регулировка яркости, т.к. устройство стоит в темноте и нужно чтобы оно не подсвечивало внешнюю обстановку, и при этом было видно циферки. На свету пульсации несильно, но были заметны для 25 Гц, а вот в темноте, при уменьшении яркости, видимо действительно проявился эффект который вы описываете т.к. есть период погашенного. Я вроде 100 Гц из за этого сделал динамическую индикацию.
taraserker, у ТС в скетче ошибка, не имеющая абсолютно никакого отношения к частоте зажигания индикаторов, так что не тратьте зря силы на объяснения
реально выше 20 выдит менее 1% людей, а выше 24 и вовсе единицы во всем вире
а то, что у вас "пульсирует" - знаит код не верный
Это неверное утверждение.
Опирается оно на кинематограф, где время экспрозиции кадра примерно вдвое превышает время между кадрами. Последнее, как не трудно подсчитать, примерно равно 1000/24/3=14 мс.
Дле дисплея на трубке время засвечиваниялюминофора практически мгновенно, поэтому промежуток между кадрами занимает практически весь период кадра. Т.е. при частоте кадров 72 получаем ту же самую величину.
Эта величина характерна для колбочек, т.е. для центральной области глаза - желтого пятна. Для периферийного (а также сумеречного - палочки чувствительнее колбочек) зрения эту величина несколько меньше - не более 11-12 мс. Поэтому при кратковременном включении источника света чатота должна быть не менее 85 Гц.
Впрочем, те советы, которые Вы даете далее в своем сообщении, вполне справедливы.
Теория, цифры....это всё хорошо, а вот скажите мне знатоки: выше я выкладывал код часов с термометром, все работает, яркость семисегментных индикаторов прекрасно регулируется в зависимости от внешнего освещения, но вот при полном отсутствии внешнего освещения последний из 8 индикаторов самый бледный и мерцает, это происходит потому что длительность loop цикла больше чем задержка паузы гашения индикаторов. Меня это не сильно напрягает, но любопытно как это вылечить.
Теория, цифры....это всё хорошо, а вот скажите мне знатоки: выше я выкладывал код часов с термометром, все работает, яркость семисегментных индикаторов прекрасно регулируется в зависимости от внешнего освещения, но вот при полном отсутствии внешнего освещения последний из 8 индикаторов самый бледный и мерцает, это происходит потому что длительность loop цикла больше чем задержка паузы гашения индикаторов. Меня это не сильно напрягает, но любопытно как это вылечить.
ответ очевиден - зажигайте последний индикатор на то же время, что и все остальные - а потом принудительно гасите, а не оставляйте включенным до конца loop
Сталкивался с такой же вещью, они будут мигать в любом случае, если постоянно в цикле, сколько бы задержку не ставить. Надо менять выводимые значения, с условием, если температура изменилась. Типо, If(старая тепмература не рава новоя){приравниваем переменную к новому значению и обновляем индикатор}.
Логично, спасибо
реально выше 20 выдит менее 1% людей, а выше 24 и вовсе единицы во всем вире
а то, что у вас "пульсирует" - знаит код не верный
Это неверное утверждение.
Опирается оно на кинематограф, где время экспрозиции кадра примерно вдвое превышает время между кадрами. Последнее, как не трудно подсчитать, примерно равно 1000/24/3=14 мс.
Дле дисплея на трубке время засвечиваниялюминофора практически мгновенно, поэтому промежуток между кадрами занимает практически весь период кадра. Т.е. при частоте кадров 72 получаем ту же самую величину.
Эта величина характерна для колбочек, т.е. для центральной области глаза - желтого пятна. Для периферийного (а также сумеречного - палочки чувствительнее колбочек) зрения эту величина несколько меньше - не более 11-12 мс. Поэтому при кратковременном включении источника света чатота должна быть не менее 85 Гц.
позвольте не согласится, для ЭЛТ засвечивание совершенно не мгновенное, и более того, оно весьма медленное - тут эффект иной - время постсвечения люминифора очень большет - и за счет этого картинка не мерцает (глаз этого почти невидит) - но при этом это мерцание очень легко увидить при помещении между экраном и наблюдателем движущейся цели - тогда стану видны моменты гажения точек...
да, глаз способен зафиксировать вспышки длительностью менее 1/100 с даже, но это именно мгновенная чувствительность.
А мы , когда речь идет о экранах или индикаторах, должны оперировать иным понятием - а именно инерционность зрения, а вот она уже на много ниже, и составляет 1/20 1/25с всего
а если мы будем говорить о скорости восприятия передаваемой информации - в данном случает отображаемое число - то человек более 3-5 изменений значения в секунду уже не может восприниматься в достаточной мере
Исключением является только вывод динамической графической информации (видео, осциолограммы и тд) - где требуется высокая детализация и точность отображения - в этих случаях частота обновления графического экрана и 25 и 50 и даже 100к/с являются обоснованно необходимыми.
Делая из вышеизложенно вывод ИМХО:
1) при изменении / вовода на экран/индикатор информации, он не должен полностью гаснуть и заново отрисовывать данные. Необходимо использовать алгоритмы, при которых идет обновление отображаемой информации (гажение только ненужных точек/сигмертов) и включение нужных, не затрагивая неизменяемые элементы
2) частота обновления экрана/андикатора выше 25к/с является избыточной - а в условиях ардуины еще и дает лишнюю нагрузку
3) частота обновления информации, выводимой на экран, выше 5к/с также избыточна
Исходя из п.2 и п.3 я лично рекомендую обновлять экран и данные на нем единовременно и не выше 5 раз в секунду.
Теория, цифры....это всё хорошо, а вот скажите мне знатоки: выше я выкладывал код часов с термометром, все работает, яркость семисегментных индикаторов прекрасно регулируется в зависимости от внешнего освещения, но вот при полном отсутствии внешнего освещения последний из 8 индикаторов самый бледный и мерцает, это происходит потому что длительность loop цикла больше чем задержка паузы гашения индикаторов. Меня это не сильно напрягает, но любопытно как это вылечить.
ответ очевиден - зажигайте последний индикатор на то же время, что и все остальные - а потом принудительно гасите, а не оставляйте включенным до конца loop
а зачем гасить то - вот он и мерцает
пусть он показывает данные до следующего обновления не меняя их - горит и чего ему мерцать то....
да и вообще в часах точность 1 секунда, менять показания Т чаще 1с тоже толку нет
так пусть он раз в 1 секунду и обновляет все данные разом
при этом выполнять весь цекл, а в конце него уже рассчитанные и подготовленные данные разом обновлять на индикаторе - это минимизирует все задержки при выводе
im14ilya выложите текущую версию вашего кода скетча, дабы поглядеть что не так и как улучшить+
Теория, цифры....это всё хорошо, а вот скажите мне знатоки: выше я выкладывал код часов с термометром, все работает, яркость семисегментных индикаторов прекрасно регулируется в зависимости от внешнего освещения, но вот при полном отсутствии внешнего освещения последний из 8 индикаторов самый бледный и мерцает, это происходит потому что длительность loop цикла больше чем задержка паузы гашения индикаторов. Меня это не сильно напрягает, но любопытно как это вылечить.
ответ очевиден - зажигайте последний индикатор на то же время, что и все остальные - а потом принудительно гасите, а не оставляйте включенным до конца loop
а зачем гасить то - вот он и мерцает
пусть он показывает данные до следующего обновления не меняя их - горит и чего ему мерцать то....
да и вообще в часах точность 1 секунда, менять показания Т чаще 1с тоже толку нет
так пусть он раз в 1 секунду и обновляет все данные разом
при этом выполнять весь цекл, а в конце него уже рассчитанные и подготовленные данные разом обновлять на индикаторе - это минимизирует все задержки при выводе
гасить в любом случае необходимо для равномерной регулировки яркости в зависимости от внешнего освещения, b707 прав - надо добавить условие именно для последнего индикатор, как нибудь сделаю....
вот текущий код если любопытно.
зачем же гасить - если я верно прочел код - вы яркость регулируете частотой включений и выключений
так может быть схитрить?
у вам индикатор имеет общий анод (или катод) - так вот их подключить к ШИМ выходам
а в ЛУПЕ при каждом проходе по датчику освещенности переопределять скважность ШИМ выходов
//при этом по таймера раз 10 в секунду достаточно будет
Не верно прочитали - не частотой а именно длительностью, если например яркость равна 5 (из 8) то 5 циклов сегменты зажигают я, а 3 цикла подряд гасятся
ну да, а попробуйте как я предложил
у вес одна часть кода будет выводить сигменты
а другая ШИМить яркость разрядам
это не только упростит код, но и даст вам очень плавную регулировку яркости и можно будет не линейно менять - ведь яркость убдет задана числом от 0 до 127
итого останется 1 цикл на установку какие сегменты вкл/выкл
и 1 цикл задает уровень шим для разрядов
Мысль правильная анодом шим яркость регулировать, но я модуль купил целиковый и ковырять искать и отрывать общий анод лень
зачем ковырять? можно ссылку что за модуль у вас
а то по фото - просто индикатор на 4 резряда
итого имеет 12 ног, где 4 ноги - это 4 анода
фактически вы ШИМомо заменяете ваши пропуски циклов
Не то фото смотрите, у меня 8 сегментный на сдвиговом регистре 74hc595
ага, значит по этой схеме наверное
http://arduinolab.pw/wp-content/uploads/2015/12/141-c-8-digit-7-segment-...
В гугле наберите 7 сегментные индикаторы на 74hc595)
ЗЫ устройство собрано и реально его лень разбирать и что то там припаивать)
ну да, я просто сам паял себе на мах7221 -они специально заточены под индикаторы и имеют 16 ступеней регулировки яркости встроеннйо уже
у вас же да, остается только кодом рулить....
тогда выходит мледующее - индикатор принимает 2 байта данных
первый указывает какие разряды, а 2й какие сигменты ...
тогда может вам изменить алгоритм так:
сделать таймер (например 1000мс) //просто актуальность меня чаще 1 раза в секунду показания экрана нету - а зачем вычислениями грузить МК каждый луп тогда....
по нему вы в переменную (массив [16] байт) вормируете то, что надо вывести на экран
а вне таймера вы выводите на экран, готовый массив (фактически цикл по отправке готовых данных остается), уже используя ваш алгоритм пропусков вывода относительно освещенности
и да, делать это не по делею, а по таймеру, зачем же нам тормозить МК постоянно )
Не усложняйте)
Просто для последнего символа (разряда) добавляется условие зависимости длительности свечения в зависимости от нужной яркости, максимум четыре строки кода.