Часы на матрицах
- Войдите на сайт для отправки комментариев
Проект еще не доделан, но основная часть закончена. Делается для дачи.
Собственно надоело ходить к градуснику, что бы узнать зима за окном или лето. Да и часов в кухне-столовой, где проводится основная часть времени, не было. Под закрылиной валялись остатки от бегущей строки еще советского производства, в которой оставалось 3 светодиодных матрицы 16х7. Решил их и использовать, но для начала откатать все на маленьких матрицах 8х8.
Полазив по интернету нашел отправную точку на импортном ресурсе, где человек делал часы на матрицах с анимацией смены цифр. Скетч перелопатил под себя. Что имеем:
— 4 матрицы 8х8 управляемые МАХ7219. Это и есть наш экран.
— Модуль часов DS3231. С него получаем данные о времени и температуре.
— Датчик влажности и температуры DTH11. Для данных о влажности.
— Датчик температуры DS18B20. Для данных о температуре "за бортом".
— Фоторезистор для управления яркостью дисплея.
— Плата ARDUINO
Что умеет:
— Естественно показывает время с анимацией смены числа.
— Показ дня недели (в буквенном виде), даты (в числовом) и месяца (в буквенном).
— Показ температуры и влажности в помещении (или на улице).
— Показ температуры на улице (или в помещении).
— Уменьшение яркости в темноте
— Запоминает настройки яркости и чувствительности при отключении питания.
Настройки:
— Естественно время и дата
— Яркость дисплея на свету
— Яркость дисплея в темноте
— Чувствительность датчика освещенности.
Проект оптимизирован под 4 матрицы, но будет переделан под 6, т.к. хочется чтобы на экране помещались слова типа "Понедельник" полностью, но дополнительные МАХ7219 пока до меня не доехали, так что пока под 4, а уменьшать размер символов я не хочу из-за их неприглядности. На данный момент все режимы крутятся по кругу, но можно переделать на выбор режима кнопкой изменением одной строки. Я же буду делать управление от хлопка в ладоши. Часы будут висеть над дверью и хлопком будет включаться режим показа даты и температур. В плане расширения можно прикрутить датчик атмосферного давления, исполнительные механизмы при смене режима освещения и т.д. и т.п. Так же не оптимизирована чувствительность датчика яркости, надо по месту подгонять.
Часть строк с комментариями, но замучился писать и бросил. Скетч конечно не оптимизирован и можно найти косяки, но вполне рабочий. Пока все на макетке, но пост будет изменен при изменении состояния проекта.

Видео работы тут: https://www.youtube.com/watch?v=skmuWBntyKU&feature=youtu.be
собственно скетч и библиотеки лежат тут:yadi.sk/d/Ie5zUhb2sr8jz
Советы и пожелания приветствуются. Главный вопрос на данный момент, чем реализовать переключение на режим термометра, если не с кнопки и не от хлопка? Использовать пульт не хочу, вечно будет лежать не под рукой, а от хлопка может и жена проснуться в соседней комнате.
По схеме, в Fritzing нет модулей матриц на MAX7219, так что использовал картинку какой-то матрицы. Поэтому обращаем внимание на подключение DataIn pin — Arduino 6, CLK pin — Arduino 5, LOAD pin — Arduino 4. По резисторам, на фоторезистор и на DTH11 10 кОм. Если используется готовый модуль датчика DTH11, то возможно резистор уже установлен, смотрите внимательно.
Добавил скетч для 6 матриц. Но мне не понравилось, т.к. полностью слова все равно не влезают, а размер получается внушительный. Хотя кому-нибудь может и понравится.
Я так, не ради критики, а для инфы. Не нужно 6 матриц, проще и эффективней бегущей строкой. Вот проект
уже всё обкатано. Как пример реализации http://radiokot.ru/forum/viewtopic.php?f=25&t=112934
Что то не получается у меня с поворотом изображения. Что нужно изменить для поворота изображения по Y на -90 град?
y = 7 - y; // координаты у пересчитываются по 7 - y для поворота на 90 градусов по часовой
Так выглядит сейчас.
void plot (byte x, byte y, byte val) { byte address; if (x >= 0 && x <= 7) { address = 0; } if (x >= 8 && x <= 15) { address = 1; x = x - 8; } if (x >= 16 && x <= 23) { address = 2; x = x - 16; } if (x >= 24 && x <= 31) { address = 3; x = x - 24; } if (val == 1) { lc.setLed(address, y, x, true); } else { lc.setLed(address, y, x, false); } }Короче просто убрать строчки y = 7 - y; и в lc.setLed поменять местами х и у
Спасибо , сейчас попробую
Посмотрел, да, практически тоже самое. Но есть несколько "но" для меня. Во первых у меня скетч для IDE, который каждый может перековырять под себя, как перековырять HEX я не знаю. Во вторых, бегущая строка на мой взгляд утомительна.
Так я пробовал уже, не получается. Цифры зеркально отобразились и всё
Зеркально это как?
Так же как на фото, только всё "вверх ногами"
Индикаторы у меня с ОК. Это имеет значение?
void plot выложите что там у Вас получилось? ОА или ОК не важно, ими все равно MAX управляет.
//размещение точек на дисплее
void plot (byte x, byte y, byte val) {
//выбор матрицы в зависимости от координат х
byte address;
if (x >= 0 && x <= 7) { // при x >= 0 и x <= 7
address = 0; // адрес матрицы 0
}
if (x >= 8 && x <= 15) { // при x >= 8 и x <= 15
address = 1; // адрес матрицы 1
x = x - 8; // координаты х пересчитываются по х - 8
}
if (x >= 16 && x <= 23) { // при x >= 16 и x <= 23
address = 2; // адрес матрицы 2
x = x - 16; // координаты х пересчитываются по x - 16
}
if (x >= 24 && x <= 31) { // при x >= 24 и x <= 31
address = 3; // адрес матрицы 3
x = x - 24; // координаты х пересчитываются по x - 24
}
//зажигание и гашение точек
if (val == 1) { // если точку надо зажечь
lc.setLed(address, x, y, true); // зажигание точки (для поворота обратно- поменять местами х и у
} else { // если зажигать не надо
lc.setLed(address, x, y, false); // потушить точки (для поворота обратно- поменять местами х и у
}
}
//очистка дисплея
void clear_display() {
for (byte address = 0; address < 4; address++) { //для адресов с 0 до 3
lc.clearDisplay(address); //очистить дисплей
}
}
//затухание дисплея
Вот мой индикатор в рабочем положении. Время на нём 10:46
if (val == 1) { // если точку надо зажечь
lc.setLed(address, x, y, true); // зажигание точки (для поворота обратно- поменять местами х и у
} else { // если зажигать не надо
lc.setLed(address, x, y, false); // потушить точки (для поворота обратно- поменять местами х и у
}
}
х и у местами не поменяли
ОК, пробую...
Спасибо, получилось. Адресса матриц ещё пришлось поменять! Атмосферного давления конечно не хватает для полноты информации
Адреса матриц менять надо, если все вверх ногами или просто матрицы перевернуть. По давлению, датчик уже купил, но пока не прикручивал. Хочу все отлаживать уже на больших матрицах, что бы визуально оценить восприятие текста.
Обратите внимание, что температура в помещении снимается с микросхемы часов, а не с DHT (он на мой взгляд подвирает). В будущем вместо DHT буду прикручивать AM2320 и снимать температуру и влажность с него.
Да, показания температуры завышены. Но DHT11 тоже врёт. Поэтому применение DHT22 будет лучшим решением.
Разбираюсь сейчас. Почему то не работают кнопки
AM2320 лучше по точности, всего ±0.5 °C и ±3 %RH, тогда как DHT22 +-2%RH(Max +-5%RH) и разрешение у AM2320 0.1 °C. А вообще вот целая статья с сравнением датчиков http://kandrsmith.org/RJS/Misc/Hygrometers/calib_many.html . По кнопкам, они работают только при показе часов.
Да, уже понял, что при показе часов. Хорошая сатейка. Я правда сталкивался только с DHT11 и 22. И датчиками давления BMP085 и BMP180. Сейчас вот BMP280 есть на Али, по точности он ещё лучше предыдущих.
делал пару таких часов на день рождения
вот что получилось
https://youtu.be/9DUy7Ib0Kek
три матрицы 8*8 красно-зеленые, atmega328, часы ds1307, температура ds18b20, пять сдвиговых регистров 74НС595
делал на скорую руку, можно было б допилить немного программу, но времени не оставалось. именинникам понравилось)))
дома уже второй год работает на 4 таких же матрицах, плюс: давление BMP085, влажность DHT22, замеряет изменение давления за сутки, также отображает максимальную и минимальную температуру за бортом.
управляется без кнопок. ИК пультом, приемник TL1838.
матрицы покупал оч давно , думал не осилю их, ан нет все получилось...
Корпуса зачетные!!!
Долго в голову не приходило как их оформить, вот придумал)))
Да, прикольно получилось! Бутылку, я так понимаю, резделил на 2 части?
Да, прикольно получилось! Бутылку, я так понимаю, резделил на 2 части?
неее, паял через горлышко)))))
Болгаркой распилил?
Ещё олин вопрос нарисовался. При выключении время почему то часики не запоминают. Первоначально, я так понял, записывается время из компа.
резал стеклорезом и перепадом температур
у меня часы на DS1307 c батарейкой, время не сбрасывется...
Понятно. Надо попробовать алмазным кругом бутылку распилить! Перепадом температур как то пробовал - ровно не получается.
У меня DS3231 используется. Когда скетч пишешь - время из компа берется. Потом, при выключении-включении питания это же время ставится
Заливаем скетч, закоментируем строку 65
ds3231.adjust(DateTime(__DATE__, __TIME__)); // автоматическая установка времени и даты из компа
опять заливаем скетч.
Таким образом, при первой заливке скетча у нас выставляются часы, при второй заливке уже часы переустанавливаться не будут.
Понятно. Спасибо!
Здравствуйте! У меня часики пока не в корпусе, но уже несколько дней исправно работают. Пожелания у меня два. Температуру дома брать всё таки из DHT11, т.к. DS3231 врёт прилично. И второе - прикрутить датчик давления. Если использовать BMP280 (он достаточно точный), то и DS18B20 не нужен.
Обновил скетч. Температура с DHT , добавлен датчик давления. Координаты переписаны под большой экран.
Что осталось: разобраться с написанием слова "давление" (пока стоит на нем задержка больше чем на остальных на время отладки). Перебрать надписи в меню.
Помогите пажалуйста! При компиляции выдает ошибку "RTC_DS3231 does not name a type". Ругается на строку "RTC_DS3231 ds3231 // Создаем объект RTC"
Проверьте версию библиотеки RTClib.h
Проверьте версию библиотеки RTClib.h
Подставлял разные версии библиотек - все равно ошибка
Библиотеки должны быть из моей ссылки.
Библиотеки должны быть из моей ссылки.
В вашей ссылке нет библиотеки RTC
Извиняюсь, добавил.
Не получается. Если можно выложите Arduino IDE с библиотеками.
У Вас видимо IDE 1.6.10 на нем почему-то не компилируется. На 1.6.8 все норм.
И AvrBoards у меня 1.6.11
У Вас видимо IDE 1.6.10 на нем почему-то не компилируется. На 1.6.8 все норм.
1.6.5 и 1.6.7
А AvrBoards?
А AvrBoards?
Что такое AvrBoards? Если имеется в виду плата то про мини 328
В IDE Инструменты - плата - менеджер плат Arduino AvrBoards какая версия?
В IDE Инструменты - плата - менеджер плат Arduino AvrBoards какая версия?
1.6.11
Странно. Скиньте скриншот, посмотрим ошибки.
Обновил скетч. Температура с DHT , добавлен датчик давления. Координаты переписаны под большой экран.
Спасибо! Жаль сейчас нет возможности опробовать. Библиотеку для BMP085 недеюсь можно применить к BMP180?
Опробовал новый скетч (с датчиком давления BMP180), всё отлично работает. Точность показаний температуры дома и влажности значительно улучшилась благодаря DHT22. Хочется поблагодарить автора за хороший проект!
Доброго дня и спасибо за проект!
Проблемы с поворотом решил, проблему с выводом температуры с датчика BMP180 как уличную температуру - решил. Остается один: реально ли сделать смену слайдов с текстами "Дома", "Улица", "Давление" быстрее? 7 секунд приходится читать каждое слово и ждать показаний температур и давления. Параметр в тексте скетча не нашел, увы только начинаю работу с ардуино. Прошу помощи. Идеально было бы время отображения часов самое длительное (как есть или чуть дольше), а время отображения каждого слова сократить до 2 секунд..