Заголовок сообщения: Re: Часы на светодиодных матрицах с драйверами MAX7219
Добавлено: Чт окт 13, 2016 09:37:26
Встал на лапы
Зарегистрирован: Ср сен 17, 2008 09:00:34 Сообщений: 110 Откуда: Украина
Рейтинг сообщения:0
Cпасибо! Прошил! По умолчанию матрица получилась в порядке 4321 ну это ладно можно поправить но теперь стоит режим больших цифр без секунд и тоже не хочет переключаться! Я в шоке, кнопки все рабочие а дефект переходит из прошивки в прошивку. Не знаю что еще попробовать. Может проц поменять. Но часы же нормально работают.
Добавлено after 34 minutes 30 seconds: Перепрошил matrixclock_max7219_mod2_atmega8.hex порядок матриц наладился остальное без изменений. Оставлю пока так, большие цифры мне больше нравятся
_________________ Человек может посмотреть на другого свысока только тогда, когда помогает ему подняться...
Всем привет! WiseLord, не подскажете, если в исходнике частоту кварца изменить на 16 МГц, то править ни чего не нужно будет больше или нет? Если да, то в каких местах? Заранее спасибо за ответ.
_________________ Того, кто не задумывается о далеких трудностях, ожидают близкие неприятности.
В matrix.c и mtimer.c доработать инициализацию/прерывания таймеров, чтобы они продолжали работать на прежней частоте. Иначе временные интервалы нажатий кнопок, скорость прокрутки бегущей строки и другие зависящие от них вещи будут работать некорректно - ускоренно.
Отличные часы но не для лопухов в программировании. Мучаюсь уже долго подгоняя для себя. Подскажите пожалуйста где у вас реализован запуск и звучание будильника. Хочу вообще пищалку ликвидировать, А что надо вычистить не пойму. В программировании не силён, еле осилил добавку нескольких пунктов в меню часов, добавление плеера и uart. Добавил изменение громкости и выбор мелодии для DFPlayer, также ввёл настройку бегущей строки 4 варианта вывода ( отключена, только дата, только датчики, и вариант по умолчанию) и изменение интервала показа правда до 99 сек. Вместо гудка каждый час поставил проговаривание времени голосом. Потом добавлю выбор варианта часового сигнала. В 8-ку конечно уже не влезает но делаю для 328. Очень много переходов, а с таймерами вообще у меня беда, мне кажется будильник где то там и включается. Ткните пальцем пожалуйста где в коде это реализовано. Проект собираю в atmel studio. И кстати как доработать таймера в сообщении выше , цикл вставить как тут где то делали? Как хитро вы реализовали проверку при изменении яркости матрицы в меню, я на день застрял не понимая почему ничего не работает в подобных меню у меня. Вот эта не понятка eep.brMax &= 0x0F; Так и не понял сделал свою проверку. В страшных планах добавление сд карты для чтения событий. Скажите а выводить прямо из файла строку можно на вашем движке? И по моему зря убрали 3-й вариант отображения цифр, где точка внизу была.
где у вас реализован запуск и звучание будильника.
В main.c в основном цикле вызывается функция checkAlarm() В случае подходящего времени для будильника устанавливается в нужное значение переменная alarmTimer; Вообще работа с бипером достаточно хитрая - всё ради ужатия кода. Вся логика реализуется в файле mtimer.c.
Таймер 0 настроен на 250Гц. В конце обработчика прерывания такой код: Спойлер
Код:
// 1 second intervals if (secTimer) { secTimer--; } else { secTimer = TIME_SEC; // 250 // Temperature if (sensTimer) sensTimer--; if (scrollTimer) scrollTimer--;
if (alarmTimer) alarmTimer--; }
// Beeper if (beepTimer) { beepTimer--; } else { if (alarmTimer) beepTimer = TIME_SEC; }
secTimer реализует односекундные интервалы. То есть, раз в секунду мы попадаем в else ветку, где снова "заряжаем" этот таймер на одну секунду. Там же уменьшаем, раз в секунду, alarmTimer.
beepTimer - это переменная, за счёт которой реализуется сам сигнал. Будучи установлена в некоторое значение, она с частотой таймера 250Гц постепенно декрементируется до нуля. Кроме того, как только это происходит, в случае активного будильника она каждую секунду снова "подбрасывается" до TIME_SEC=250. То есть, если мы хотим "бипнуть", мы просто функцией startBeeper() ставим эту переменную в нужное значение, после чего она сама "скатится" до нуля. Ну, или это будет делать каждую секунду alarmTimer.
Ну и в самом низу - собственно управление бипером. По мере "скатывания" в ноль, у переменной beepTimer младшие разряды несколько раз (16 раз в секунду) проходят числа от 0 до 15. Собственно, тут вся логика - пока младшие биты > 8 - пищим (в первой половине секунды), если меньше - выключаем бипер.
phoenix75 писал(а):
Вот эта не понятка eep.brMax &= 0x0F
Просто ограничение максимальной яркости значением 15, путём обнуления старших четырёх битов.
phoenix75 писал(а):
зря убрали 3-й вариант отображения цифр
Он остался в варианте для трёх матриц. На четырёх он и смотрелся не очень, да и не влезали в ATmega8 сразу оба варианта после добавления всех датчиков.
Спасибо за ответ. Именно на этот участок кода и думал но не понял как работает. А ограничение яркости если изменить значение 0f на другое не работают нормально кнопки изменения значений, убавляет сразу на 2 и прибавление не работает, точнее прибавление идет а эта строка делает -1. Ладно буду дальше разбираться.
Извините обращусь ешё раз. Вроде всё работает но обнаружилась проблема не отображает показания датчиков ни дтш22 ни 180. Перекидывал 22-й на разные пины ничего. Если загрузить скетч из idi показания есть в мониторе, значит датчик рабочий. Посмотрите пожалуйста что наваял https://yadi.sk/d/5mJjbNtBxUEGQ. Отредактированный файл епрома и распиновка в архиве. А то может я на ерунде какой застрял. Глаза уже замылились.
Загрузил вариант без правок, тоже в строке нули показывает. Вначале строки вообще нет, после передёргивания датчика строка появляется но температура 0.0 и влажность 0.0. Откомпилировал ваш код заработало. Но датчик всё равно передёргивать надо, без этого строка не появляется. Где то я накосячил. Может намекнёте где ошибся.
Работают себе часы с марта месяца. За текущее время ушли вперед на 1.5 минуты Раз было - "отвалился" где-то на месяц датчик давления, а так как температура снималась с него - перестала отображаться температура дома. Потом вдруг опять появился.. Вопрос к WiseLord: - можно ли как-то ввести коррекцию в DS3231? Как показало время - они довольно не точные. Тут как-то делают: viewtopic.php?p=2888811#p2888811
Работают себе часы с марта месяца. За текущее время ушли вперед на 1.5 минуты Раз было - "отвалился" где-то на месяц датчик давления, а так как температура снималась с него - перестала отображаться температура дома. Потом вдруг опять появился.. Вопрос к WiseLord: - можно ли как-то ввести коррекцию в DS3231? Как показало время - они довольно не точные. Тут как-то делают: viewtopic.php?p=2888811#p2888811
Я собрал часики на плате предложенной dark-м : viewtopic.php?f=25&t=112934&start=1000 - в конце июня. С того времени часы не ушли не взад, не вперед. Секунды я не сверял, но минуты совпадают с компьютерным временем. Единственный недостаток, который я заметил - это расхождение показаний температуры датчиков DHT22, BMP180. Хотя они лежат рядом, температура BMP180 точнее на градус. Я собрал еще портативные часы на ардуино с BMP280 и данные с BMP180 практически совпадают, а вложность DHT22 отличантся с BMP280, тоже на 1-цу. DHT22 по температуре и влажности врет на 1-цу.
Я собрал еще портативные часы на ардуино с BMP280 и данные с BMP180 практически совпадают, а вложность DHT22 отличантся с BMP280, тоже на 1-цу. DHT22 по температуре и влажности врет на 1-цу.
Подправлю не BMP280, а BMЕ280. Проверил секунды и с секундами тоже все отлично. Так что, hector, ищите причину в вашем "железе".
Единственный недостаток, который я заметил - это расхождение показаний температуры датчиков DHT22, BMP180. Хотя они лежат рядом, температура BMP180 точнее на градус. Я собрал еще портативные часы на ардуино с BMP280 и данные с BMP180 практически совпадают, а вложность DHT22 отличантся с BMP280, тоже на 1-цу. DHT22 по температуре и влажности врет на 1-цу.
DHT22-- невысокая точность по температуре, температуру надо ds1820 измерять, это первое. По влажности Вы так вообще хотите того, чего в принципе быть не может-- DHT22 по даташиту влажность +-5%RH -- это означает, что плюс-минус 5 единиц. А вы хотите получить, то на что этот датчик в принципе не способен.
Проверил секунды и с секундами тоже все отлично. Так что, hector, ищите причину в вашем "железе".
Понятно, что в "железе", DS3231 с китайских модулей: https://ru.aliexpress.com/item/DS3231-A ... 6237e7875c Верно, китайцы их понятия не имеют настраивать. Или может ихняя калибровка "сидит" в микросхеме памяти, что присутствует на платке? В любом случае, точность этих DS3231 - никакая .. Такое впечатление, что кварцевый генератор внутри них абсолютно некалиброван. У меня есть электронные часы на PIC16F628, с возможностью подстройки хода до 0.1 сек в сутки. Так вот они идут намного точнее - за пол-года расхождение 1..2 сек (после подстройки). Может есть какой алгоритм разовой настройки DS3231 на точный ход? Вообщем, вот с этого времени: viewtopic.php?p=2662790#p2662790 ушли вперед на 97 секунд, т.е. убегают вперед на 12 секунд в месяц. Многовато для DS3231 - верно?
Привет всем. Выложу здесь результаты своих мучений. Просил добавить в проект поддержку Dfplayer но очень умные и знающие промолчали . Проект только для атмега328. Меню яркость теперь выглядит так : 1- яркость 2- громкость (0-30) 3-мелодия будильника (1-10) 4-опции бегущей строки (1-отключена, 2-дата, 3-датчики, 4-как и было по умолчанию) 5-интервал строки (1-99) 6-вариант часового сигнала (1-3) отредактированный епром в папке my eeprom. Вот и всё, может кому нужно такое. Если есть ошибки так я лузер .
Добавлено after 8 hours 25 minutes 19 seconds: Побеспокою Вас ешё раз. Объясните пожалуйста про маски в display.h. Хочу сделать меню с прокруткой а то сокращения мне не нравятся но не пойму как организован вывод. Когда бежит строка нету цифр. Подскажите как одновременно вывести строку с цифрами и почему лесенка получается как на видео видео https://youtu.be/RlPTvLq1UL0. Используется маска MASK_BR_UNITS. Объясните пожалуйста, просто взялся курочить ваше творение для самообразования.
Есть три основных буфера: 1. fb[32]. Это - именно то, что отображается (сканируется) в данный момент. Для удобства вращения (подстройки под конфигурацию индикаторов) этот буфер ещё конвертируется в fbRaw, но это не суть важно. 2. fbStr[250]. В этот буфер мы заносим текст (строку), который хотим отобразить. 3. fbNew[32]. Это вспомогательный буфер.
Что можно сделать: 1. Занести "картинку", в том числе текст (matrixFbNewAddString(),matrixFbNewAddStringEeprom() ) в буфер fbNew, после чего по маске вызвать функцию matrixSwitchBuf(mask, effect). При этом данные, соответствующие маске, из fbNew попадут в fb с нужным эффектом вертикальной прокрутки. Достигается это постепенным переносом данных из fbNew в fb и вызовом matrixWrite(). 2. Занести текст (строку) в буфер fbStr (matrixScrollAddString(), matrixScrollAddStringEeprom(), load*String() и т.п.) и дать команду matrixHwScroll(MATRIX_SCROLL_START) (обычно через вызов startScroll(type)). При этом fbNew очистится, и в него справа начнут постепенно по прерыванию набиваться данные из fbStr() с фиксацией картинки через matrixWrite(). Получается эффект прокрутки строки.
Режим частичной прокрутки не предусмотрен.
Если его всё же нужно реализовать, то менять надо display.c: - void startScroll(uint8_t type) - очищать "разлетанием" не всю строку (поднулить в MASK_ALL первые биты, чтобы оставалось число-параметр слева) - matrixHwScroll() - аналогично, не очищать весь fbNew - ISR (TIMER2_OVF_vect) - сдвиг делать не от i = 0.
Тогда, теоретически, можно будет добиться того, что строка будет прокручиваться частично, оставляя слева нетронутое число.
Возможно, проще будет начать в обратном направлении - от прерывания таймера. Завести некоторый глобальный флаг (переменную), означающую, нужно ли частично или полностью прокручивать строку. Например, при scrollPos = 0 - будет обновляться при прокрутке вся строка, а при scrollPos = 10 первые 10 знакомест прокручиваться не будут. А затем, на основании этого флага, и прочие маски-очистки учитывать.
P. S. Попробовал реализовать вышесказанное - вроде как работает. Во вложении патч, в котором эксперимента ради строка с датой выводится в "частичном" режиме.
Проверил секунды и с секундами тоже все отлично. Так что, hector, ищите причину в вашем "железе".
Понятно, что в "железе", DS3231 с китайских модулей: https://ru.aliexpress.com/item/DS3231-A ... 6237e7875c Верно, китайцы их понятия не имеют настраивать. Или может ихняя калибровка "сидит" в микросхеме памяти, что присутствует на платке? В любом случае, точность этих DS3231 - никакая .. Такое впечатление, что кварцевый генератор внутри них абсолютно некалиброван. У меня есть электронные часы на PIC16F628, с возможностью подстройки хода до 0.1 сек в сутки. Так вот они идут намного точнее - за пол-года расхождение 1..2 сек (после подстройки). Может есть какой алгоритм разовой настройки DS3231 на точный ход? Вообщем, вот с этого времени: viewtopic.php?p=2662790#p2662790 ушли вперед на 97 секунд, т.е. убегают вперед на 12 секунд в месяц.
Многовато для DS3231 - верно?
У кого еще какая статистика по китайским DS3231?
Если у тебя точность никакая - то не надо писать что все DS3231 такие. У менея таких как у тебя "12 секунд в месяц" нет - пол секунды. И то может я так засинхронизировал при установке времени. Модуль DS3231 на ардуинке с BME280 тоже работает отлично.
Подскажите пожалуйста какой использовать кварц под МК для программирования и если можно, какие фьюзы, тут на форуме написаны какие, в калькуляторе фьюзов они не сходятся по частоте кварца (внешнего). И ещё не могу определиться какую прошивку использовать, я делал по схеме, использовал готовую плату с Китая на max7219 (3 платы), а прошивки по названию вроде бы подходят любые (не имею возможно часто программировать вот и прошу).
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 27
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения