Введение Я опытный пользователь бытовых метеостанций, и это двойная беда.
Во-первых, я уже настолько привык знать погоду внутри и снаружи дома, что отсутствие этой информации вводит меня в состояние когнитивного диссонанса.
Во-вторых, мне хронически не везет с метеостанциями.
Два из них сломались и, как говорят в таких случаях о всяких индикаторных приборах, начали «показывать погоду», только с точностью до наоборот, показывали что угодно, только не погоду.
Я привез с собой из Штатов третий, который прослужил мне верой и правдой целый год, и я начал потихоньку расслабляться, но тут случайно заглянувшие родители (и дали нам с женой возможность временно поставить забота о нашем сыне на их плечах и выбежала из дома), попала в аварию.
приступ вынужденного беспокойства, что, в свою очередь, вызвало острое желание помыть окна.
Результат тщательной полировки окон – не только сверкающие стекла, но и соскочивший датчик метеостанции.
Это второй этаж, поэтому вряд ли датчик сломается, но, как известно, прямо под окнами каждой многоэтажки существует невидимая пространственно-временная сингулярность.
Не знаю, можно ли описать это явление в рамках Стандартной модели, но нет сомнений, что в основе сингулярности лежит принцип «что падает, то теряется».
Так что датчика я не нашел.
Естественно, необходимость смены устройства возникла в полной силе, но мысль о том, что ни один из «бывших» не продержался в моем доме больше года, настораживала.
И тут возникла мысль «а не сделать ли мне самомуЭ» пришло мне в голову.
Предпосылки для такого развития событий были.
Техническое образование позволило мне трезво оценить свои силы; богатое радиолюбительское детство дало мне надежду, что я смогу справиться не только с программной частью, но и с аппаратной частью, хотя бы примитивной, проблем тоже быть не должно.
К тому же, в отличие от покупных станций, ремонтопригодность самодельного решения гораздо выше, а про настраиваемость вообще молчу.
Изначально идея заключалась в том, чтобы создать ряд датчиков температуры и влажности, расположенных в разных частях дома и на его внешних стенах, и центральный блок.
Датчики должны были принимать данные и передавать их в центральный блок, который, в свою очередь, должен был их визуализировать.
В качестве побочного функционала мы рассматривали возможность отправки данных по Ethernet на существующий сервер с целью сбора статистики (люблю посмотреть «как было») и последующей передачи на живущие дома гаджеты типа iPad, iPhone, Android и прочая электронная нечисть.
Очень быстро (а именно на этапе изучения возможностей не очень дорогих микроконтроллеров и имеющейся в продаже периферии) идея визуализации на центральном блоке отмерла, поэтому вариант отправки на сервер с последующей визуализацией на подручных устройствах приобрел статус главного.
Платформой для реализации идеи была выбрана Arduino. Причины: развитая инфраструктура, много примеров, много комплектующих в продаже, цена (если говорить о зеркальных китайских клонах, а не о настоящей Ардуино), доступность (благо на Ebay их можно найти немало и на любой вкус).
вкус).
В принципе, то же самое можно было бы реализовать и на голых контроллерах, но с учетом того, что я только осваивал технологию, увеличивать существующий порог входа мне не хотелось.
Единственное, хоть погодный датчик и не является эстетичным устройством, но мне не хотелось вешать на стену гроб с линейным размером 20 см, поэтому за основу был выбран Arduino Pro Mini, а не какой-нибудь внушительных размеров.
Уно.
Итак, концептуально система состоит из четырех частей:
- Датчики погоды.
Задача — измерить погоду и отправить данные по радиоканалу в центральный блок.
- Центральный блок.
Задача — получить данные о погоде, обернуть их в HTTP и отправить на сервер.
- Сервер.
Задача — получить данные от центрального блока, сохранить их в базе данных и передать в виде, удобном для визуализации на всевозможные домашние гаджеты.
- Устройства визуализации.
Задача — показать пользователю погоду
Протокол обмена
Прежде чем перейти к описанию компонентов системы, следует совершить краткий экскурс в протокол и принцип обмена данными в эфире.Радиообмен осуществляется на базе библиотеки Виртуальный провод , который уже имеет средства «правильной» передачи, такие как манчестерское кодирование и проверка контрольной суммы.
Поверх этой библиотеки был реализован микропротокол с фиксированной структурой пакетов.
Каждый пакет состоит из трёх полей — адреса передающего устройства (uint16), типа датчика (int16) и данных (float).
Никакой дополнительной проверки корректности входящих данных, кроме проверки длины пакета, не производится, поскольку дополнительные меры безопасности реализуются на стороне сервера, где в конечном итоге и окажутся данные.
Адрес передающего устройства генерируется случайным образом при включении устройства, если он не был сгенерирован ранее, и записывается в EEPROM. Каждое устройство имеет право передавать столько показаний от разных типов датчиков, сколько пожелает. Итак, каждый погодный датчик передает два пакета — пакеты с показаниями температуры и показаниями влажности.
Таким образом, радиосеть организована с топологией «общая шина», но без каких-либо возможностей высокого уровня, таких как обнаружение коллизий и гарантии доставки.
Если два устройства попытаются передать данные одновременно, данные будут потеряны из-за конфликта.
Реализация микропротокола была упакована в отдельную библиотеку, содержащую два основных метода — отправку и получение.
Все остальные методы являются служебными, необходимыми, например, для генерации адреса передающего устройства.
Исходный код библиотеки
// This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // Created by Andrey Filimonov 2014 #ifndef WIRELESSSENSORPIPE_H #define WIRELESSSENSORPIPE_H #if ARDUINO >= 100 #include "Arduino.h" #else #include "WProgram.h" #endif class WirelessSensorPipe { public: enum SensorType { TEMPERATURE = 0, HUMIDITY, PRESSURE, WATERFLOW, HEATERSETPOINT, HEATERFLAMEENABLED, HEATERRWTEMPERATURE, HEATERTARGETROOMTEMPERATURE }; struct Packet { int16_t id; SensorType type; float value; }; private: Packet data; int16_t _id; public: void begin(uint16_t transmitPin, uint16_t receivePin, uint16_t pttPin = 10, uint16_t eepromAddress = 0); void send(SensorType type, float value); bool receive(Packet& packet, uint16_t timeout = 30000); int16_t id() {return _id;}; private: void EEPROMWriteInt(int p_address, int16_t p_value); int16_t EEPROMReadInt(int p_address); }; #endif
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
// Created by Andrey Filimonov 2014
#include "WirelessSensorPipe.h"
#include "VirtualWire.h"
#include "EEPROM.h"
//#define DEBUG
void WirelessSensorPipe::EEPROMWriteInt(int p_address, int16_t p_value)
{
byte lowByte = ((p_value >> 0) & 0xFF);
byte highByte = ((p_value >> 8) & 0xFF);
EEPROM.write(p_address, lowByte);
EEPROM.write(p_address + 1, highByte);
}
int16_t WirelessSensorPipe::EEPROMReadInt(int p_address)
{
byte lowByte = EEPROM.read(p_address);
byte highByte = EEPROM.read(p_address + 1);
return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
}
void WirelessSensorPipe::begin(uint16_t transmitPin, uint16_t receivePin, uint16_t pttPin, uint16_t eepromAddress)
{
// Initialise the IO and ISR
vw_set_rx_pin(receivePin);
vw_set_tx_pin(transmitPin);
vw_set_ptt_pin(pttPin);
vw_setup(256);
Теги: #Сделай сам или Сделай сам #Умный дом #arduino #ethernet #majordomo #метеостанция #датчик температуры и влажности
-
Японский Троянец Шантажирует Порносерферов
19 Oct, 24 -
История Visual Studio. Часть Ii
19 Oct, 24