А тем временем пока космические корабли бороздят просторы большого театра вселенной, проходят испытания нового логгера температуры, о котором я уже писал чуть ранее, выкладывал для него печатную плату и схему. Помимо прямой обязанности записывать ежедневные показатели температуры, в устройство добавлены датчики давления и влажности, так что получилась полноценная погодная станция.
В основном режиме работы устройство отображает текущие время и дату, значения температуры/влажности/давления измеренных в помещении выводятся во второй строке. В третьей строке идут текущая температура на улице и зарегистрированный максимум/минимум за текущие сутки (для обозначения использованы спецсимволы-закорючки, надеюсь понятно что где:)).
Схема устройства базируется на микроконтроллере ATMega64. В отличии от приведенной ранее схемы в нее добавлены цифровой датчик DS18B20 и радиомодуль NRF24L01 - они оба используются для получения данных об уличной температуры (на выбор).
Общий вид платы без дисплея. Ее общее описание уже публиковалось здесь С тех пор мало что изменилось:)
К свободным выводам, под микроконтроллером слева (туда выведены контакты SPI), припаян радиомодуль NRF24L01. Он расположился с обратной стороны платы. Обратите внимание, что радиомодуль должен питаться напряжением не выше 3,6 вольт. Поэтому он запитан от имеющегося на плате стабилизатора напряжения на 3,3 вольта (U1 на схеме)
Теперь принимать температуру с улицы или откуда-то еще можно по радиоканалу.
А для универсальности (если нет в наличии трансиверов NRF) уличную температруру можно брать от датчика DS18B20, который подлкючается к выводу PortA.3 (на плате под этот случай выведены контактные площадки, останется только подпаять подтягивающий резистор сопротивлением 4,7кОм). Все махинации с выбором датчиков организованы в меню устройства.
А так как температуру в устройстве могут мерить сразу несколько датчиков, сделал такой же выбор и для измерения внутренней температуры
Смотрим небольшое видео
Радиопередатчик
Передатчиком служит плата с микроконтроллером ATmega8, которую описывал здесь тыц
Датчик подключается к выводу PortC.0 поэтому схема передатчика температуры в конечном варианте выглядит так
Питание передатчика должно находится в диапазоне 3,0-3,6 вольт (если ниже - откажется работать датчик ds18b20, выше - повышается опасность спалить трансивер). Для тестирования запитывал схему парой старых батареек, общим напряжением 2,98 вольт.
Еще одно небольшое видео, с демонстрацией приема температуры от передетчика
Как можно заметить на видео, на дисплее выводится предупреждающее сообщение если передатчик не работает. В том случае если не работает датчик температуры на передающей стороне, на дисплее появится соответствующее сообщение.
Организация меню
Основное меню содержит четыре пункта
Review - просмотр логов температуры за прошедшие дни. Здесь можно посмотреть максимум/минимум температур за текущие сутки, а также среднесуточную температуру.
Transmit - здесь мы можем послать все накопленные данные в компьютер (в любую терминальную программу, скорость COM порта 38400 бод). На выбор два формата в котором отправляются данные. CSV это формат экселя, с разделителем-точкой. Удобно использовать для построения графиков прямо в таблицах Windows Excel.
Setting - тут собсно все настройки датчиков, часов, а также стирание внешней энергонезависимой памяти.
Info - версия прошивки и информация об авторе.
Устройство пока находится в стадии доработки, поэтому информация получилась обобщенной. Но основные возложенные на него функции уже выполняет. В дальнейшем планирую добавить управление и настройки напрямую с ПК. Опыт, хоть и не большой, в написании программ на PB уже имеется:)
Очередное усовершенствование.Задействовал микросхему 24С32, которая находится в модуле DS3231 Организована запись в память температуры и давления, получилось 128 страниц (суток).Организован удобный на мой взгляд вывод логов на экран, вычисление экстремумов по температуре и давлению во всем массиве данных.https://youtu.be/qCQo_nwFyAw
Господа хорошие, подскажите пожалуйста или носом укажите :) как мне вычислять время UNIX имея в наличии текущее время ? В хелпе по Баскому почитал, там все хитрые функции связанные с вычислением времени работают только после 2000 Года. Может кто то уже заморачивался чем то подобным.
Хотел повторить схему и долго ждал дисплей, два раза заказывал с Китая, пришел. Заказывал BMP180 -- небыло, только BMP280. Стал собирать, не знаю как его подключить. Может кто делал на BMP280 логгер? Нужна прошивка, т.к. не силен в этом, а начинать поздновато.
exersizze Да, массив пересчитывается при каждой смене часа, определяется максимум и минимум, вычисляется дельта и строится график. Не знаю, как под спойлер спрятать, вставляю кусочек кода сюда. Изначально для температуры был :) '******************************************************************************* Tgraf(20) = T1empds If Seco_last > Mine_bcd Then 'если произошла смена минуты For Nnn = 1 To 19 'Заполнаяем массив со сдвигом влево Tgraf(nnn) = Tgraf(nnn + 1) Next For Nnn = 1 To 20 'Нахождение минимума температуры в массиве If Tgraf(nnn) < Tgmin Then Tgmin = Tgraf(nnn) End If Next For Nnn = 1 To 20 'Нахождение максимума температуры в массиве If Tgraf(nnn) > Tgmax Then Tgmax = Tgraf(nnn) End If Next Raznica = Tgmax - Tgmin Koefic = Raznica / 32 For Nnn = 1 To 20 'Заполнаяем массив Tfinal(nnn) = Tgraf(nnn) - Tgmin Tfinal(nnn) = Tfinal(nnn) / Koefic T1final(nnn) = Round(tfinal(nnn)) Next End If Return
Блуждала в голове мысль, сделать вывод графика изменения давления на символьном дисплее. Получилось кое что, можно выводить график за последние 20 часов (по количеству символов в индикаторе), с дискретностью 32 по количеству строк (4 строки по 7 пикселей в высоту). Алгоритм не сложный, крутим массив размерностью 20 куда хотим и выводим как хотим Привязав предварительно значения к величине 32. Сумбурно как то объяснил, вот, что получилось на фото, если заинтересует кого выложу пока сырой исходник, он еще абсолютные экстремумы у меня пишет в ЕЕПРОМ. https://drive.google.com/open?id=0B4u67oh2vLxOTnN3eW44TW8xUkE
Поставил в схему ВМР280, нашел исходник под ВМЕ280, выкинул все связанное с влажностью. Должно работать. Только не могу состыковать, в найденном исходнике коды Bascom_AVR_1.11.9.8 не понимает, они заточены под более новый компилятор. Может у кого есть библиотека ВМР280 под Bascom_AVR_1.11.9.8.
Давление сверить могу только в интернете в своем регионе у меня показывает на 15 единиц меньше. Уличный датчик (радиомодуль) в данный момент на 4 градуса показывает больше (сверяю с термометром) в доме ДНТ11 показывает больше на 6 градусов, BMP085 на 7 больше.
Все датчики - цифровые, что они отдают то и выводится на дисплей, никакого шаманства в коде с термокомпенсацией нет. Видимо датчики такие. Какие показания идут с датчиков?
Вопрос к знающим. Все четыре датчика показывают завышенную температуру где то на 4-5 градусов, так вот это какая то ошибка в аппаратной части или это решается программным путем, типа термокомпенсации на каждый датчик? Исходник брал из архива статьи, компилировал и заливал в микроконтроллер.
проверь чтоб 5 вместе с 1 нога дисплея на корпусе(минусе) сидела, сразу после команд инициализации дисплея и Cls - допиши типа: Lcd "HELLO", компилируй и залей, оно сразу появиться должно. Я как-то случайно задел фуз CKDIV8 (Divide clock by 8) тоже долго квадраты наблюдал))).
Спасибо за помощь exersizze. Запрограммировал мегу тестовой прошивкой, менял фузы как на внутренний генератор так и на кварц, отключал совместимость с atmega103 результат не меняется: черные квадраты в 1 и 3 строках. Если предположить, что микросхема шьется тестовой прошивкой, то наличие датчиков роли не играет - на экране должны быть буковки, я правильно понимаю? Если это так, то причину наверное нужно искать микроконтроллер - дисплей - их сопряжение? А еще причина большая нехватка времени, в общем если , что то получится отпишусь.
Вспомнил еще вот что, в крупных мегах в том числе и 64й, есть режим совместимости с atmega103. Его надо отключить, это делается отдельным фьюзом, возможно в этом проблема, а так вот тестовая программка которая выводит на дисплей текст http://avrproject.ru/112/test001.hex
UPD: отблин, я на схеме ошибку нашел, надо поменять местами VDD и VEE, на VDD подключается плюс питания, а на VEE средний вывод резистора. Исправил.
Дисплей подключен согласно схеме, проверял несколько раз. Назначение выводов на этом дисплее отмечены, так что в этом ошибки быть не должно. Тогда еще вопрос (хотя их много), возможно такое, что при отсутствии одного датчика (bmp085) мега просто не стартует, так как квадраты на экране дисплея светятся и при прошитой микросхеме и при стертой. А что если вместо этого датчика поставить bmp180, это может решить проблему.
Ну это у тебя где-то с подключением дисплея косяк. Когда на дисплей просто подано напряжение питания появляются квадраты, это нормально. Дальше должна быть инициализация и очистка дисплея, но как видишь у тебя данные с микроконтроллера до дисплея не доходят.
Ребята помогите с программированием меги. Программатор Минипро, беру из архива нех файл, микросхема программируется на экране 1 и 3 строка черные квадраты. Изменение фьюзов ничего не дает, такая же проблема была при повторении другой конструкции (Часы, термометр, барометр, гигрометр в одном флаконе) на другой печатной, плате другим микроконтроллером, другом индикаторе.
Да, конечно вот http://ru.aliexpress.com/item/LCD2004-20x4-big-character-big-size-blue-screen-lcd-display-module-182x33-5mm-HD4 4780-LC2042-AC204B/32223825431.html?recommendVersion=1 Индикатор не знает русский язык:) У этого продавца есть и зеленые большие индикаторы.
Ещё есть МК41Т56 - полный аналог 1307. Отличие только в 7-м байте. Седьмым байтом выставляется коррекция хода. (в 1307 - частота на out ) Я такие юзаю - ход стабильный.
>В баскоме нашел функцию Dayofweek Ну это давно известно: http://bascomavr.3bb.ru/viewtopic.php?id=589#p5447 (без обид).
>И еще вопрос, как настроить время более точно, десяток кварцев поменял и все убегают по разному, при чем в разные стороны: Лучше использовать DS3231, работать с ней так же, как DS1307, только точность гораздо лучше.
Немного покопался в исходнике, думаю автор не будет за это в обиде:) А натолкнула на это пустая четвертая строка. В баскоме нашел функцию Dayofweek она сама вычисляет день недели по дате и не нужно никаких плясок с формулами. Мой индикатор не знает русского языка, поэтому написал на латинице. Если куплю индикатор с кириллицей, то конечно заставлю его писать по русски. И размер индиктора 204 был для меня маловат, приходилось прищуриваться(старею), купил пожирнее, на фотографиях можно сравнить размеры. https://yadi.sk/d/T27L8MbQfZuuX И еще вопрос, как настроить время более точно, десяток кварцев поменял и все убегают по разному, при чем в разные стороны:)
Автору Огромное спасибо за проект. По своим требованиям и имеющимся деталям переписал проект. Использовано(чтоб не травить плату)ArduinoProMini-1шт; DS18B20-2шт; DHT22-2шт; BMP180-1шт; 24LC08-1шт; индикатор 4х20. Вся температура и влажность с десятыми. В память пишу с двух датчиков. Работает в железе и протеусе(ну давление в протеусе с потолка). Архив перезалит на яндекс, может кому пригодится. https://yadi.sk/d/1lqFmYONsT9Wi Прицепил Sleep, ток 7,8мА всей конструкции, больше снизить покуда не удалось.