С началом отопительного сезона встал у меня вопрос измерения влажности в квартире, в оффлайне цены на гигрометры высокие, а точность никакая. Так как я давно хотел опробовать ардуино решил сделать на его основе метеостанцию. Погуглив выяснил что повсеместно используются дешевые датчики DHT11(Возможно и DHT22), которые очень врут и не откалиброванные, поэтому был найден герой обзора. В датчике si7021 заявлено высокая скорость, точность и защищенность и всего на бакс дороже.
Характеристики.
Влажность
Точность: ± 3% (макс), 0-80%
Рабочий диапазон: от 0 до 100%
Температура
Точность: ± 0,4 ° C (макс), от -10 до 85 ° C
Рабочий диапазон: от -40 до +125 ° C
Рабочее напряжение (От 1,9 до 3,6 В)
Низкое энергопотребление
150 мкА активный ток
60 нА ток в режиме ожидания
Заводская калибровка
интерфейс I2C
Встроенный нагреватель на чипе
Даташит
Пока его заказывал естесно заказал еще кучу датчиков и принялся ждать.
Пока я его ждал случайно нашел в продаже на рынке часы настенные с метеостанцией
PEARL (не реклама, брал не тут).
В общем в этой метеостанции было все что нужно, главное часы идут без рывков, плавно и бесшумно и все приборы аналоговые, было принято решение брать, а ардуину использовать по прямому назначению – изучать програмирвание микроконтроллеров. Как потом выяснилось показания датчиков практически совпали с этой метостанцией.
Когда все пришло, для своей метеостанции я выбрал:
Arduino UNO SMD R3
LCD 1602+HD4478(I2C)
Si7021
BMP180 (Давление и температура)
Провода
Также решил добавить датчик освещенности
TSL2561 (люксометр) и переключать все режимы
пультом.
В планах добавить модуль RTC
Ds3231, чтобы время точное показывало.
Передачу информации куда либо по сети не планирую.
Все датчики приходят с не припаянными колодками, придется попаять, тоже самое с дисплеем. На дисплее нужно подкрутить контраст, паять нужно с двух сторон платы. Все элементы подключаются по шине I2C, у каждого свой адрес. Все датчики я соединил в шину четырех проводную по интерфейсу и питанию, для дисплея и инфракрасного приемника нашлись выводы на ардуине.
Выложу ряд скетчей под каждый датчик/модуль. В каждой Библиотеке есть свои примеры.
Для тех, кто только начинает
Arduino IDE
Библиотеки класть например в %UserProfile%/Documents/Arduino/libraries/
При конфликте с установленными библиотеками, из папки программы /Arduino/libraries/ их нужно удалить.
Драйвер я нашел через david.info по коду в диспетчере устройств, в IDE выбрал порт ардуины.
Сканер устройств I2C
Скетч
#include <Wire.h>
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
while (!Serial)
{
}
Serial.println ();
Serial.println ("I2C scanner. Scanning ...");
byte count = 0;
Wire.begin();
for (byte i = 8; i < 120; i++)
{
Wire.beginTransmission (i);
if (Wire.endTransmission () == 0)
{
Serial.print ("Found address: ");
Serial.print (i, DEC);
Serial.print (" (0x");
Serial.print (i, HEX);
Serial.println (")");
count++;
delay (1); // maybe unneeded?
} // end of good response
} // end of for loop
Serial.println ("Done.");
Serial.print ("Found ");
Serial.print (count, DEC);
Serial.println (" device(s).");
} // end of setup
void loop() {}
Результат
I2C scanner. Scanning…
Found address: 39 (0x27)
Found address: 57 (0x39)
Found address: 64 (0x40)
Found address: 119 (0x77)
Done.
Found 4 device(s).
Видим экран,TSL2561 ,Si7021, BMP180
Вывод из COM порта на LCD
Библиотека LCD руссификация
Будьте внимательны, Serial нужно обязательно писать с большой буквы.
Подключение/Скетч
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup()
{
lcd.begin();
Serial.begin(9600);
// initialize the lcd
// Print a message to the LCD.
for(int i = 0; i< 3; i++)
{
lcd.backlight();
delay(250);
lcd.noBacklight();
delay(250);
}
lcd.backlight(); // finish with backlight on
lcd.setCursor(0,0);
lcd.print("Hello, world!");
}
void loop()
{
// when characters arrive over the serial port...
if (Serial.available())
{
// wait a bit for the entire message to arrive
delay(100);
// clear the screen
lcd.clear();
// read all the available characters
while (Serial.available() > 0)
{
// display each character to the LCD
lcd.write(Serial.read());
}
}
}
Датчик Si7021
Библиотека
Подключение/Скетч
#include <Wire.h>
#include <SI7021.h>
#include <LiquidCrystal_I2C.h>
SI7021 sensor;
LiquidCrystal_I2C lcd(0x27, 16, 2);
int temp1,hum1;
void setup()
{
lcd.begin();
Serial.begin(9600);
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Hello, world!");
}
void loop()
{
si7021_env data = sensor.getHumidityAndTemperature();
temp1=data.celsiusHundredths-data.celsiusHundredths/100*100;
hum1=data.humidityBasisPoints-data.humidityBasisPoints/100*100;
Serial.print("Temperature ");
Serial.print(data.celsiusHundredths/100);
Serial.print(",");
Serial.print(temp1);
Serial.println(" `C");
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Temp ");
lcd.print(data.celsiusHundredths/100);
lcd.print(",");
lcd.print(temp1);
lcd.print(" `C");
Serial.print("Humidity ");
Serial.print(data.humidityBasisPoints/100);
Serial.print(",");
Serial.print(hum1);
Serial.println(" \%");
Serial.println(" ");
lcd.setCursor(0,1);
lcd.print("Hum ");
lcd.print(data.humidityBasisPoints/100);
lcd.print(",");
lcd.print(hum1);
lcd.print(" \%");
delay(5000);
}
Показания дублируются в порту
Датчик TSL2561
Библиотека
Подключение/Скетч
#include <Wire.h>
#include <TSL2561.h>
TSL2561 tsl(TSL2561_ADDR_FLOAT);
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
if (tsl.begin()) {
Serial.println("Found sensor");
} else {
Serial.println("No sensor?");
while (1);
}
//tsl.setGain(TSL2561_GAIN_0X); // set no gain (for bright situtations)
//tsl.setGain(TSL2561_GAIN_16X); // set 16x gain (for dim situations)
// Changing the integration time gives you a longer time over which to sense light
// longer timelines are slower, but are good in very low light situtations!
tsl.setTiming(TSL2561_INTEGRATIONTIME_13MS); // shortest integration time (bright light)
//tsl.setTiming(TSL2561_INTEGRATIONTIME_101MS); // medium integration time (medium light)
//tsl.setTiming(TSL2561_INTEGRATIONTIME_402MS); // longest integration time (dim light)
}
void loop() {
uint32_t lum = tsl.getFullLuminosity();
uint16_t ir, full;
ir = lum >> 16;
full = lum & 0xFFFF;
Serial.print("Lux: "); Serial.println(tsl.calculateLux(full, ir));
delay(1000);
}
В примерах больше настроек, может менять период измерения а также расделять спектр на видимый и инфракрасный.
Инфракрасный порт(приемник)
Библиотека
Подключение/Скетч
/*
* Sketch modified by Enjoying Electronics: http://www.instructables.com/member/Enjoying+Electronics/
Code based off of:
* IRremote
* Version 0.1 July, 2009
* Copyright 2009 Ken Shirriff
* For details, see http://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html
* Special thanks to dablondeemu http://www.instructables.com/member/dablondeemu/
* and his instructable listed below, IR Remote Controlled Color Changing Cloud (Arduino)
* http://www.instructables.com/id/IR-Remote-Controlled-Color-Changing-Cloud-Arduino/
* Lets get started:
The IR sensor's pins are attached to Arduino as so:
Pin 1 to Vout (pin 11 on Arduino)
Pin 2 to GND
Pin 3 to Vcc (+5v from Arduino)
*/
/*******************CODE BEGINS HERE********************/
#include <IRremote.h>
int IRpin = 11;
IRrecv irrecv(IRpin);
decode_results results;
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
}
void loop()
{
if (irrecv.decode(&results))
{
Serial.println(results.value, DEC); // Print the Serial 'results.value'
irrecv.resume(); // Receive the next value
}
}
Из этого скетча мы в порту наблюдаем код сигнала и также видим что зажатие любой кнопки генерирует одинаковый код.
Датчик BMP180
Библиотека
Все вместе
Дополнительная информация
#include <Wire.h>
#include <SI7021.h>
SI7021 sensor;
#include <TSL2561.h>
TSL2561 tsl(TSL2561_ADDR_FLOAT);
#include "LiquidCrystal_I2C.h"
#include <LCD_1602_RUS.h>
LCD_1602_RUS lcd(0x27, 16, 2);
#include <Adafruit_BMP085.h>
Adafruit_BMP085 bmp;
#include <IRremote.h>
int IRpin = 11; // pin for the IR sensor
IRrecv irrecv(IRpin);
decode_results results;
unsigned long previousMillis; //для контроля обновления показаний с шагов секунду
void Si7021()
{
si7021_env data = sensor.getHumidityAndTemperature();
double temp1=(double)data.celsiusHundredths/100.0;
double hum1=(double)data.humidityBasisPoints/100.0;
lcd.clear();
lcd.setCursor(0,0);
lcd.print(L"Темп ");
lcd.print(temp1);
lcd.print(L" °C");
lcd.setCursor(0,1);
lcd.print(L"Влажн ");
lcd.print(hum1);
lcd.print(" \%");
}
void Light()
{
uint32_t lum = tsl.getFullLuminosity();
uint16_t ir, full;
ir = lum >> 16;
full = lum & 0xFFFF;
lcd.clear();
lcd.setCursor(0,0);
lcd.print(L"Освещенность ");
lcd.setCursor(1,1);
lcd.print(tsl.calculateLux(full, ir));
lcd.print(L" люкс");
}
void BMP085()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print(L"Темп ");
lcd.print(bmp.readTemperature());
lcd.print(L" °C");
double pr=(double)bmp.readPressure() / 133.3224;
lcd.setCursor(0,1);
lcd.print(L"Давл = ");
lcd.print(pr,1);
lcd.print(L" мм");
}
void setup()
{
tsl.begin();
//tsl.setGain(TSL2561_GAIN_0X); // set no gain (for bright situtations)
//tsl.setGain(TSL2561_GAIN_16X); // set 16x gain (for dim situations)
// Changing the integration time gives you a longer time over which to sense light
// longer timelines are slower, but are good in very low light situtations!
tsl.setTiming(TSL2561_INTEGRATIONTIME_13MS); // shortest integration time (bright light)
//tsl.setTiming(TSL2561_INTEGRATIONTIME_101MS); // medium integration time (medium light)
bmp.begin();
lcd.begin();
sensor.begin();
lcd.backlight();
irrecv.enableIRIn(); // Start the receiver
}
int sv;
int interval=2000;
void loop()
{
if (irrecv.decode(&results))
{
irrecv.resume(); // Receive the next value
}
unsigned long currentMillis = millis();
if (results.value != 4294967295) {
sv=results.value;
}
if ((unsigned long)(currentMillis - previousMillis) >= interval) {
switch(sv) {
case 16738455:
Si7021();
break;
case 16750695:
Light();
break;
case 16756815:
BMP085();
break;
default:
Si7021();
}
previousMillis = currentMillis;
}
}
Общий вид плюс режимы поочереди
В первом режиме при запуске показываются температура и влажность с Si7021.
Во втором – освещенность с TSL2561.
В третьем – температура и давление с BMP180 (температура всегда выше чем у первого датчика, первому я доверяю больше).
Режимы переключаются пультом.
Потребление порядка 0,01А — 0,03 А (Показания Синего доктора, белый не показал ничего)
Питается от моего самодельного повербанка.
Вопросы к знатокам:
- В инете мало информации(или я плохо вьехал) о интерфейсе I2C. Я не понял правильно ли я все подключил, у датчиков питание 3,3 В, а у дисплея 5 В, можно ли их без преобразователя логических уровней соединять в одну шину? Есть ли у HD4478 подтягивающие резисторы? И есть ли они у модуля часов?
- Подскажите програму для рисования соединений, таких как я выложил, Fritzing мне кажется чтото не то.
- Планирую в другом проекте подключение 4х реле к ардуине, можно их просто запитать от ардуины, или лучше от внешнего питания, если возможность снять с ардуины чистое входное питание, в обход всех стабилизаторов? Что будет, если запитаться от vin?
- Была у меня идея сделать пульсометр света на основе фоторезистора , но его паказания совсем не совпадали с показаниями датчика освещенности, наверно он совсем для этого не годится?
А так в принципе все работает и не жалуется. Показания датчика выглядят достойно и с большой точностью. Можно еще задействовать память и выводить архивные и усредненные показания, но это потом, а пока для обзора датчика сойдет, своего однозначно стоит.
На изменение влажности реагирует плавно, в разных комнатах показывает по разному, при включении увлажнителя показания начинают расти, Влажность дыхания 66%, падает быстро, растет медленно На открытом балконе показал 3.9 градуса и 71% влажность, это в Киеве.
Но за труды +
Вы слышали о таком Дале Владимире Ивановиче? Это русский учёный, писатель и лексикограф, военный врач, составитель «Толкового словаря живого великорусского языка». Вот он авторитет. И он по этому поводу сказал следующее:
ложат на поверхность и это лежащее там называется ложью
например ложные знание — это поверхностные знания
кладут во внутрь чего-то и это называется кладом
например кладезь знаний
ну а кто гуский язык учил по учебникам дитмара эльяшевича розенталя, то там да, жопа есть, а слова нет
Или вы действительно не видите разницы между ложными и поверхностными знаниями?
Один герой книг Артура Конан Дойля, как я помню, сжигал толковый словарь только за то, что в нём утверждалось, что слова «понимать» и «подразумевать» — суть одно то же.
так это неправильно
неверные знания — это не соответствующие действительности, а ложные — это не полные
все правильно делал, а то каждый умник свои толкования словарит
Для меня ваша компетентность в русском языке уже стала очевидной. После «хочешь» без мягкого знака, и после «чуш» чуть ниже. Спасибо.
PS: А если я вам на полном серьёзе посоветую принимать галаперидол, то таблетку на поверхность языка вы будете «ложить» или «класть»?
И внутри в желудке эта таблетка у вас будет рассасываться, как «ложная» или как «кладезь»?
Есть в других языках. В украинском, например. Был в старославянском. Остался в церковнославянском.
Но мы тут общаемся именно на русском.
А в нём такого слова нет.
Вы однозначно понимаете значение речевого потока, которое можно записать как «ложить».
А стало быть, факт существования слово «ложить» есть. Слово существует.
Мы можем подискутировать на тему правомерности применения слова в том или ином виде.
Но не на тему существования слова как одной из структурных единиц языка, которая служит для именования предметов, их качеств и характеристик, их взаимодействий, а также именования мнимых и отвлечённых понятий, создаваемых человеческим воображением.
Человек на 70% состоит из воды.
Оптимальная влажность воздуха для человека составляет 40-60%. Сухой воздух (влажность ниже 40%) ухудшает общее самочувствие и даже у здоровых людей вызывает сонливость, сухость кожи и слизистых оболочек, а также повышает вероятность заболеваний острыми респираторными инфекциями.
Не стоит забывать, что влажность величина относительная. Показывает сколько процентов воды в воздухе, от тех 100, которые могли бы в нем находиться при данной температуре. В абсолютном выражении более холодный воздух удерживает влаги меньше, чем более теплый. Поэтому в холодное время года, пусть на улице хоть 100% влажность при проветривании, и дальнейшем нагреве воздуха в жилище, имеем обычно 20-25%, чем чаще проветриваем, тем суше. Что очень сухо, и отрицательно сказывается на комфорте и здоровье.
Не сочтите за издевку — может у вас не так велика разница температур снаружи и внутри?
У меня дома отопление не регулируется и в результате большая разница с наружным воздухом весь отопительный сезон. Весь отопительный сезон процентов 20 стабильная влажность. Постоянно сухо во рту и в глотке, и сухими глазами больно моргать.
DHT22 чувствует дыхание стоящего рядом (0.5м) человека уже секунд через 30.
Позавчера тоже заказал si7021 на пробу. Подключать буду к esp8266.
Висит данный датчик на улице уже 1.5 года и продолжает работать, хотя до него 2 AM2320 проработали 2 недели, сдохла влажность (показывает всегда 1.4), температуру показывают до сих пор.
Датчик за балконом на удалении от стены еще на 0.5 метра. Закрыт от прямого попадания воды и солнца.
При повышенной влажности (порядка 80% и выше) начинает врать в большую сторону, что совпадает с даташитом. Во время дождя (температура резко падает) датчик показывает не просто 100%, а даже выше. Пришлось программно отрезать на 99.9%, чтобы народмон.ру принимал показания.
У нас бывают моменты с низкой облачностью (выше 10 этажа все в тумане) с конденсацией воды — т.е. условия приближенные к 100% влажности. В результате график влажности упирается в 99.9 на несколько часов.
При средней влажности показания более адекватные.
Температуру показывает вполне точно в сравнении с AM2320, расхождение обычно не более 0.5 градуса. В морозы отработал без проблем.
Вывод: применим для помещений без запредельной влажности.
Но действительно, где обзор самого датчика?
Тесты, сравнения…
У вас вижу только способ его применения.
Больше похоже на обзор домашней метеостанции.
Вот этот проек по мне более удачный.
homes-smart.ru/index.php/oborudovanie/bez-provodov-wi-fi/proekt-umnogo-modulya-na-baze-esp8266
narodmon.ru/
BMP180 тоже завышает, но реже и он менее инертный.
А вот DS18B20 показывает точнее, хоть и инертный. В таком корпусе:
Потому и поделился личным опытом, чтобы мы все могли использовать больше статистики реального использования этих датчиков.
BMP180 и DS18B20 врут относительно них на пару градусов. Специально подключал все датчики к одному контроллеру и одновременно на экран выводил.
У меня на ESP8266 Core для Arduino IDE все работает нормально. Если и перезагружается, то сама выходит в режим.
Были странные зависания на одном роутере, когда перезагрузка не спасала, даже пришлось сторожевой таймер внешний реализовать. Но все решилось заменой роутера
Насчет фоторезистора для измерения пульсаций освещенности — почему нет?
Хоть у них и довольно высокая инерционность, но не для этого применения — пульсации интересуют в основном низкочастотные, а фоторезисторы тянут до единиц килогерц.
Так что можно.
А так да, интересно.
Только к давлению еще бы его изменение, ибо емнип именно перепады давления сигнализируют об изменении погоды.
Вот тут еще есть информация, плюс другая библиотека…
elchupanibrei.livejournal.com/23293.html
Сегодня заказал себе пару датчиков освещения и давления, а всё остальные компоненты у меня в уже имеется. На выходных точно повторю Ваш проект, но пока без двух датчиков.
Спасибо за интересный обзор. + от меня в карму.
«Внизу» точность выходит не очень — небо дает 1-2%, видимо надо более вдумчиво фильтровать шумы. А вот «вверх» диапазон отменный, некоторые светодиодные лампочки дают под 300% :) благо по формуле из нового ГОСТа к-т пульсаций сверху не ограничен.
Не должно быть. На I2C резисторы обычно вешают около мастера — чтобы при отключении слейвов шина продолжала работать.
Я рисую в Orcad Capture. Но это монстр и покупать её для дома бессмысленно (ну, про обходные пути я промолчу :) ).
А так — Eagle, KiCad. До черта их всяких: en.wikipedia.org/wiki/Schematic_capture
Ко мне пока едут…
подробности тут
вот еще про датчик освещенности BH1750FVI. что лучше TSL2561 или BH1750FVI не знаю
Спасибо за обзор!
едиственное приемущество убогого DHT22 это его можно кинуть на длинные провода. с HTU21D такое не пройдет тк он использует i2c шину
Подскажите тип датчика в данном девайсе… Где можно приобрести датчик. Хотелось бы на пасеке в каждый улей вставить.
Влажность — меряет внутри себя, а не на выносном датчике.
Решил не включать в обзор, вещь необязательная, можно снять защитное покрытие и будет красивы прозрачный корпус, хотя это не корпус, а как пишет китаец: оболочка/чехол, плата фиксируется внутри и впритык покрывается снаружи, внутрь больше ничего не вставить, хотя может можно чтото и приделать сверху.
Датчики выполняются из пьезоматериалов, полимерного конденсатора. Материалы и «обвеска» разные, качество тоже и цена соответственно в разы выше у более точных и стабильных датчиков.
(фото вскрытого DHT22 не мое) DHT22, SEN0137/AM2302, Si7021-A20, HTS221, HIH-4010/4020/4021, BMP180, SHT71, SHT75.
После всего изученного, я лично в итоге не стал заморачиваться, показывает приблизительно и ладно, потому что точный и калиброванный на заводе датчик стоит от 50 баксов, смысла таких для погодной станции не вижу (хотя в других проектах наверняка нужны). Мне важно чтобы показания были приемлемыми для «организма» :) влажность от 50% до 70%, температура от +18 до +28 градусов, а на улице чтобы знать как одеваться, датчик давления — тут важна в принципе не величина давления (мое мнение), а перепад — если резко уменьшается, значит к «слякоти», если увеличивается — к хорошей солнечной погоде (хотя для стариков важен и показатель давления, они «погоднозависимые» как раз из за величины давления).
И почитайте еще вот эту статьи, может кому то поможет:
«Поверка и калибровка гигрометра DHT22» www.kandrsmith.org/RJS/Misc/calib_dht22.html
«Сравнение DHT22, DHT11 и Sensirion SHT71» www.kandrsmith.org/RJS/Misc/calib_dht22_dht11_sht71.html
А по поводу «механической» погодной станции «PEARL» могу сказать, что у меня такая уже 15 лет «молотит» (покупал в 2000 году). Купил себе и еще паре родственников как раз за их тихий ход часов. Правда по прошествии лет десяти, стали уже «погромче», когда механизм толкает стрелки часов наверх. При покупке трех штук оказались очень разные на них показания, пришлось калибровать по данным гидрометеослужбы аэропорта, на улице (сзади отвинчиваются крышки и настраиваются все без исключения).
конвертер экрана для «стыковки» логических уровней входов — выходов устройств между собой, так как если говорить без лишних объяснений и грубо — логический «0» у 5 вольтового порта почти что равен уровню «1» для 3-х вольтового, а логическая «1» 3 вольтовика это практически может восприняться 5-ти вольтовиком как «0». То есть будут «глюки». Да и входы с 3 вольтовки могут погореть от 5ти вольтовки, поэтому и применяются «шилды» переходники. И питаются они по сути от разных источников — от +5 и от +3,3 вольта. Для этого применяется модуль регулятора напряжения AMS1117 3,3В
или вот такая «приблуда»
Да ладно. Гигрометр-психрометр ВИТ-1или ВИТ-2. Цена деления 0,1 градуса. Включены в государственный реестр средств измерений.
Цена от 200 руб.
На работе у меня два таких уже 8 лет, ежегодную поверку проходят без проблем и домой себе такой же взял, калибровать китайские термостаты и термодатчики.
щас возможно тупой вопрос задам, но: измеряет ли si7021 влажность при отрицательных температурах воздуха?
я конечно же читал его ТТХ:
но недостаток опыта не позволяет мне сделать какой-либо вывод
кто что знает?
ЗЫ чтение даташита ничего не прояснило (
здесь реально помогут расставить все точки над " i ".
*
1) Можно ли подключить к ардуине (про мини) на 5 вольт? Параллельно LCD?
2) Какой максимальной длины провода можно использовать для датчика?
Брал у разных продавцов. Проверено около 20 штук.
Показания температуры зимой завышают, летом занижают. Влажность вообще не коррелирует с реальностью.
Месяц снимаю показания с si7021. Результат нравится больше, но пока мало статистики. И датчик задействован пока всего один.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.