Моніторінг температури у будинку

Вартість енергоносіїв вимагає бути від сучасних будинків енергоефективними. Одного дня було вирішено перевірити наскільки температура всередині будинку залежить від температури на вулиці коли вдома немає опалення. Щоб ще зробити треба просто розташувати кілька вимірювачів температури, зібрати показники та намалювати графік. У якості бази вже є InfluxDB, для малювання графіків є Grafana. Також є openvpn сервер, котрий дає можливість підняти VPN та мати можливість записувати дані у InfluxDB звідки завгодно.

Система сбору даних

Центральним компонентом системи сбору даних буде одноплатний комп’ютер OrangePi One.  Його вибір обгрунтований тим, що він в мене просто був. Маючи armbian його дуже просто підключити до мережі та мати підключення до бази. У якості вимірювачів температури я узяв 10 шт BME280 які просто лежали та чекали свого часу. Прочитати значення з датчика за записати в базу виявилось не так просто. З записом у базу няких складностей – java має бібліотеку, береш дані та пишеш. З збиранням даних виникли складності.

Спроба перша

Коли OrangePi має gpio та SPI/I2C шину, java має бібліотеку pi4j написати програму на java щоб прочитати значення немає проблем, так воно й вийшло. Програма працює значення зчитуються але… В мене 10 датчиків, це означає що просто так їх на шині i2c використовувати одночасно не можна, бо вони мають тільки 2 унікальних адреса. Враховуючи що вони можуть отримувати живлення по шинам GND/SDA/SCL та працювати без живлення, комутувати датчики окремим дротом живлення не вийде. Шина SPI має сигнал CS та теоретично за допомогою нього можна обирати який датчик читати. Апаратний SPI контролер у OrangePi не дозволяє змінювати СS пін, тому був проведений тест з software spi – все начебто працює за винятком одного – датчик не працював коли відстань від плати до датчика була більше ніж десятки сантиметрів. Для  будинку це не підходить. Тому ці спроби були припинені та вирішено було додати апаратне забезпечення біля кожного датчика.

Спроба друга та остання

Прочитати дані з BME280E можна за допомогою arduino чи ESP8266/ESP32. ESP8266/ESP32 навіть має WiFi що дозволяє легко передавати данні, але WiFi вимагає точки доступу та живлення до кожного датчика. Якщо вести дроти до кожного датчика, то навіщо нам WiFi та точка доступу? Було вирішено використовувати Modbus з 4-м дротом живлення. Як результат система має таку структуру:

Серверна частина

Java додаток немає нічого складного – Modbus master котрий періодично опитує кожен датчик, та потім передає ці данні в InfluxDB. Враховуючи що мобільна мережа не ідеальна, у випадку відсутності з’єднання з базою данні записуються локально, а потім передаються до бази як з’явиться з’єднання.

Датчик

Для датчика був обраний процесор ATMega88 (колись я вже грався з Modbus, тому знав що з 4 кб пам’яти може не вистачити). Беремо Arduino IDE, додаємо Modbus бібліотеку, тестуємо – все працює. Додаємо бібліотеку BME280, компілюємо та отримуємо повідомлення що 8 кб флеш пам’яти це мало. AtMega168 коштує на 11 грн дорожче, тому ми беремо Atmel Studio, пишемо все що треба без усяких ардуіно та отримуємо прошивку розміром 7,5 кБ.  Знаходимо вже кілька готових плат, на котрих можна створити тестовий макет, збираємо кілька датчиків та отримуємо такий тестовий стенд:

Після кількох годин роботи тестовий стенд p 3-х датчиків температури на столі та одного на вулиці дозволив отримати такий графік:

Також з’ясувалось, що для передачі даних треба 100-150 кБ трафіка на годину. Тобто придбаного пакета від лайфа, котрий має 600 Мб за 25 грн на місяць повинно вистачити.

Код серверної частини та датчиків можна знайти за посиланням – Collect data from BME280 sensors (github.com)

Датчик оптимізовано для AtMega88, є версія для AtMega168 яка додтково підтримує датчик AM2315 одночасно з BME280