Карма: 14
Рейтинг сообщений: 121
Зарегистрирован: Сб май 21, 2016 11:04:52 Сообщений: 2977 Откуда: Беларусь
Рейтинг сообщения:0
Martian, значит пока я не во всем досконально разобрался. Буду дальше измерять наблюдать.
Starichok51 писал(а):
может хватит оффтопит про терморезисторы в этой теме?
ок, так вот теперь по теме
прибавил в код еще кнопку, что бы переключать режимы на индикаторе: температуру , гадзинник, хвилины, год и так по кругу и заметил странную особенность, четыре сегмента в режиме часов горят одинаково и с хорошей яркостью, а вот минуты - 2 правых сегмента, яркость почему то снизилась вдвое, год - первый сегмент слева с хорошей яркостью (2), а вот сегменты 024 уже более низкой яркости, в чем может быть загвоздака привожу код: Спойлер
// Проверяем, было ли нажатие кнопки if (button.pressed()) { // Увеличиваем счетчик нажатий на кнопку buttonPressCount++; disp.clear(); } // Выполняем действие в зависимости от значения счетчика нажатий switch (buttonPressCount) { case 1:
Serial.println("Выполняется действие 1"); if (millis() - countTimer > 500) { // каждые 50 миллисекунд ("прозрачный" аналог delay) DateTime now = rtc.now(); int displaytime = (now.second()); disp.digit4(displaytime);
countTimer = millis(); // сбросить таймер } break; case 2: Serial.println("Выполняется действие 2"); if (millis() - countTimer > 1000) { // каждые 50 миллисекунд ("прозрачный" аналог delay) DateTime now = rtc.now(); int displaytime = now.year(); disp.digit4(displaytime); countTimer = millis(); // сбросить таймер } break; case 3: Serial.println("Выполняется действие 3"); if (millis() - countTimer > 1000) { // каждые 50 миллисекунд ("прозрачный" аналог delay) DateTime now = rtc.now(); int displaytime = ((now.month() * 100) + now.day()); disp.float_dot(therm.getTempAverage(), 1); //disp.digit4(displaytime); countTimer = millis(); // сбросить таймер } break; // Если было больше трех нажатий, счетчик сбрасывается default: if (millis() - countTimer > 1000) { // каждые 50 миллисекунд ("прозрачный" аналог delay) DateTime now = rtc.now(); int displaytime = ((now.hour() * 100) + now.minute()); disp.digit4(displaytime); countTimer = millis(); // сбросить таймер } buttonPressCount = 0; break; }
/* Пример работы с дисплеем на микросхеме TM74HC595 Динамическая индикация осуществляется "вручную" таймером на micros() AlexGyver Technologies http://alexgyver.ru/ */
/* Основные методы библиотеки: disp.set(X, port); // вывести 16 ричный код X в порт port (либо элемент массива SYM!!!)
// вывести двухзначное число value на порт port (0 - первый и второй порт, 2 - 2 и 3, 3 - 3 и 4 порты)) disp.digit2(value, port);
disp.digit4(value); // вывести число value disp.digit4showZero(value); // вывести число value с нулями СЛЕВА
disp.float_dot(value, pos); // вывести float число value с точкой СПРАВА по счёту pos disp.int_dot(value, pos); // вывести int число value с точкой СПРАВА по счёту pos
disp.clear(); // очистить дисплей *порты идут справа налево! (3 2 1 0) */
Динамическая индикация обычно увязана и со сканированием кнопок. Для удобства используем кнопки на позиционных ключах плюс контрольный вход. В данном случае теоретически 4 кнопы прицепить можно (и варианты с одновременным нажатием группы кнопок). Основная программа получает уже готовый результат от сканера в виде байтика данных (плюс флаг запроса - то уж на усмотрение).
void setup() { .... // запустим второй таймер Timer2.setPeriod(10000); // Устанавливаем период таймера 10000 мкс -> 100 гц Timer2.enableISR(CHANNEL_A); // Или просто .enableISR(), запускаем прерывание на канале А таймера 2 }
ISR(TIMER2_A) { disp.digit4(displaytime); }
Что в итоге получаем: 1. переменная displaytime станет глобальной и объявлена один раз. Может это и невыгодно, зато наглядно, а не разбросано по всему коду int display 2. вызов функции disp.digit4(displaytime) теперь один раз, нет нужды его вызывать в куче мест и думать о ней, и если захотим изменить (например, выводить точку) - это тоже делается в одном месте. 3. гарантированную частоту обновления дисплея, а значит, теперь доступна регулировка яркости.
Единственно, что необходимо учесть: нежелательно частичное изменение значения displaytime, то есть, когда его итоговое значение получается за несколько операций с ним же. Есть риск срабатывания таймера посередине этих операций, когда в displaytime хранится промежуточный рекзультат, и тогда он и будет выведен.
void setup() { Serial.begin(57600); rtc.begin(); button.begin(); // запустим второй таймер Timer2.setPeriod(10000); // Устанавливаем период таймера 10000 мкс -> 100 гц Timer2.enableISR(CHANNEL_A); // Или просто .enableISR(), запускаем прерывание на канале А таймера 2 }
void loop() { button.read();// Обновляем состояние кнопки if (button.pressed())// Проверяем, было ли нажатие кнопки { buttonPressCount++;// Увеличиваем счетчик нажатий на кнопку } DateTime now = rtc.now(); switch (buttonPressCount) // Выполняем действие в зависимости от значения счетчика нажатий { case 1: Serial.println("Выполняется действие 1"); displaytime = now.second(); break; case 2: Serial.println("Выполняется действие 2"); displaytime = now.year(); break; case 3: Serial.println("Выполняется действие 3"); displaytime = therm.getTempAverage(); break; default: displaytime = ((now.hour() * 100) + now.minute()); buttonPressCount = 0;// Если было больше трех нажатий, счетчик сбрасывается break; } }
яркость в норме тольок если показывает время, даже в этом варианте.
связался ты с динамической индикацией)) у статической таких проблем нет... динамическая индикация оправдана только когда много пикселей... типа больших панелей... и т.д.
// Обновляем состояние кнопки button.read(); DateTime now = rtc.now(); // Проверяем, было ли нажатие кнопки if (button.pressed()) { // Увеличиваем счетчик нажатий на кнопку buttonPressCount++; disp.clear();
} // Выполняем действие в зависимости от значения счетчика нажатий switch (buttonPressCount) { case 1: displaytime = (now.second());break; case 2: displaytime = now.year();break; case 3: displaytemp = therm.getTempAverage();break; // Если было больше трех нажатий, счетчик сбрасывается default: displaytime = ((now.hour() * 100) + now.minute()); buttonPressCount = 0; break; }
if (millis() - countTimer > 1000) { // каждые 50 миллисекунд ("прозрачный" аналог delay)
С динамической индикацией никаких проблем нет. Мало того. Статика это потребление большего тока по сравнению с динамикой. А это немаловажно. При выборе источника питания.
Это если нет взаимоперекрывающихся процессов (обработка дисплея идет на прерываниях или остальные части программы заметно меньше, чем время индикации одной позиции с учетом интервалов обработки и вывода данных). Если чего-то или неравномерно высвечивает или "мерцает" - где-то программная ошибка. В случае самостоятельно написанной прожки разобраться легче, а при использовании нескольких библиотек - то покопаться придется... Serial.println(val, format) ведь немало времени занимает (учитывать скорость передачи).
Demiurg, 1. не надо обзываться. оскорбления запрещены правилами форума. 2. не надо портить сделанную цитату. у тебя получилось, что это были твои слова, а не его. выглядит так, что ты обозвал себя самого.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Demiurg, 1. не надо обзываться. оскорбления запрещены правилами форума. 2. не надо портить сделанную цитату. у тебя получилось, что это были твои слова, а не его. выглядит так, что ты обозвал себя самого.
Пардон...
Добавлено after 8 minutes 27 seconds: Статика. Это потребление всех сегментов и знакомест. В отдельно взятый момент времени. А динамика это потребление сегментов одного знакоместа в отдельно взятый момент времени. И что ты хотел сказать про закон сохранения энергии. Я совсем не понил.
Последний раз редактировалось Demiurg Вс фев 25, 2024 20:02:45, всего редактировалось 1 раз.
То, что количество энергии, необходимое для обеспечения приемлемой яркости, может оказаться достаточно близким в обоих случаях. Однако, roman.com всё равно ляпнул чушь про вред динамической индикации (притом, глядя в монитор с той самой динамической индикацией, смотря в детстве телевизор с той самой динамической индикацией...) и не учитывает то, что инерция человеческого глаза не требует прямой пропорциональности, особенно для зелёного цвета. Зелёный индикатор с динамической индикацией при той же видимой (человеческим глазом) яркостью будет экономичнее, чем со статической индикацией. Потерями в переходных процессах ключей здесь можно пренебречь. С жёлтыми светодиодами у меня был небольшой выигрыш в экономичности, но всё-таки был. А ещё roman.com не понимает, что с ростом числа светодиодов общее потребление всей системы уменьшается при динамической индикации, а статическая может оказаться вообще невозможной. Но другого от него сложно ожидать.
на самом деле при 4 разрядах при динамике не нужно увеличивать ток в 4 раза по сравнению со статикой. даже можно оставить тот же ток, как и при статике - инерция глаз даст практически ту же яркость. у меня в термометрах ток сегмента 4-7 мА, в зависимости от напряжения на аккумуляторе, а видно прекрасно. так что, статика при 4 разрядах по потреблению проигрывает в 4 раза против динамики.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
О - пока писал опередили. Полностью согласен с предыдущим постом. На примере индикаторов с 4 цифрами, при динамической индикации глаз видит каждую отдельную цифру в течении 1/4 части всего времени. Соответственно, яркость цифры будет меньше, чем при статической индикации при том же токе через сегменты. Учитывая, что зависимость яркости большинства светодиодов от тока близка к логарифмической (с неким коэффициентом, может быть даже близка к линейной в зависимости от модели), для получения той же яркости цифр при динамической индикации следует увеличивать ток через светодиоды экспоненциально (или, как минимум, также линейно). Но тут ещё накладывается нелинейность самого глаза (эта зависимость также близка к логарифмической) и зависимость его чувствительности от цвета. В результате токопотребление дисплея за период развёртки всех цифр может быть как больше, так и меньше чем при статической. Однако, скорее больше, чем меньше.
Тьфу, йопт. Пардон. Не сдержался.... 4 разряда. 7 сегментов. Про точку я уже молчу. Пусть 10 мА. Это уже 280 мА. Статика. Динамика. Один разряд. 70 мА. На конкретно взятый момент времени. И я уже могу выбирать другой источник питания. Это вопрос цены. Если мы говорим о самоделках. Ну тогда да. Там вопрос цены не стоит.
Карма: 14
Рейтинг сообщений: 121
Зарегистрирован: Сб май 21, 2016 11:04:52 Сообщений: 2977 Откуда: Беларусь
Рейтинг сообщения:0
Вот есть у меня 3 одинаковых индикатора по 4 цифры каждый. Как к ардуине подключить что бы они показывали одноверменно 3 температуры от трех разных датчиков?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения