Часы на матрицах

Степлер
Offline
Зарегистрирован: 26.04.2016

Проект еще не доделан, но основная часть закончена. Делается для дачи.
Собственно надоело ходить к градуснику, что бы узнать зима за окном или лето. Да и часов в кухне-столовой, где проводится основная часть времени, не было. Под закрылиной валялись остатки от бегущей строки еще советского производства, в которой оставалось 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 матриц. Но мне не понравилось, т.к. полностью слова все равно не влезают, а размер получается внушительный. Хотя кому-нибудь может и понравится.

 

Bomberboy
Offline
Зарегистрирован: 08.07.2013

Я так, не ради критики, а для инфы. Не нужно 6 матриц, проще и эффективней бегущей строкой. Вот проект

уже всё обкатано. Как пример реализации http://radiokot.ru/forum/viewtopic.php?f=25&t=112934

yucan
Offline
Зарегистрирован: 20.04.2015

Что то не получается у меня с поворотом изображения. Что нужно изменить для поворота изображения по Y на -90 град?

   y = 7 - y;    // координаты у пересчитываются по 7 - y для поворота на 90 градусов по часовой

Так выглядит сейчас.

Степлер
Offline
Зарегистрирован: 26.04.2016
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 поменять местами х и у

yucan
Offline
Зарегистрирован: 20.04.2015

Спасибо , сейчас попробую

Степлер
Offline
Зарегистрирован: 26.04.2016

Посмотрел, да, практически тоже самое. Но есть несколько "но" для меня. Во первых у меня скетч для IDE, который каждый может перековырять под себя, как перековырять HEX я не знаю. Во вторых, бегущая строка на мой взгляд утомительна.

yucan
Offline
Зарегистрирован: 20.04.2015

Так я пробовал уже, не получается. Цифры зеркально отобразились и всё

Степлер
Offline
Зарегистрирован: 26.04.2016

Зеркально это как?

yucan
Offline
Зарегистрирован: 20.04.2015

Так же как на фото, только всё "вверх ногами"

yucan
Offline
Зарегистрирован: 20.04.2015

Индикаторы у меня с ОК. Это имеет значение?

Степлер
Offline
Зарегистрирован: 26.04.2016

void plot выложите что там у Вас получилось? ОА или ОК не важно, ими все равно MAX управляет.

yucan
Offline
Зарегистрирован: 20.04.2015

//размещение точек на дисплее
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);                       //очистить дисплей
  }
}
//затухание дисплея

yucan
Offline
Зарегистрирован: 20.04.2015

Вот мой индикатор в рабочем положении. Время на нём 10:46

Степлер
Offline
Зарегистрирован: 26.04.2016

if (val == 1) {                       // если точку надо зажечь
    lc.setLed(address, x, y, true);     // зажигание точки (для поворота обратно- поменять местами х и у
  } else {                              // если зажигать не надо
    lc.setLed(address, x, y, false);    // потушить точки (для поворота обратно- поменять местами х и у
  }
}

 

х и у местами не поменяли

yucan
Offline
Зарегистрирован: 20.04.2015

ОК, пробую...

 

yucan
Offline
Зарегистрирован: 20.04.2015

Спасибо, получилось. Адресса матриц ещё пришлось поменять! Атмосферного давления конечно не хватает для полноты информации

Степлер
Offline
Зарегистрирован: 26.04.2016

Адреса матриц менять надо, если все вверх ногами или просто матрицы перевернуть. По давлению, датчик уже купил, но пока не прикручивал. Хочу все отлаживать уже на больших матрицах, что бы визуально оценить восприятие текста. 

Обратите внимание, что температура в помещении снимается с микросхемы часов, а не с DHT (он на мой взгляд подвирает). В будущем вместо DHT буду прикручивать AM2320 и снимать температуру и влажность с него.

yucan
Offline
Зарегистрирован: 20.04.2015

Да, показания температуры завышены. Но DHT11 тоже врёт. Поэтому применение DHT22 будет лучшим решением.

Разбираюсь сейчас. Почему то не работают кнопки

Степлер
Offline
Зарегистрирован: 26.04.2016

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 . По кнопкам, они работают только при показе часов.

yucan
Offline
Зарегистрирован: 20.04.2015

Да, уже понял, что при показе часов. Хорошая сатейка. Я правда сталкивался только с DHT11 и 22. И датчиками давления BMP085 и BMP180. Сейчас вот BMP280 есть на Али, по точности он ещё лучше предыдущих.

msng
Offline
Зарегистрирован: 07.06.2012

делал пару таких часов на день рождения

вот что получилось

https://youtu.be/9DUy7Ib0Kek

три матрицы 8*8 красно-зеленые, atmega328, часы ds1307, температура ds18b20, пять сдвиговых регистров 74НС595

делал на скорую руку, можно было б допилить немного программу,  но времени не оставалось. именинникам понравилось)))

дома уже второй год работает на 4 таких же матрицах, плюс: давление BMP085, влажность DHT22, замеряет изменение давления за сутки, также отображает максимальную и минимальную температуру за бортом.

управляется без кнопок. ИК пультом, приемник TL1838.

матрицы покупал оч давно , думал не осилю их, ан нет все получилось...

 

Степлер
Offline
Зарегистрирован: 26.04.2016

Корпуса зачетные!!!

msng
Offline
Зарегистрирован: 07.06.2012

Долго в голову не приходило как их оформить, вот придумал)))

yucan
Offline
Зарегистрирован: 20.04.2015

Да, прикольно получилось! Бутылку, я так понимаю, резделил на 2 части?

msng
Offline
Зарегистрирован: 07.06.2012

yucan пишет:

Да, прикольно получилось! Бутылку, я так понимаю, резделил на 2 части?

неее, паял через горлышко)))))

yucan
Offline
Зарегистрирован: 20.04.2015

Болгаркой распилил?

yucan
Offline
Зарегистрирован: 20.04.2015

Ещё олин вопрос нарисовался. При выключении время почему то часики не запоминают. Первоначально, я так понял, записывается время из компа.

msng
Offline
Зарегистрирован: 07.06.2012

резал стеклорезом и перепадом температур

у меня часы на DS1307 c батарейкой, время не сбрасывется...

yucan
Offline
Зарегистрирован: 20.04.2015

Понятно. Надо попробовать алмазным кругом бутылку распилить! Перепадом температур как то пробовал - ровно не получается.

У меня DS3231 используется. Когда скетч пишешь - время из компа берется. Потом, при выключении-включении питания это же время ставится

Степлер
Offline
Зарегистрирован: 26.04.2016

Заливаем скетч, закоментируем строку 65

 ds3231.adjust(DateTime(__DATE__, __TIME__));  // автоматическая установка времени и даты из компа

 

опять заливаем скетч.

Таким образом, при первой заливке скетча у нас выставляются часы, при второй заливке уже часы переустанавливаться не будут.

yucan
Offline
Зарегистрирован: 20.04.2015

Понятно. Спасибо!

yucan
Offline
Зарегистрирован: 20.04.2015

Здравствуйте! У меня часики пока не в корпусе, но уже несколько дней исправно работают. Пожелания у меня два. Температуру дома брать всё таки из DHT11, т.к. DS3231  врёт прилично. И второе - прикрутить  датчик давления. Если использовать BMP280 (он достаточно точный), то и DS18B20 не нужен.

Степлер
Offline
Зарегистрирован: 26.04.2016

Обновил скетч. Температура с DHT , добавлен датчик давления. Координаты переписаны под большой экран.

Что осталось: разобраться с написанием слова "давление" (пока стоит на нем задержка больше чем на остальных на время отладки). Перебрать надписи в меню.

MVN123P
Offline
Зарегистрирован: 29.07.2016

Помогите пажалуйста! При компиляции выдает ошибку "RTC_DS3231 does not name a type". Ругается на строку "RTC_DS3231 ds3231  // Создаем объект RTC"

Степлер
Offline
Зарегистрирован: 26.04.2016

Проверьте версию библиотеки RTClib.h

MVN123P
Offline
Зарегистрирован: 29.07.2016

Степлер пишет:

Проверьте версию библиотеки RTClib.h

Подставлял разные версии библиотек - все равно ошибка

Степлер
Offline
Зарегистрирован: 26.04.2016

Библиотеки должны быть из моей ссылки.

MVN123P
Offline
Зарегистрирован: 29.07.2016

Степлер пишет:

Библиотеки должны быть из моей ссылки.

В вашей ссылке нет библиотеки RTC

Степлер
Offline
Зарегистрирован: 26.04.2016

Извиняюсь, добавил.

MVN123P
Offline
Зарегистрирован: 29.07.2016

Не получается. Если можно выложите Arduino IDE с библиотеками.

Степлер
Offline
Зарегистрирован: 26.04.2016

У Вас видимо IDE 1.6.10 на нем почему-то не компилируется. На 1.6.8 все норм.

Степлер
Offline
Зарегистрирован: 26.04.2016

И AvrBoards у меня  1.6.11

MVN123P
Offline
Зарегистрирован: 29.07.2016

Степлер пишет:

У Вас видимо IDE 1.6.10 на нем почему-то не компилируется. На 1.6.8 все норм.

1.6.5 и 1.6.7

Степлер
Offline
Зарегистрирован: 26.04.2016

А AvrBoards?

MVN123P
Offline
Зарегистрирован: 29.07.2016

Степлер пишет:

А AvrBoards?

Что такое AvrBoards? Если имеется в виду плата то про мини 328

Степлер
Offline
Зарегистрирован: 26.04.2016

В IDE Инструменты - плата - менеджер плат Arduino AvrBoards какая версия?

MVN123P
Offline
Зарегистрирован: 29.07.2016

Степлер пишет:

В IDE Инструменты - плата - менеджер плат Arduino AvrBoards какая версия?

1.6.11

Степлер
Offline
Зарегистрирован: 26.04.2016

Странно. Скиньте скриншот, посмотрим ошибки.

yucan
Offline
Зарегистрирован: 20.04.2015

Степлер пишет:

Обновил скетч. Температура с DHT , добавлен датчик давления. Координаты переписаны под большой экран.

Спасибо! Жаль сейчас нет возможности опробовать. Библиотеку для BMP085 недеюсь можно применить к BMP180?

yucan
Offline
Зарегистрирован: 20.04.2015

Опробовал новый скетч (с датчиком давления BMP180), всё отлично работает. Точность показаний температуры дома и влажности значительно улучшилась благодаря DHT22. Хочется поблагодарить автора за хороший проект!

 

Andrei19
Offline
Зарегистрирован: 19.09.2016

Доброго дня и спасибо за проект!

Проблемы с поворотом решил, проблему с выводом температуры с датчика BMP180 как уличную температуру - решил. Остается один: реально ли сделать смену слайдов с текстами "Дома", "Улица", "Давление" быстрее? 7 секунд приходится читать каждое слово и ждать показаний температур и давления. Параметр в тексте скетча не нашел, увы только начинаю работу с ардуино. Прошу помощи. Идеально было бы время отображения часов самое длительное (как есть или чуть дольше), а время отображения каждого слова сократить до 2 секунд..