Представляю еще один проект на основе микроконтроллера AVR Atmega8. На этот раз будем конструировать комнатную метеостанцию. В устройстве применяется два датчика - DHT11 и BMP180. Первый мы будем использовать в качестве измерителя влажности воздуха, а второй в качестве измерителя атмосферного давления, а также, раз уж он имеет более точный термодатчик, то и в качестве термометра для измерения температуры в комнате. В итоге с помощью этой схемы можно отслеживать основные параметры погоды, так сказать. Если добавить датчики скорости и направления воздушных потоков, то данную схему можно будет переквалифицировать в наружнюю метеостанцию. Тем не менее сейчас рассмотрим только комнатный вариант.
Схема устройства:
Как можно было судить выше, сердцем схемы является микроконтроллер Atmega8. Данный контроллер можно использовать в любом корпусе - DIP-28 или TQFP-32, не имеет значения, только собственные предпочтения или особенности изготавливаемой печатной платы. Резистор R3, подтягивающий плюс питания к выводу PC6, предотвращает самопроизвольный перезапуск микроконтроллера в случае каких-либо случайных наводок на схему. Далее в качестве индикатора измеряемых параметров используется жидко кристаллический экран на две строки по шестнадцать символов в каждой - SC1602. Данный ЖК экранчик изготовлен на базе контроллера HD44780, поэтому данную модель можно заменить на другую на этом же контроллере или может быть совместимую с ним. Подсветка в данном варианте схемы на ЖК дисплее организована через выводы "А" и "К" (то есть анод и катод подсветки - дисплей имеет дополнительные выводы для подключения подсветки). Однако, просто подключить питание к этим выводам будет не правильно, нужно подключать 5 вольт через резистор ограничивающий ток, чтобы не сжечь подсветку. По схеме это резистор R1, его номинал составляет 22 Ом, чем больше номинал, тем менее ярко будет подсвечиваться дисплей. Номинал менее 22 Ом не рекомендую использовать, так как может появиться риск вывода из строя подсветки экрана при длительном использовании.
Питается вся схема от простого модуля питания на силовом трансформаторе. Переменное напряжение выпрямляется четырьмя диодами VD1 - VD4 марки 1N4007, пульсации сглаживаются конденсаторами C1 и C2. Номинал конденсатора C2 можно увеличить до 1000 - 4700 мкФ. Четыре выпрямительных диода можно заменить одним диодным мостом. Трансформатор применен марки BV EI 382 1189 - преобразует 220 вольт переменного тока в 9 вольт переменного тока. Мощность трансформатора составляет 4,5 Вт, этого вполне достаточно и еще с запасом. Такой трансформатор можно заменить любым другим силовым трансформатором, подходящим для Вас. Либо данный питающий модуль схемы заменить на импульсный источник напряжения, можно собрать схему обратноходового преобразователя либо применить иже готовый блок питания от телефона, например - все это дело вкусов и потребностей. Выпрямленное напряжение с трансформатора стабилизируется на микросхеме линейного стабилизатора L7805, ее можно заменить на отечественный аналог пяти вольтового линейного стабилизатора КР142ЕН5А, либо применить другу микросхему стабилизатора напряжения в соответствии с подключением ее в схеме (например LM317 или импульсные стабилизаторы LM2576, LM2596, MC34063 и так далее). Далее 5 вольт стабилизируются другой микросхемой - AMS1117 в исполнении, дающей на выходе 3,3 вольта. Это напряжение используется для питания датчика атмосферного давления BMP180 в соответствии с документацией. Стабилизатор напряжения AMS1117 можно также заменить на исполнение ADJ (AMS1117ADJ) - то есть регулируемый вариант, задать необходимое напряжение при таком выборе необходимо будет при помощи двух резисторов, подключаемых к микросхеме в соответствии с даташитом на нее. Самым экономичным вариантом замены этой микросхемы стабилизатора будет замена ее на стабилитрон на нужное напряжение (параметрический стабилизатор на стабилитроне). Номиналы конденсаторов в обвязках микросхем стабилизаторов напряжения можно варьировать в широких пределах в области взятого порядка.
Как было указано выше, в качестве датчиков были использованы DHT11 и BMP180:
DHT11 используется в схеме только как датчик влажности воздуха, данные датчик передает контроллеру через второй вывод, подтянутый резистором R8, к плюсу питания. Номинал этого резистора можно варьировать до 10 кОм. На фото использованы два резистора по 2,7 кОм, соединенных последовательно. Вывод 3 датчика не используется вовсе, выводы 1 и 4 используются для подключения питания. Датчик DHT11 выбран в соответствии с оптимальным соотношением цена / функционал - для комнатных условий самый лучший вариант, для применения на улице лучше подойдет DHT21 в корпусе более предназначенном для применения на улице.
Датчик BMP180 используется как термометр и как датчик атмосферного давления. Он выбран для измерения температуры, потому что в отличие от DHT11, он измеряет температуру окружающей среды с точностью до 0,1 градуса. BMP180 требует питания в 3,3 вольта, а микроконтроллер питается от 5 вольт. Именно для питания этого датчика и используется дополнительный стабилизатор VR2 на AMS1117. Также для надежной передачи данных от датчика к контроллеру нужно согласовать уровни I2C протокола передачи, который используется. Для этой цели применена микросхема согласования уровней PCA9517 компании NXP. Резисторы R4 - R7 необходимы для работы I2C интерфейсов микросхем. С их помощью на выводах микросхем образуются сигналы логического нуля и единицы.
Подтягивающие резисторы постоянно держат логическую единицу на линиях данных I2C. На время логического нуля микросхема проваливает напряжение, созданное подтягивающим резистором на землю, соответственно напряжение на линии становится уровня логического нуля. Номиналы этих резисторов не должны быть слишком маленькими, иначе микросхема или датчик могут не справиться с проваливанием линии на ноль. Также не желательно ставить очень большие номиналы, чтобы потенциал логической единицы устанавливался надежно на линиях данных I2C.
На картинке выше представлена диаграмма работы I2C интерфейса датчика атмосферного давления BMP180.
Номиналы можно варьировать от 2,2 кОм до 10 кОм. При сборке схемы был использован китайский модуль на базе датчика BMP180. Такой модуль содержит все необходимое для работы с датчиком - стабилизатор напряжения на 3,3 вольта, конденсаторы необходимые в обвязке датчика и стабилизатора, а также pull-up резисторы (подтягивающие к плюсу питания), необходимые для работы по I2C.
Также в схеме предусмотрена кнопка сброса микроконтроллера, подключенная к выводу PC6 - reset, замыкающая этот вывод на землю при необходимости сброса. Все резисторы постоянного сопротивления по схеме используются мощностью 0,25 Вт или можно использовать в варианте SMD типоразмера 1206. Также конденсаторы емкостью 100 нФ можно использовать в SMD типоразмера 0805 или 1206.
Устройство, собранное по традиции на макетной печатной плате для микроконтроллера Atmega8 на фото ниже:
Для программирования микроконтроллера Atmega8 для данного устройства необходимо знать конфигурацию фьюз битов:
Микроконтроллер работает от внутреннего генератора на 8 МГц. Для программирования использовался программатор USBasp перепрошитый в AVR doper (STK500).
К статье прилагается прошивка для микроконтроллера на комнатную метеостанцию, документация на датчик атмосферного давления BMP180, исходный код прошивки микроконтроллера, а также небольшое видео, демонстрирующее работоспособность схемы (изменение показаний на дисплее вызывает мокрая салфетка, накрывающая датчик влажности и прикосновение пальца к датчику давления и температуры).
Список радиоэлементов
Обозначение | Тип | Номинал | Количество | Примечание | Магазин | Мой блокнот |
---|---|---|---|---|---|---|
IC1 | МК AVR 8-бит | ATmega8 | 1 | Поиск в магазине Отрон | ||
IC2 | ИС I2C интерфейса | PCA9517 | 1 | Поиск в магазине Отрон | ||
IC3 | Датчик атмосферного давления | BMP180 | 1 | Поиск в магазине Отрон | ||
IC4 | Датчик температуры | DHT11 | 1 | Поиск в магазине Отрон | ||
VR1 | Линейный регулятор | L7805AB | 1 | Поиск в магазине Отрон | ||
VR2 | Линейный регулятор | AMS1117-3.3 | 1 | Поиск в магазине Отрон | ||
VD1-VD4 | Выпрямительный диод | 1N4007 | 4 | Поиск в магазине Отрон | ||
C1, C3-C5, C7, C8 | Конденсатор | 100 нФ | 6 | Поиск в магазине Отрон | ||
C2, C6, C9 | Электролитический конденсатор | 220 мкФ | 3 | Поиск в магазине Отрон | ||
R1 | Резистор | 22 Ом | 1 | Поиск в магазине Отрон | ||
R3-R7 | Резистор | 10 кОм | 5 | Поиск в магазине Отрон | ||
R2 | Подстроечный резистор | 10 кОм | 1 | 3296W-1-103LF | Поиск в магазине Отрон | |
R8 | Резистор | 4.7 кОм | 1 | Поиск в магазине Отрон | ||
HG1 | LCD-дисплей | SC1602 | 1 | На базе HD44780 | Поиск в магазине Отрон | |
Tr1 | Трансформатор | BV EI 382 1189 | 1 | 220В - 9В AC | Поиск в магазине Отрон | |
S1 | Тактовая кнопка | TC-A109 | 1 | Поиск в магазине Отрон | ||
Скачать список элементов (PDF)
Прикрепленные файлы:
- 32.hex (14 Кб)
- BMP180.pdf (656 Кб)
- 32.rar (62 Кб)
Комментарии (108) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
[Автор]
[Автор]
[Автор]
[Автор]
А вообще сам что-то тут переделывать не планировал (да и нет DHT22 для отладки)
[Автор]
[Автор]
[Автор]
[Автор]
pca9517 обязателен или его можно заменить, если возможно так чем именно?
[Автор]
[Автор]
[Автор]
Выставил 8МГц внутренний и всё заработало, влагу показывает 65% и остальное вроде похоже на правду.
[Автор]
Поздравляю с удачным запуском!
В начале файла, рядом с другими, определил глобальную переменную:
, а далее, в основном цикле, перед выводом на дисплей, добавил:
if (pressure2 > pressurePREV)
{
if (pressure2 - pressurePREV < 15)
{
pressure2=pressurePREV;
}
}
if (pressure2 < pressurePREV)
{
if (pressurePREV - pressure2 < 15)
{
pressure2=pressurePREV;
}
}
pressurePREV=pressure2;
Число 10-20. Тогда происходит проверка текущего результата измерения (только тысяч Паскалей) с предыдущим, если разница менее 15, то значение на дисплее не меняется.
Результат получился отличным, показания теперь не скачут, а чувствительность сохранена - разница на столе и под потолком четко регистрируется.
Сравниваю давление с местной метеостанцией уже два дня - точность поразительная, до 1 мм.рт.ст.
Решил, что нужно сравнивать разницу нового замера не с предыдущим замером, а с текущим значением на дисплее, и приравнивать их при разнице больше +- 9, вроде на моем датчике этого достаточно для защиты от шумов.
Тестирую на практике новый вариант, вроде все получается, как задумал.
с кодвизиона
Error: C:\WinAVR\avr\include\util\delay_basic.h(66): missing '{'
ну а вмлабу не нравится команды "LCD_" и "BCD_", а так же
* 32.c, line 262: undefined reference to `dht11_gethumidity'
ну и примеры ошибок с ЛСД и БСД
* 32.c, line 228: undefined reference to `LCD_Init'
* 32.c, line 250: undefined reference to `BCD_2Lcd'
Кто сталкивался, подскажите новичку. Только не надо протеус советовать - дойду и до него как-нибудь.
[Автор]
Выложенный мной выше пример сглаживания шума работает, а вот нуль, при желании, лучше гасить просто выводом пробела, а то есть вероятность, что и в младшем числе Па когда-нибудь появится пробел вместо нуля. Сдвиг влево решил не делать, а то при граничном значении, наверное, будет не красиво прыгать.
Mokotoya, вот проект с исправлением, лучше бы предыдущие файлы удалить отсюда. Там есть и функции для вычисления альтитуды, правда для такого расчета вроде нужно корректировать давление на уровне моря.
[Автор]
[Автор]
Давление над уровнем моря берется среднестатистическая, поэтому результат всегда ориентировочный (если только не подставлять постоянно реальное текущее значение)
А насчет Паскалей, это не ветер (показания заметно меняются при изменении высоты от одного метра, однако в кухне реакции на вытяжку не заметно), ведь производитель ясно заявляет параметр low noise в 30 Па RMS (0,25м) в режиме повышенного разрешения, так что это именно случайный шум, абсолютная погрешность измерения заявлена чуть больше +-100 Па.
Так что, так или иначе, сглаживать десятки Паскалей нужно, они все равно ничего не значат, просто для красоты.
[Автор]
[Автор]
[Автор]
[Автор]
Сам то пока обхожусь дешевым DHT-11, вроде дома нормально работает, но в покупных часах года через два-три такой датчик стал сильно занижать показания, хотя может это исключение.
У меня всю зиму показывал 36-38 (DHT11) .
У вас случайно нет проекта в Proteus-е? Буду очень благодарен, если скините. Бьюсь уже не первые сутки над схемой, показание температуры и давления выводит правильные, а вот показания влажности постоянно I5 (не 15). Танцы с бубном вокруг файла проекта dch11.c не помогли ... Хотелось бы попробовать модель
А по метеостанции, решил добавить еще стрелочку, вверх и вниз, для обозначения направления изменения давления, получается немного информативнее и красивше.
[Автор]
А серьезно, то после сборки выяснил, что на максимуме подсветка слишком яркая, ночью мешает, так что так и добавил резистор для ограничения тока до подсветки до 5 мА, на глаз разница не большая.
[Автор]
[Автор]
[Автор]
uint8_t alt_minus = 0; // Флаг знака, 0=положительная или нулевая, 1 = отрицательная;
void bmp180CalcAltitude(int32_t pressure){
float temp;
temp = (float) pressure/101325;
temp = pow(temp, 0.19029);
if (temp > 1) alt_minus = 1; else alt_minus = 0; // Флаг знака альтитуды, 1 = минус;
temp = 1 > temp ? 1 - temp : temp - 1;
altitude = 44330*temp*100; // Результат в см;
А при выводе на дисплей добавлять в нужное место знак :
[Автор]
[Автор]
Погода сейчас переменчивая очень, поэтому расчет высоты с константным значением давления над уровнем моря тоже нестабилен - если только не подставлять постоянно значение текущего давления над уровнем моря
Думаю, что такой косвенный вариант выходит самым экономичным по размеру кода:
// Прибавление 0,5 мм рт ст (66 Па) приводит к округлению результата перевода 0,0-0,4 = 0; 0,5-0,9 = +1;
int pressure3 = (pressure + 66)/133.322; // перевод из Па в мм.рт.ст;
[Автор]
[Автор]
Если Вам требуется подключить датчик уличной температуры, то можно соединить кабелем или через простые трансиверы NRF24L01, только на днях их испытывал, работают не плохо.
Если заинтересует, то могу дать вариант с DS18B20, с правильным расчетом отрицательных показаний, в том числе и десятых долей градуса, что редкость, сколько проектов для примера не искал, везде отрицательные десятые без коррекции.
Если нужно подключение через трансиверы, то надо разделить функцию в передатчике на два этапа, запуск преобразования и чтение-передача данных, чтобы МК во время замера спал. Если потребуется помощь, то мой ник на сайте журнала Радио Sergey7.
PS, при необходимости, в функцию настройки термодатчика, можно добавить команду копирования настроек из ОЗУ в EEPROM
[Автор]
[Автор]
Ну а если хочется по правильному согласовать уровни, вдруг надо еще чего к шине подцепить, то вот схема, слева МК, справа датчик, если изловчиться, то 3В можно взять прямо с платы модуля, если она со стабилизатором, или поставить внешний.
[Автор]
[Автор]
[Автор]
[Автор]
[Автор]
[Автор]
[Автор]
[Автор]
[Автор]