В сегодняшней статье речь пойдет о датчике температуры и влажности на базе процессора atmega328p-mu. Это более «мелкая» версия(абсолютный аналог) изветного всем ардуинщикам процессора atmega328p-au (Arduino Uno, Pro Mini, Nano). Если кто то ранее читал мои статьи то знает что я предпочитаю Mysensors. Что это? Это очень простая и хорошо проработанная и что немаловажно отлично описанная библиотека под Ардуино ИДЕ (и не только) для создания IOT радиосетей на частотах 2.4Ггц, 915, 868, 433 Мгц, а так же проводных сетей на интерфейсе 485, возможно не все упомянул, тк протокол постоянно развивается, все время что то добавляется.
Первое что было сделано, это собственно сам датчик на PCB плате. Делал без оглядки на корпус, по принципу, главное сделать датчик а уж корпус как нибудь да напечатаю,… да уж, не делайте так :). По сути сам датчик это та же ардуинка Про Мини, радиомодуль nRF24l01, датчик температуры и влажности SHT20, только без проводов и термоклея. Из «прибамбасов» это внешняя SPI флешка для прошивки по воздуху(для работы требуется бутлоадер ДуалОптибут, в последствии я перестал их(флешки) ставить на платы, тк пара прошивок по воздуху и полбатарейки нет) и «крипто микра» ATSHA204A так сказать для полного железного комплекта(в Mysensors для активации подписей, шифрования и тп достаточно просто указатать в начале скетча нужные #def).
Саму плату делал в программе Диптрейс, посмотрев видеоуроки на Ютубе, вначале показалось это чем то «адским», но на самом деле все оказалось не так уж и сложно. Платы заказывал в Китае на сайте jlcpcb.com, 2 бакса, любой цвет, и через 2 недели вы уже получаете на руки 10 штук «своего творения» :).
Следующим этапом была разработка корпуса. О, это как оказалось еще та проблемка. Вообщем легких путей не искал, решил осваивать Солид Воркс. Как оказалось это совсем не как с Диптрейс. Тем не менее все же рекомендую именно этот редактор к изучению. Процесс обучения растянулся на месяц неспешного просмотра видеоуроков на Ютубе и повторения материалов урока в редакторе. В процессе разработки корпуса стало понятно что делать плату устройства без учета параметров будующего корпуса это плохое решение, из сериии вставляем палки в свои же колеса. По итогу версий плат вышло три с учетом установки платы в корпус, и думаю и это не последний вариант.
В начале разработки корпуса идея была печатать его на FDM 3D принтере, но чем дальше в лес тем становилось понятнее что все мои хотелки оно не способно воспроизвести. К моменту как это понимание пришло уже узнал о другой технологии 3D печати — SLA. Недолго думая и впечатлившись качеством печати была оформлена хотелка на Али — ANYCUBIC Фотон. (Ссылк ана Али, не рекламная, не партнерская,… просто ссылка).
Напишу сразу, сейчас, на основе моего опыта на момент написания этой статьи,… ох уж и крутяцкая эта чудо штуковина!!! Корпус который был спроектирован в редакторе конечно и напечатался не с первого раза и доработок была куча. Ну по другому наверное и не бывает. В итоге получил тот результат который хотел. Довольно миниатюрное устройство, хороший DIY корпус с очень точной детализацией, кнпочки, шрифты, все как предствалял в голове. В заднюю крышку добавил магнитик, теперь можно легко крепить и на железные поверхности.
Это попытки напечатать туже модель на FDM принтере:
Так как девайс получился небольшой, но это все же ардуинка, то озадачился выводом миниатюрных разьемов для программирования. И соответственно к разьемам был сделан небольшой переходничек для удобного соединения с програматором и TTL конвертером.
Все закупалось на Али (да, там полно оказывается не только ардуино модулей)
SMD tantalum capacitor 4.7uF — 4.7uF | 10v | 10% — C1
SMD ceramic capacitor 100nF | Y5V — 100nF | 50v | +80-20% — C2, C3, C4, C5, C6, C7
LED — LED SIDE — D1
Pin Header Female — 2x3P | 6pin | 1.27mm — J1, J2
SMD resistor 20K Ohm — 20K | 5% — R1
SMD resistor 4.7K Ohm — 4.7K | 5% — R2, R3, R4
SMD resistor 470K Ohm — 470 | 1% — R5
SMD resistor 1M Ohm — 1M | 1% — R6
SMD resistor 18K Ohm — 18K | 5% — R7
SMD resistor 10K Ohm — 10K | 5% — R8
4-pin SMD side button — SW1, SW2
512-Kbit, 1.65V SPI Serial Flash Memory — AT25DF512C-SSHN-B — U1
Mini NRF24L01 + 2.4GHz 1.27MM RF — nRF24l01 1.27 SMD — U2
ATMEGA328P-MU QFN32 — U3
CRYPTO AUTHENTICATION, 1 WIRE — ATSHA204A-STUCZ-T — U4
Humidity and Temperature Sensor IC — SHT20 — U5
BATTERY HOLDER FOR CR2477-1 — L-KLS5-CR2477-1 — U6
Код программы достаточно прост. Для работы с датчиком SHT20 был использован пример библиотеки DFRobot. Впринципе любой скетч, для любого датчика можно за 5 минут преватить в скетч для работы в сети Mysensors.
#include <Wire.h>
#include "DFRobot_SHT20.h"
DFRobot_SHT20 sht20; // https://github.com/DFRobot/DFRobot_SHT20
#define MY_DEBUG
//#define MY_DISABLED_SERIAL
#define MY_RADIO_RF24
#define MY_PASSIVE_NODE
#define MY_NODE_ID 200
#define MY_PARENT_NODE_ID 0
#define MY_PARENT_NODE_IS_STATIC
#define MY_TRANSPORT_UPLINK_CHECK_DISABLED
//#define MY_OTA_FIRMWARE_FEATURE
//#define MY_SIGNING_ATSHA204
//#define MY_SIGNING_ATSHA204_PIN A3
//#define MY_SIGNING_REQUEST_SIGNATURES
#define TEMP_SENS_ID 1
#define HUM_SENS_ID 2
#define SETTING_LED_SENS_ID 100
#define DELAY_TIME_SENS_ID 101
#define BATTARY_SEND_SENS_ID 102
#define BATTARY_DATA_SENS_ID 103
#define BAT_COOF 3.04
#define BAT_MIN 195
#define BAT_MAX 295
#define ON 1
#define OFF 0
float humd;
float temp;
float oldhumd;
float oldtemp;
float tempThreshold = 0.5;
float humThreshold = 10.0;
static uint32_t lightMillis;
static uint32_t previousMillis;
uint32_t send_batteryTime;
uint32_t w_battetyTime = 0;
static uint8_t led_pin = 4;
static uint8_t mode_pin = 2; // interrupt
uint32_t delayTime;
int8_t battery;
int8_t old_battery;
uint8_t set_led;
boolean sleep_mode;
boolean configMode = 0;
int8_t timer_status = 0;
bool flag_mode_button = 0;
bool sleep_flag = 0;
bool listen_flag = 0;
#include <MySensors.h>
MyMessage msg_temp(TEMP_SENS_ID, V_TEMP);
MyMessage msg_hum(HUM_SENS_ID, V_HUM);
MyMessage msg_setting_led(SETTING_LED_SENS_ID, V_VAR1);
MyMessage msg_delay_time(DELAY_TIME_SENS_ID, V_VAR1);
MyMessage msg_battary_send(BATTARY_SEND_SENS_ID, V_VAR1);
MyMessage powerMsg(BATTARY_DATA_SENS_ID, V_VAR1);
void preHwInit()
{
pinMode(led_pin, OUTPUT);
digitalWrite(led_pin, OFF);
pinMode(mode_pin, INPUT_PULLUP);
}
void before()
{
set_led = loadState(100);
if (set_led > 1) {
set_led = 1;
saveState(100, set_led);
}
delayTime = loadState(101);
if (delayTime > 60) {
delayTime = 3;
saveState(101, delayTime);
}
send_batteryTime = loadState(102);
if (send_batteryTime > 48) {
send_batteryTime = 6;
saveState(102, send_batteryTime);
}
digitalWrite(led_pin, ON);
}
void presentation()
{
sendSketchInfo("Temp & Hum Sensor CR2477", "1.0");
wait(100);
present(TEMP_SENS_ID, S_TEMP, "TEMPERATURE DATA");
wait(100);
present(HUM_SENS_ID, S_HUM, "HUMIDITY DATA");
wait(100);
present(SETTING_LED_SENS_ID, S_CUSTOM, "LED MODE");
wait(100);
present(DELAY_TIME_SENS_ID, S_CUSTOM, "DELAY TIME/MIN");
wait(100);
present(BATTARY_SEND_SENS_ID, S_CUSTOM, "BATTERY SEND TIME/H");
wait(100);
present(BATTARY_DATA_SENS_ID, S_CUSTOM, "BATTERY DATA");
}
void setup()
{
//attachInterrupt(0, configListener, RISING);
digitalWrite(led_pin, OFF);
wait(500);
digitalWrite(led_pin, ON);
wait(75);
digitalWrite(led_pin, OFF);
wait(50);
digitalWrite(led_pin, ON);
wait(75);
digitalWrite(led_pin, OFF);
wait(50);
digitalWrite(led_pin, ON);
wait(75);
digitalWrite(led_pin, OFF);
TRANSPORT_DEBUG(PSTR("MyS: OPERATING MODE\n"));
wait(100);
readBatLev();
wait(100);
sht20.initSHT20();
wait(100);
send_data();
wait(100);
send(msg_delay_time.set(delayTime));
wait(100);
send(msg_setting_led.set(set_led));
wait(100);
send(msg_battary_send.set(send_batteryTime));
}
void loop()
{
if (configMode == 0) {
if (sleep_flag == 0) {
timer_status = sleep(digitalPinToInterrupt(mode_pin), FALLING, delayTime * 60 * 1000, false);
//timer_status = sleep(digitalPinToInterrupt(mode_pin), RISING, delayTime * 60 * 1000, false);
sleep_flag = 1;
}
if (timer_status == -1) {
w_battetyTime = w_battetyTime + (delayTime * 60 * 1000);
if (w_battetyTime >= send_batteryTime * 60 * 60 * 1000) {
readBatLev();
w_battetyTime = 0;
}
send_data();
sleep_flag = 0;
}
if (timer_status == 0) {
if (digitalRead(2) == LOW && flag_mode_button == 0) //если кнопка нажата
{
flag_mode_button = 1;
previousMillis = millis();
wait(50);
}
if (digitalRead(2) == LOW && flag_mode_button == 1) {
if ((millis() - previousMillis > 0) && (millis() - previousMillis <= 2000)) {
if (millis() - lightMillis > 50) {
lightMillis = millis();
digitalWrite(led_pin, !digitalRead(led_pin));
}
}
if ((millis() - previousMillis > 2000) && (millis() - previousMillis <= 2500)) {
digitalWrite(led_pin, OFF);
}
if ((millis() - previousMillis > 2500) && (millis() - previousMillis <= 4500)) {
if (millis() - lightMillis > 25) {
lightMillis = millis();
digitalWrite(led_pin, !digitalRead(led_pin));
}
}
if (millis() - previousMillis > 4500) {
digitalWrite(led_pin, OFF);
}
}
if (digitalRead(2) == HIGH && flag_mode_button == 1) //если кнопка НЕ нажата
{
if ((millis() - previousMillis > 0) && (millis() - previousMillis <= 2000)) {
configMode = !configMode;
flag_mode_button = 0;
TRANSPORT_DEBUG(PSTR("MyS: CONFIGURATION MODE\n"));
sleep_flag = 0;
digitalWrite(led_pin, OFF);
}
if ((millis() - previousMillis > 2000) && (millis() - previousMillis <= 2500)) {
flag_mode_button = 0;
sleep_flag = 0;
}
if ((millis() - previousMillis > 2500) && (millis() - previousMillis <= 4500))
{
flag_mode_button = 0;
sleep_flag = 0;
digitalWrite(led_pin, OFF);
}
if (millis() - previousMillis > 4500) {
flag_mode_button = 0;
sleep_flag = 0;
wait(50);
}
}
}
} else {
if (listen_flag == 0) {
RF24_startListening();
listen_flag = 1;
}
if (millis() - lightMillis > 1000) {
lightMillis = millis();
digitalWrite(led_pin, !digitalRead(led_pin));
}
if (digitalRead(2) == LOW && flag_mode_button == 0) //если кнопка нажата
{
flag_mode_button = 1;
//previousMillis = millis();
wait(50);
}
if (digitalRead(2) == LOW && flag_mode_button == 1) {
}
if (digitalRead(2) == HIGH && flag_mode_button == 1) //если кнопка НЕ нажата
{
configMode = !configMode;
listen_flag = 0;
flag_mode_button = 0;
TRANSPORT_DEBUG(PSTR("MyS: OPERATING MODE\n"));
digitalWrite(led_pin, OFF);
wait(50);
}
}
}
void receive(const MyMessage & message)
{
if (message.sensor == SETTING_LED_SENS_ID) {
if (message.type == V_VAR1) {
if (message.getByte() <= 1) {
set_led = message.getBool();
saveState(100, set_led);
send(msg_setting_led.set(set_led));
if (set_led == 0) {
TRANSPORT_DEBUG(PSTR("MyS: STATUS LED: OFF\n"));
}
if (set_led == 1) {
TRANSPORT_DEBUG(PSTR("MyS: STATUS LED: ON\n"));
if (set_led == 1) {
digitalWrite(led_pin, ON);
wait(50);
digitalWrite(led_pin, OFF);
}
}
}
}
}
if (message.sensor == DELAY_TIME_SENS_ID) {
if (message.type == V_VAR1) {
if (message.getULong() <= 60 && message.getULong() != 0) {
delayTime = message.getULong();
saveState(101, delayTime);
send(msg_delay_time.set(delayTime));
TRANSPORT_DEBUG(PSTR("MyS: THE NEW INTERVAL TEMP&HUM SEND VALUE IS SET: %d MIN.\n"), delayTime);
if (set_led == 1) {
digitalWrite(led_pin, ON);
wait(50);
digitalWrite(led_pin, OFF);
}
} else if (message.getULong() > 60) {
delayTime = 60;
saveState(101, delayTime);
send(msg_delay_time.set(delayTime));
TRANSPORT_DEBUG(PSTR("MyS: THE NEW INTERVAL TEMP&HUM SEND VALUE IS SET: %d MIN.\n"), delayTime);
if (set_led == 1) {
digitalWrite(led_pin, ON);
wait(50);
digitalWrite(led_pin, OFF);
}
} else if (message.getULong() == 0) {
delayTime = 1;
saveState(101, delayTime);
send(msg_delay_time.set(delayTime));
TRANSPORT_DEBUG(PSTR("MyS: THE NEW INTERVAL TEMP&HUM SEND VALUE IS SET: %d MIN.\n"), delayTime);
if (set_led == 1) {
digitalWrite(led_pin, ON);
wait(50);
digitalWrite(led_pin, OFF);
}
}
}
}
if (message.sensor == BATTARY_SEND_SENS_ID) {
if (message.type == V_VAR1) {
if (message.getULong() <= 168) {
send_batteryTime = message.getULong();
saveState(102, send_batteryTime);
send(msg_battary_send.set(send_batteryTime));
TRANSPORT_DEBUG(PSTR("MyS: THE NEW INTERVAL BATTERY SEND IS SET: %d HOUR\n"), send_batteryTime);
if (set_led == 1) {
digitalWrite(led_pin, ON);
wait(50);
digitalWrite(led_pin, OFF);
}
}
}
}
}
void send_data()
{
humd = sht20.readHumidity();
temp = sht20.readTemperature();
int t_humd = (int)humd;
int t_temp = (int)temp;
if (abs(temp - oldtemp) >= tempThreshold) {
send(msg_temp.set(temp, 1));
oldtemp = temp;
if (set_led == 1) {
digitalWrite(led_pin, ON);
wait(50);
digitalWrite(led_pin, OFF);
}
}
wait(100);
if (abs(humd - oldhumd) >= humThreshold) {
send(msg_hum.set(humd, 1));
oldhumd = humd;
if (set_led == 1) {
digitalWrite(led_pin, ON);
wait(50);
digitalWrite(led_pin, OFF);
}
}
TRANSPORT_DEBUG(PSTR("MyS: DATA - TEMPERATURE: %d, HUMIDITY %d\n"), t_temp, t_humd);
}
void readBatLev() {
ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(MUX0);
wait(100);
RF24_startListening();
wait(200);
ADCSRA |= _BV(ADSC);
while (bit_is_set(ADCSRA, ADSC));
uint8_t low = ADCL;
uint8_t high = ADCH;
long temp = (high << 8) | low;
float vcc = temp * 1.1 / 1023 * BAT_COOF * 100;
battery = map((int)vcc, BAT_MIN, BAT_MAX, 0, 100);
if (battery < 0) {
battery = 0;
}
if (battery > 100) {
battery = 100;
}
TRANSPORT_DEBUG(PSTR("MyS: BATTERY LEVEL: %d, PREVIUS BATTERY LEVEL: %d\n"), battery, old_battery);
TRANSPORT_DEBUG(PSTR("MyS: BATTERY LEVEL ADC: %d\n"), temp);
/*
if (old_battery != battery) {
if (battery < old_battery) {
old_battery = battery;
wait(100);
sendBatteryLevel(battery);
wait(100);
send(powerMsg.set(temp));
TRANSPORT_DEBUG(PSTR("MyS: SEND BATTERY LEVEL\n"));
} else {
battery = old_battery;
}
}
*/
wait(100);
sendBatteryLevel(battery);
wait(100);
send(powerMsg.set(temp));
TRANSPORT_DEBUG(PSTR("MyS: SEND BATTERY LEVEL\n"));
}
На видео показан тест работы датчика:
Работа датчика с Мажордомо:
Контролером умного дома является Мажордомо(думаю многим известная система), написан модуль Mysensors(пожалуй одна из лучших реализаций поддержки протокола Mysensors в контролерах)
Проект естественно открытый и рекомендованный к повторению. Все детали разработки, файлы плат, прошивка, 3d модели корпуса выложены на сайте www.openhardware.io. На вопросы по данной разработке, по трудностям в ваших разработках на ардуинках и Mysensors всегда придут на помощь в нашем телеграмм чате — t.me/mysensors_rus.
Комментарии (155)
olartamonov
17.05.2019 07:43Что это? Это очень простая и хорошо проработанная и что немаловажно отлично описанная библиотека под Ардуино ИДЕ (и не только) для создания IOT радиосетей на частотах 2.4Ггц, 915, 868, 433 Мгц, а так же проводных сетей на интерфейсе 485, возможно не все упомянул, тк протокол постоянно развивается, все время что то добавляется
За пять минут на mysensors.org никакого вообще описания протокола найти так и не смог.
Дайте ссылку.Andy_Big
17.05.2019 08:04olartamonov
17.05.2019 08:11Нет, это API шлюза по UART'у.
А что у них там в радио происходит и из чего оно вообще сделано — видимо, в отлично описанной библиотеке надо рыться в исходниках.sav13
17.05.2019 16:31А смысл? Вы MQTT тоже побайтно из IP-пакетов парсите?
Все что нужно выдается в UART включенным MY_DEBUG
Если нужно можно еще и отладку конкретного радиомодуля поднятьAndy_Big
17.05.2019 18:33+1А смысл?
Например, захотелось подключить что-то свое.
Все что нужно выдается в UART включенным MY_DEBUG
И описание протокола выдается? Или Вы не видите разницу между описанием и отладочной информацией?Berkseo Автор
17.05.2019 19:03Мне в свое время API хватило www.mysensors.org/apidocs
Если с вашей колокольни этого не достаточно для понимания, то предлагаю забить.Andy_Big
17.05.2019 19:36+1Хватило для чего? Вы взяли неподдерживаемый этой библиотекой RF-чип и сделали на нем датчик, работающий в этой экосистеме? Пользуясь только описанием API?
Berkseo Автор
17.05.2019 19:49нет, упоси боже, я только обычные ардуино скетчи парой девайнов адаптирую под майсенсорс и фанатею от ардуино модулей. Но у меня это хобби. А вы?
Andy_Big
17.05.2019 20:05+1А у меня это и хобби и профессия :) Как хоббисту мне все эти «умные дома» совершенно безразличны, я не вижу в них достаточной пользы, чтобы тратить на это силы. А как профессионалу мне было бы любопытно взглянуть на протокол общения нод с центром, но вызывает недоумение отсутствие описания базовой вещи — этого протокола :)
sav13
17.05.2019 21:28Как раз вижу. И сниффер на NRF-ке гонял, смотрел все пакеты. Просто не вижу практического смысла в этом. Все через API делается. Что-то свое подключать — нужно транспортный уровень капать в первую очередь. Или вы про новые сенсоры? Так и там избыточно этих сенсоров. Лучше бы по типам данных их разделяли
Andy_Big
17.05.2019 21:45Ок, вот у меня есть свои приемопередатчики. Или проводная нестандартная линия. Как мне это подключить к шлюзу? В каком виде отправлять ему данные?
sav13
17.05.2019 21:55Вы собираетесь свою библиотеку писать?
Я бы просто написал поддержку своего транспорта Mysensor/hal/transport/XXX по образу и подобию того же RF24 или RFM69 в стандартной библиотеке Mysensors
Опять же исходя из того что для каждого транспорта нужно свой шлюз, некоторые навороченные модули типа вообще нету смысла к Mysensors стыковать, а лучше использовать свои штатные протоколы и цепляться ими к
тому же MajorDoMo параллельно MysensorsAndy_Big
17.05.2019 22:18+1Вопрос не в том что я собираюсь писать, вопрос в том, что одна из базовых вещей никак не документирована :)
olartamonov
18.05.2019 15:27Во-первых, было интересно посмотреть, насколько оно вообще юзабельно за пределами «ну чот вроде работает» — в телеграм-канале мне уже сообщили, что подтверждение доставки сделано через одно место, нумерации пакетов нет вообще, в общем, без доработки напильником неюзабельно.
Во-вторых, у нас в процессе своя реализация, в том числе под умный дом, на nRF52832 с 6LoWPAN (ну, почти, т.к. 52832 не умеет QPSK и, следовательно, IEEE 802.15.4), вдруг бы я захотел не изобретать велосипед, а просто поддержать уже существующий проект?
В-третьих, там же как-то предполагается участие сторонних разработчиков во всём этом, оно же open source не только потому, что создателям нравится, как эти слова звучат? Или реверс-инжиниринг протокола по исходникам — это такой вступительный экзамен?
В-четвёртых, автору статьи в следующий раз лучше вместо «отлично документирована» писать «функции пользовательского уровня неплохо документированы, но на внутреннюю часть системы документации пока нет».Berkseo Автор
18.05.2019 15:55нумерации пакетов нет вообще
… простите а какие именно пакеты вы считаете надо считать в данной реализации??
в телеграм-канале мне уже сообщили, что подтверждение доставки сделано через одно место
… наверное пропустил как сообщали :)),
… а что именно не устраивает в доставке? вполне себе годный механизм, есть еще подтверждение отправки. Всего этого более чем достаточно. Поясните пожалуйста
Во-вторых
) поржал, ну так возьмите вашим коллективом в прицел nRF52840…
В-третьих
… хотите поучавствовать, становитесь контрибутором, вам еще и доплатят…… Ну воспринимайте это как вступительный экзамен, там ничего очень сложного.
В-четвёртых
В следующий раз напишу ровно так же, потому как так и есть,… это статья именно для тех кто хотел бы попробовать.… вам лучше своё с типа почти 6LoWPAN на nRF52832Andy_Big
18.05.2019 16:09а какие именно пакеты вы считаете надо считать в данной реализации??
Ну вообще в целях повышения надежности пакетной коммуникации обычно все пакеты нумеруются. Это гарантирует отсутствие пропуска пакетов, или как минимум обнаружение пропуска или дублирования. Это повышает общую пропускную способность канала.
У меня такое ощущение, что Вы пытаетесь упорно спорить на ту тему, которая Вам совершенно неизвестна :) Вам пишут «внутри все непонятно и, судя по всему, плохо», а Вы отвечаете «нет, все идеально, смотрите какая удобная и красивая обертка» :)olartamonov
18.05.2019 16:12С нумерацией в радио всё ещё веселее — см. reply attack. Мало того, что в нормальных системах пакеты нумеруются, они ещё и криптографически подписываются, чтобы случайно пролетавший мимо дятел, записавший на свой HackRF пакет, отпирающий мой дверной замок, не мог в произвольный момент просто передать его в эфир.
Andy_Big
18.05.2019 16:17Ну да, и для безопасности тоже, упустил этот момент :)
А тут нет никаких подписей? А вон тот крипточип — он тогда для чего?
Я в канале не общался, поэтому совершенно не в курсе как там и что :)olartamonov
18.05.2019 16:37А в канале никто про это ничего наверняка не знает, там толпа ардуинщиков — хотя с утверждением, что счётчика пакетов нет, никто спорить не стал.
Документации нет, на сайте — художественные тексты про то, как сделать хорошо, но ничего про то, как оно таки сделано.
Berkseo Автор
18.05.2019 16:18Вы вообще точно посещали сайт проекта, про аутификацию, персонализацию, шифрование, подписи не почитали?
olartamonov
18.05.2019 16:35Почитал что — вот это?
www.mysensors.org/about/signing
Прекрасный художественный текст, иллюстрации к нему, полагаю, автор делал сам.
Сделал из него вывод, что шифрования в MySensors нет.
Так где можно посмотреть структуру пакета и убедиться, что автор про атаку повтором умеет не только картинки рисовать, но и реально её реализовал?Andy_Big
18.05.2019 17:18Вот тут что-то есть — www.mysensors.org/apidocs-beta/group__MySigninggrpPub.html
Но я не вчитывался…olartamonov
18.05.2019 17:29Там очень много мути и нет конкретного ответа.
Из текста можно сделать вывод, что автор почему-то не любит счётчики сообщений (они предсказуемы — ну и что?), а вместо этого любит генерацию nonce на каждое сообщение, т.е. передача каждого пакета нагрузки по радио у него — это полноценный хендшейк в четыре приёмопередачи, привет батарейке и загрузке эфира.Andy_Big
18.05.2019 17:33То есть, получается, для каждого сообщения организуется некая подтвержденная сессия?
olartamonov
18.05.2019 17:48Да (точнее, видимо, «наверное», ибо в комментариях отмечают, что текст вообще устарел).
(и тут ещё нет подтверждения доставки, это будет четвёртое сообщение в сессии)
По сути, для типовой ноды (которая шлёт пакет на каждое своё просыпание) автор жертвует десятками процентов времени жизни на батарейке, удваивая time-on-air — на который традиционно приходятся основные расходы энергии.Andy_Big
18.05.2019 18:12Да, решение какое-то переусложненное и явно не для автономности.
olartamonov
18.05.2019 18:45Там у автора два голоса в голове:
1) счётчик кадров плох, потому что предсказуем
2) шифрование — забота пользователя
Оба тезиса неверны, и из них при этом растёт и переусложённость защиты в одном месте, и её полное отсутствие в другом.Berkseo Автор
18.05.2019 18:50Вы сначала посидите и подумайте для чего был сделан MyS. И кто и что на нем в основном поднимает. А потом разберитесь со своей головой, что то явно где то что то пережимает…
olartamonov
18.05.2019 18:52Я так понял из ваших объяснений, что для ардуинщиков, которым надо по-быстрому прикрутить либу, а как оно там работает и за сколько батарейку сожрёт, их мало волнует.
Berkseo Автор
18.05.2019 19:04Кого-то волнует, коо-то действительно вообще не волнует, ну просто другой интерес…
Andy_Big
18.05.2019 19:01Там у автора два голоса в голове:
При том, что можно было сделать проще и надежнее, включая шифрование по умолчанию.Berkseo Автор
18.05.2019 19:03Не всем даже это нужно, это для продолжающих… Еще раз обращаю ваше внимание на то что такое MyS и его идеология.
Andy_Big
18.05.2019 19:06Такой подход понятен и простителен для личной поделки в своем доме, но не для продвигания в массы с хвалебными дифирамбами.
Berkseo Автор
18.05.2019 19:16Вы наверное не в курсе были, но людей которые занимаются «личными поделками» в своем доме стало сильно больше. И есть куча вещей которые делаются для них, делаются ими, люди собираются в сообщества,… им это итересно. Так что тут вопрос кому простительно а кому бы и призадуматся. Вы глаза вверх экрана приподнимите, гляньте на раздел где вы так «блещите» habr.com/ru/hub/DIY
olartamonov
18.05.2019 19:17+1А потом мы читаем про эти сделанные для них вещи в новостях рубрики «Кибербезопасность», ага.
olartamonov
18.05.2019 19:14Шифрование по умолчанию сделать было не можно, а нужно.
Потому как ещё одна типовая атака требует, чтобы одни и те же входящие данные давали каждый раз разные зашифрованные — и это проще всего реализовать через AES-CTR, которому в качестве счётчика просто подсовывается номер пакета. И это не может быть сделано на уровне приложения, ибо уровень приложения номер пакета не знает и знать не может.
В данном случае можно было бы сделать то же самое с nonce, только непонятно, зачем. Знание номера пакета атакующему не даёт никаких преимуществ, если разрядность счётчика достаточно велика, чтобы за разумное время он не обнулился (ну то есть в общем двух байт хватит практически всем).Andy_Big
18.05.2019 19:42Потому как ещё одна типовая атака требует, чтобы одни и те же входящие данные давали каждый раз разные зашифрованные
В смысле — противодействие этой атаке требует разного шифрования?
Ну не знаю, в данном случае шифрование, на мой взгляд, опционально, но вот подпись каждого пакета — просто обязана быть, причем на базовом уровне, а не «если хотите, можете включить». Пусть даже примитивная — какой-либо не слишком навороченный по математике HASH, в вычислении которого участвует в том числе и номер пакета. Пользователя нужно только заставить задать свои значения для начальной инициализации функции и для соли. Просто, невысокие энергетические и вычислительные ресурсы и достаточно устойчиво против взлома, на мой взгляд.olartamonov
18.05.2019 19:57+1В смысле — противодействие этой атаке требует разного шифрования?
Ну да.
Если нам не важно передаваемое значение, а важно его изменение (например, можно ловить показания водосчётчика, если они сутки не меняются — в квартире никого нет, и для понимания этого нам не надо знать, сколько именно литров он показывает), то шифрование с фиксированным ключом не поможет.
На уровне приложения это решается рандомной солью, но соль съедает байты пейлоада. А на уровне MAC можно формировать ключ из nonce или счётчика пакетов, которые гейту известны — соответственно, он сможет сформировать такой же ключ.
Расходы на это незначительные — я занимался оптимизацией AES по памяти как-то, заодно сделал бенчмарки, на инициализацию и один блок (16 байт) уходит 285 мкс на Cortex-M0 и 165 мкс на Cortex-M1 (алгоритм — обычный сишный на Т-таблицах, ничего особенно выдающегося).
Но автор этого чуда почему-то считает, что кому надо — тот пусть и шифрует.Andy_Big
18.05.2019 20:40Про шифрование — я имел в виду, что оно в данном применении опционально просто потому, что никаких критически важных данных через эфир не передается. Ну, можно будет узнать из эфира, что датчик №42 передал значение 238, ну и что? :) Даже пусть будет известно, что это датчик температуры и он передал показания температуры 23.8 градуса.
Главное — обеспечить защиту от внешнего проникновения в экосистему, от подмены данных или команд.
А так-то понятно, что шифровать одним ключом одни и те же данные смысла мало.
Alexeyslav
20.05.2019 09:40не слишком навороченный по математике HASH
Будет очень нестоек к взлому. Имея вычислительные ресурсы его можно будет подобрать за разумное время, а значит не стоит на него полагаться для защиты от взлома. Это щеколда на сейфе. Проще добавить счетчик к полезным данным и зашифровать его в рамках одной сессии.Andy_Big
20.05.2019 09:57Имея вычислительные ресурсы можно и шифрование взломать :) Вопрос в разумном балансе между стойкостью ко взлому и минимальным энергопотреблением, которое привязано ко времени работы в эфире и требуемой вычислительной мощностью.
Даже упрощенный раза в четыре алгоритм, подобный MD5, с задаваемыми пользователем начальными значениями и солью байт на 8 будет уже достаточно стойким к взлому. Вряд ли кто-то будет тратить сотни или тысячи часов огромных вычислительных ресурсов для того чтобы просто взломать чей-то «умный дом».Alexeyslav
20.05.2019 10:11Одно дело ломать протокол шифрования, а другое дело уязвимый простенький HASH. Может оказаться что ваш простенький алгоритм хеширования внезапно даст очень высокую частоту коллизий, и от 8 байт стойкости останется только 24 бита…
Andy_Big
20.05.2019 10:23Конечно же он даст высокую частоту коллизий из-за своей простоты. Но как это поможет правильно подписать поддельное сообщение?
olartamonov
20.05.2019 10:39О чём вы спорите, если давно уже придуман AES-CMAC — и нет никаких поводов не подписывать пакет им, кроме жёсточайшей нехватки флэша и процессора?..
Ну или на худой конец HMAC с SHA-256.
Berkseo Автор
18.05.2019 17:53-1а там никто стримить и не собирается, грузить фармвар по воздуху на батарейку это моветон.… Ну раз считаете что считать лучше потому что пакеты легхе, удачи…
olartamonov
18.05.2019 18:00Скажите, дорогой мой проектировщик сверхэкономичных метеостанций, вы понимаете, что четыре пакета в радио вместо двух — это год жизни на батарейке вместо двух?..
Berkseo Автор
18.05.2019 18:13Спасибо за проектировщика, оценил,… в том смысле что «пукан» у кого то подорвало :)). Понимаю, и если мне нужны будут подписи для передачи например температуры(ответственный узел) я соглашусь с этим и расчитаю решение в железе. В других ситуациях просто зашифрую AESом. Ну а Вы закидайте меня ссылками на что то легкое но со всем этим на что тут у вас обоих vomitus обострился.
olartamonov
18.05.2019 18:39Понимаю, и если мне нужны будут подписи для передачи например температуры(ответственный узел) я соглашусь с этим и расчитаю решение в железе. В других ситуациях просто зашифрую AESом
А вы ведь не понимаете, как этот ваш MySensors работает, даже когда вам разжёвывают.Berkseo Автор
18.05.2019 18:47Ок :) Главное что бы Вы понимали, вам еще типа 6LoWPAN разворачивать.
Berkseo Автор
18.05.2019 16:17У меня такое же ощущение о Вас. Вы тогда раскажите в каком месте стоит нумеровать пакеты в данной реализации радиообмена
Andy_Big
18.05.2019 16:22Например, в заголовке. Или еще объяснить что такое заголовок пакета и в каком месте он нужен? :)
Berkseo Автор
18.05.2019 16:45Мне объяснять не надо. Например зачем? Вы щас оба занимаетесь «водными процедурами». Совет, подключайтесь к товарищу на аутентичный почти 6LoWPAN на nRF52832 или форкайте MyS и впиливайте нумерацию.
github.com/mysensors/MySensors/wiki/Message.h
Andy_Big
18.05.2019 17:17Например зачем?
Выше это Вам уже объяснялось, но Вы, похоже, не понимаете в силу отсутствия опыта и знаний. Но зачем-то спорите.Berkseo Автор
18.05.2019 17:22Да нгет же уважаемый, не понимаете как раз Вы, в силу чего?? тут может быть много причин…
Andy_Big
18.05.2019 17:30Вы понимаете, что злоумышленник может, к примеру, заглушить любой пакет от сенсора, и шлюз об этом никогда не узнает?
Или, что хуже, он может отправить в эфир записанный ранее пакет на открытие замка от имени шлюза (со всеми подписями и шифрованиями) и замок откроется?
Судя по всему — нет, не понимаете.Berkseo Автор
18.05.2019 17:51-1Я еще раз повторюсь, невтыкаете Вы. Гейт узнает, что и нода в ауте, и отправить левый пакет не получится, неуспеет,… курите доки
Andy_Big
18.05.2019 18:06Гейт узнает, что и нода в ауте
Предположим, что нода — это датчик, посылающий гейту сообщения при открытии окна. Если заглушить его сообщение, открывая окно, то каким образом гейт узнает об этом?
и отправить левый пакет не получится, неуспеет
Кто куда не успеет? Почему не получится отправить левый пакет — что может помешать этому?olartamonov
18.05.2019 18:10+1Кстати, в этой схеме с хендшейком вообще прекрасно — можно прицельно глушить конкретное устройство.
Слушаешь эфир, как только оно попросит у сервера nonce — врубаешь глушилку на секунду.
Если есть сосед-радиогубитель, поднявший у себя умный дом — можно свести его с ума.
olartamonov
18.05.2019 16:10… простите а какие именно пакеты вы считаете надо считать в данной реализации??
Очевидно, передаваемые в радио. Вы про защиту от атак повтором слышали когда-нибудь?
… а что именно не устраивает в доставке? вполне себе годный механизм, есть еще подтверждение отправки. Всего этого более чем достаточно. Поясните пожалуйста
Меня в ней не может что-то устраивать или не устраивать — в силу отсутствия документации я ничего про неё не знаю. Однако в телеграм-канале мне сообщили, что в качестве подтверждения просто возвращается отправленный пакет, причём не всегда.
Соврали? Где прочитать про то, как на самом деле?
… хотите поучавствовать, становитесь контрибутором, вам еще и доплатят…… Ну воспринимайте это как вступительный экзамен, там ничего очень сложного.
Про «ничего сложного» мне пишет человек, который не понимает даже задаваемых мной вопросов.Berkseo Автор
18.05.2019 16:47Мне кажется Вы понимаете только себя. Маякните как допилите свой протокол, было бы любопытно…
Andy_Big
18.05.2019 17:25Маякните как допилите свой протокол
Запилить свой протокол — дело совершенно нехитрое. При наличии знаний.
Например
Berkseo Автор
18.05.2019 17:45Непоспоришь, где нарыли? да вы батенька просто любитель потрещать и померяться...
Andy_Big
18.05.2019 18:15где нарыли?
Запилил в одном из своих проектов.
А у Вас это что за картинка?Berkseo Автор
18.05.2019 18:16«Пилю» в одном из своих проектов.
Andy_Big
18.05.2019 18:20Не совсем понятно… Для передачи 10 байт данных передается пакет размером 88 байт?
ЗЫ: подумал было, что наконец-то раскрыта тайна протокола майсенсора :)))Berkseo Автор
18.05.2019 18:24Не совсем понятно… Для передачи 10 байт данных передается пакет размером 110 байт?
пересчитали? /// Ну вот так :), с нас «ардуинщиков» какой спрос ;)Andy_Big
18.05.2019 18:31Да, слегка ошибся в первом варианте :)
А зачем так много?Berkseo Автор
18.05.2019 18:33Ну значит так надо. Вы бы не отвлекались и дальше MyS «раскуривали», может идеи какие посетят…
Andy_Big
18.05.2019 18:37Ну так и в MyS, очевидно, все как надо и раскуривать кому ни попадя там не положено. Куда мне до его ардуинщиков :)
olartamonov
18.05.2019 18:43Вообще тут, конечно, самое прекрасное не то, что документации нет, а у автора какие-то свои голоса в голове — это в 9 опенсорс проектах из 10 так — а то, что люди из «в нашем сообществе ответят на все ваши вопросы» на самом деле не знают не то что ответов на вопросы, но и самих вопросов.
То есть всё их сообщество ответит максимум на вопрос о том, откуда либу скачать.Alexeyslav
20.05.2019 09:51Разве они не отвечают на все ваши вопросы? «не знаю» — это формально тоже ответ, между прочим. Отвечать отвечают, всё как и заявлено… а вот удовлетворить каждого не обещали.
Berkseo Автор
18.05.2019 18:45Ну снизойдите, поймите и научите.
olartamonov
18.05.2019 18:54Ну снизойдите, поймите и научите.
Я с некоторой вероятностью осенью буду вот тут курс читать, можете обратиться к администрации с вопросом, возможно ли индивидуальное посещение.
Там я вас научу.Berkseo Автор
18.05.2019 19:01Я ознакомился ранее с Вашими статьями, действительно интересно и познавательно, но как учитель вы для меня дескредетированы.… И докладчик != учитель, у Вас явно с этим проблема…
olartamonov
18.05.2019 19:16Интересно, чем? Тем, что я рассказал вам, как работает продвигаемый вами же протокол, да ещё и указал на его проблемы (которые вы, пользуясь этим знанием, сможете решить и сделать протокол ещё лучше), но сделал это без должного уважения?
Berkseo Автор
18.05.2019 19:18Тем, что я рассказал вам, как работает продвигаемый вами же протокол
Чем-чем а уж этим вы тут точно не занимались
olartamonov
18.05.2019 17:26Маякните как допилите свой протокол, было бы любопытно…
Там программировать надо будет. Вам не понравится.
Berkseo Автор
17.05.2019 10:19olartamonov
17.05.2019 11:00Как уже отметили, это не описание протокола.
Правильно ли я понимаю, что всё, относящееся к радио, попросту не документировано никак?Berkseo Автор
17.05.2019 12:42Не совсем понял, подозреваю что вы о драйверах транспортного уровня — github.com/mysensors/MySensors/tree/development/hal/transport/NRF5_ESB/driver
olartamonov
17.05.2019 13:00Вообще говоря, я обо всех имеющихся уровнях по модели OSI.
Но в целом ситуация понятная — оно не документировано.Andy_Big
17.05.2019 13:49А зачем документировать? Это же для ардуинщиков, которые подключили скетч — и все работает. Или не работает — тогда писать в канал телеграма чтобы добрые люди сделали так чтобы работало :)
Berkseo Автор
17.05.2019 19:06Объясните конкретно что вы хотите понять? Или у Вас просто много свободного времени?
olartamonov
18.05.2019 15:34У меня очень мало свободного времени.
Поэтому вместо того, чтобы писать свои коннекторы во всякие протоколы софта для умных домов я бы мог, например, рассмотреть возможность обеспечения совместимости с протоколами MySensors, и сразу попасть во вроде бы как готовую экосистему.
Но рассмотреть вопрос совместимости с протоколом без знания этого протокола у меня не получится, а на то, чтобы реверс-инжинирить его по исходникам — см. выше, у меня очень мало свободного времени.
anpetrov
17.05.2019 09:12Не советую использовать NRF24L01, по крайне мере сам с ним намучался. 2.4ГГц забит очень. Когда сенсоров/актуаторов набирается с 10, многовато становится NACK-ов.
Открыл для себя RFM69, они в 915/433/итп конфигурации есть. При низком битрейте можно получить сотни метров при желании. Кстати MySensors его поддерживает.
Еще, советую использовать home-assistant (home-assistant.io). Оно умеет serial gateway от mysensors да и через mqtt.geher
17.05.2019 13:06433 тоже прилично бывает забит (различные сигнализации, метеостанции фабричного производства, различные ПДУ к дистанционно управляемым игрушкам и т.п.).
Так что надо смотреть по месту применения и делать протокол, разруливающий коллизии, когда своих устройств становится многовато для частоты.
Кстати, у того же NRF есть возможность выбирать канал (если правильно понял, частоту в некотором диапазоне возле 2.4ГГц), и в большинстве случаев свободный (некритично зашумленный) канал вполне находится.
Можно, конечно, еще давить мощностью (как передатчики на 433, так и NRF есть с неслабыми уровнями на выходе), но для метеодатчика это порождает избыточное потребление и увеличивает габариты за счет большой антенны.olartamonov
17.05.2019 14:01- на этих мощностях выхлоп и размер антенны никак не связаны
- частота и размеры антенны (а также самого устройства) связаны очень даже напрямую — на 433 МГц в таких габаритах ничего хорошего не получится
- больше 20 мВт на 433 МГц в эфир отдавать нельзя
- больше 10 мВт/МГц на 2400 МГц в эфир отдавать нельзя
geher
17.05.2019 20:10на этих мощностях выхлоп и размер антенны никак не связаны
частота и размеры антенны (а также самого устройства) связаны очень даже напрямую — на 433 МГц в таких габаритах ничего хорошего не получитсяЕсли рассматривать готовые устройства, то из того, что я видел, физические размеры самих радиомодулей и антенн у мощных версий радиомодулей были примерно одинаковы вне зависимости от частоты (другой вопрос, что там реально внутри пластмассового корпуса антенны накручено).
больше 20 мВт на 433 МГц в эфир отдавать нельзя
больше 10 мВт/МГц на 2400 МГц в эфир отдавать нельзяМогу ошибаться, но, судя по дистанции уверенного приема, у модулей с антенной, размещенной непосредственно на плате, явно не 10-20 мВт.
olartamonov
18.05.2019 15:38размеры самих радиомодулей и антенн у мощных версий радиомодулей были примерно одинаковы вне зависимости от частоты
Зато выхлоп в эфир у них очень сильно отличался.
Откройте даташиты на две похожие по размерам керамические антенны на 433 МГц и 2450 МГц — и сравните усиление и КПД. Физику не обманешь, чем дальше антенна и земля в размерах от четверти длины волны — тем хуже.
Могу ошибаться, но, судя по дистанции уверенного приема, у модулей с антенной, размещенной непосредственно на плате, явно не 10-20 мВт.
Обычно в пределах 5 мВт на 2450 МГц, 25 мВт на 868 МГц, 10 мВт на 433 МГц.
sav13
17.05.2019 16:13NRF24 умеет работать на 2.4 узкими каналами, как и WiFi и Bluetooth. Если поиграться каналами, то вполне можно найти свободный канал. Если сенсор большей частью спит (Passive mode) и выдает изредка короткие пакеты (выключатели, температурные сенсоры, датчики движения, открывания, протечек) — они могут сотнями друг другу не мешать.
olartamonov
18.05.2019 15:401) Wi-Fi не умеет работать никакими узкими каналами, у него фиксированные каналы 20 МГц минимум
2) Мало передать, неплохо бы, чтобы кто-то ещё и принял — а для этого нужен либо приёмник с алгоритмом сканирования всех возможных каналов, либо общий для приёмника и передатчика алгоритм ПСПЧAlexeyslav
20.05.2019 10:05Зачем сканирование? задаёшь вручную(например DIP-переключателями) или один раз находишь в автоматическом режиме и запоминаешь до следующей длительной потери сигнала и/или нажатия кнопки пользователем. Кнопка, головная боль для пользователя… оно конечно понятно, но — это один из простых способов решения проблемы, это может быть на уровне инсталляции — этим вопросом(выбор канала) должен заниматься не пользователь а тот кто устанавливает и поддерживает систему. И кнопка сканирования может быть объявлена сервисной функцией.
802.11b досихпор ещё поддерживается, канал там достаточно узок — всего 1Мгц.Andy_Big
20.05.2019 10:26Зачем сканирование?
Затем, что найденный сейчас свободный (малошумящий) канал уже при следующей передаче через 5 минут может быть забит помехами или кем-то другим.
olartamonov
20.05.2019 10:45Если мы про умный дом, то по сложности инсталляции он не должен превосходить гибрид Wi-Fi-роутера с розеткой.
Соответственно, никакого «должен заниматься не пользователь» в нём нет.
И да, ничего особенного в сканировании каналов нет, в том же блютусе псевдослучайные скачки по всему спектру — из коробки, 79 каналов, 1600 переключений в секунду.
Andy_Big
17.05.2019 09:36А почему не LoRa-модули? Вроде у них энергоэффективность повыше.
a13aa
17.05.2019 12:36Вряд-ли лора целесообразна в пределах квартиры и её железо заметно дороже.
Berkseo Автор
17.05.2019 12:38Lora не, не для этого она. Но и про 328 я сестно уже забыл как с полгода. Теперь все на nrf5
sav13
17.05.2019 16:34Я сейчас NRF51 ковыряюсь. В 99% железа хватает. Стоит ли на более дороги NRF52 переходить?
Berkseo Автор
18.05.2019 16:01Пожалуй только если нужна работа от батарейки, на 52 можно слушать на 5мА, отправлять на 7мА, с дальнобоем на 9мА, на 51 серии все становится понятно как только в dc-dc mode получаем 12.5мА… многовато
Mogwaika
17.05.2019 12:42А что сразу квартира, а если частный дом? Ворота/гараж/теплица, подвал?
Стены толстые, расстояния большие. Сяомишный zigbee из подвала вот не очень у меня добивает хорошо.Berkseo Автор
17.05.2019 12:49Ну тут каждому свое, у меня дом больше 200 кв, в основном все на nRF5 (естественнов режиме совместимости с nRF24) Зиг би хорош, щас в процессе изучения. Но опять же я не собираюсь юзать то что дает производитель. Но Lora… и не для дома
prilichny
17.05.2019 14:37а есть где-то подробнее об этой конкретной реализации прочитать?
Berkseo Автор
17.05.2019 14:38Вы об реализации mysensors на nRF5?
prilichny
17.05.2019 14:43да, про нее. из комментариев я понял, что сегодняшняя публикация — некий рассказ о прошлом проекте («328 забыл с полгода как»)
как-то очень куце, точнее вообще никак – про самое интересное: потребление, время работы от батарейки, испытания дальности и влияние числа устройств на срок службы, а еще про головную часть.Berkseo Автор
17.05.2019 14:59Мне кажется это за рамками данной статьи. 328 не совсем батарейный чип, да и nrf24 c его 15-16мА то еще чудо. C nRF52 гораздо ловчее и экономичнее. 5-6мА слушаем, 7-8мА передаем. пара мка сон. Где почитать? Да наверное на форуме Mysensors.ru, на офф сайте mysensors.org, в чате. По дальности все стандартно, как и все другое на 2.4 это метров 20 по бетону. Но варианты есть и низкое потребление и метров 200 по бетону. nrf52832 PA. Думаю на этих выходных спаяю уже собственный модуль с PA
a13aa
17.05.2019 12:54Все правильно, для разных условий нужны разные решения. Для большинства — обычный радиоканал предпочтительнее, в первую очередь тем, что он дешевле.
Alexeyslav
17.05.2019 14:37Радио хорошо если нет возможности проложить провод или как временное решение до прокладки провода. К воротам и гаражу в частном доме не лень должно быть и провод проложить, ведь это надолго и надёжней. С внутренним пространством дома уже сложнее — если ремонт ещё не сделан, имеет смысл стационарные датчики подключить проводом, но такое бывает редко и просто очевидно. Поэтому внутри чаще всего имеет смысл в беспроводных датчиках — ремонт уже сделан, прокладывать провод нет возможности. Хотя есть вариант минимизировать уровни излучения — расположить «точки доступа» для датчиков максимально близко к ним в плинтусах, это снизит требования к мощности передатчика в датчике, а значит повысит автономность и/или помехоустойчивость. Вплоть до того что передавать данные по ИК-каналу.
Andy_Big
17.05.2019 13:48Зато при том же качестве связи тратится меньше энергии, насколько я понимаю ее принцип.
a13aa
17.05.2019 14:00В теории да. Например, в gsm мощность мобильного терминала подстраивается под текущие условия связи, она минимизируется на лету, что позволяет экономить батарею. Но как это сделать в описанном сценарии? Сначала установить связь с хостом на максимуме мощности, потом померять силу сигнала, получить от хоста потребный уровень мощности и только в конце передать пакет из жалких десятков байт? Так проще сразу пакет передать на максимуме.
olartamonov
17.05.2019 14:03Для стационарных устройств нет никакого смысла измерять силу сигнала каждый раз — достаточно это сделать однажды.
Andy_Big
17.05.2019 14:18Сначала установить связь с хостом на максимуме мощности, потом померять силу сигнала, получить от хоста потребный уровень мощности и только в конце передать пакет из жалких десятков байт? Так проще сразу пакет передать на максимуме.
Думаю, что в пределах квартиры-дома можно сразу передавать на мощности, близкой к минимальной, но в широкой полосе.a13aa
17.05.2019 14:26Можно. Но сейчас придут желающие поставить датчик в подвал и скажут, что они не согласны. Другие придут и скажут, у нас однушка и нет лишних денег платить за over engineered продукт, дайте дешевле, нам хватит и 30м связи. Третьи скажут, цена роли не играет, но мы не собираемся менять батарейки в десятках датчиков в среднем раз в месяц, дайте работу от батареи 10 лет и т.д. Как обычно, выясняется, что универсального решения нет.
Andy_Big
17.05.2019 14:39Да можно и еще проще и дешевле — повесить психрометр :)
Но раз уже речь идет о беспроводных датчиках, то единственная причина, которую я вижу, не использовать более современные и более эффективные методы — это неумение использовать их :) Вот для этих модулей есть готовые скетчи, их и используем.
За стоимость в частном применении тоже не очень верю — разница в цене модулей не глобальная и их количество на пользователя исчисляется не тысячами, чтобы имело смысл экономить каждый рубль :)a13aa
17.05.2019 16:22Холивар и демагогия. Автор сделал как ему хочется и поделился. Потом кто-то написал слово лора и понеслось. Да, можно и психрометр. Кому надо, тот сделает как хочет.
Alexeyslav
17.05.2019 14:40Запоминать предыдущий уровень мощности и корректировать при необходимости по ответу.
RamirezRodrigues
17.05.2019 13:06Платы заказывал в Китае на сайте jlcpcb.com, 2 бакса, любой цвет, и через 2 недели вы уже получаете на руки 10 штук «своего творения» :).
А во сколько обошелся shipping? В Украину сейчас 50x50 мм shipping там стоит $6.33.
И да, сейчас любой цвет 2 бакса, но только 5 штук. Если 10 штук — то 5 баксов.sav13
17.05.2019 16:40В РФ где-то также доставка. Особенно если 1.0 — 1.2 делать
50x50 можно сделать 4 штуки на одном листе 100x100 и заказать 5 шт
Я еще стараюсь комбинировать несколько плат, отделяя их панелизацией (если много одинаковых) или фрезировкой, если разные. Все это в базовой стоимости
sav13
17.05.2019 16:19Я так понимаю, что питание от 2032?
Как решаете с просадкой напряжения при передаче (особенно перврй с таким количеством презентаций)?
NRF24 кушает до 20мА при передаче. Mysensors довольно прожорливый протокол и пока идет передача, несвежая батарейка садится проседает ниже 2В, а на таком напряжении мега даже на 8МГц не очень себя ведет.
Пробовал 2450 — пока свежая, нормально работает, стоит немного подсесть батарейки, та же проблема с просадкой напряженияAndy_Big
17.05.2019 18:38питание от 2032?
На фото и в списке компонентов — 2477 :)sav13
17.05.2019 21:32Хорошо, но дорого. Проще маленький литий-ионный аккумулятор уж воткнуть
Alexeyslav
20.05.2019 10:23Литий-ионный аккумулятор или очень дорог или не держит морозы/повышенную температуру. А посему категорически не пойдёт для наружного датчика. Попробуйте подобрать источник питания который бы держал -40 градусов мороз, хотябы в течении нескольких часов без последствий. В автомобиле летом на стоянке приборная панель прогревается до 100+ градусов в лёгкую. Если там что случайно забыть с литиевым аккумулятором можно получить пожар. Впрочем, 100 градусов и 2032 тоже не очень понравится…
Andy_Big
20.05.2019 10:31LiFe держит морозы. А при -40 очень быстро помрет и эта CR :)
Alexeyslav
20.05.2019 10:57Ну отлично, только с массо-габаритом у такой батареи не очень и соответственно ёмкость не очень большая по сравнению с плотностью энергии в 2032.
Berkseo Автор
17.05.2019 18:56презентации я отключаю. она(презентация по сути делается только раз при регистрации в новой сети, далее при перезагрузке или потере парента я шлю коротку презентацию, одним сообщением с айди парента если он изменился при перестроении маршрута. Майсенсорс вряд ли можно назвать прожерливым, вы наверное не видели дебаг при привязке энд девайса к координатору в зиг би :) Прожерлив радиомодуль nRF24l01, поэтому питание на cr2032 не особо подходит, но тем не менее делают и так, тут главное уже ПО — www.openhardware.io/view/657/Temp_Hum-sensors
Alexeyslav
20.05.2019 10:192032 изначально не предназначена для токов разряда больше 2мА, проблема импульсного потребления решается за счет буфферного конденсатора, которого должно хватать на передачу одного пакета без повышения тока через батарейку(конденсатор заряжается от батареи через ограничение тока, резистор или ИСТ не принципиально), это накладывает ограничение лишь на частоту передачи пакетов.
Javian
off «для создания IOT радиосетей на частотах 2.4Ггц, 915, 868, 433 Мгц» я бы посмотрел решение с радиомодулем на одном чипе с микроконтроллером.
Например habr.com/ru/post/386735
Отладочный комплект от Ti:
REPISOT
На него же нет ардуино-скетчей. Там ведь надо программировать.
olartamonov
Мне гугль говорит, что ну хотя бы на nRF52 у ардуинщиков что-то есть.
Минус приёмопередатчик, минус флэшка для обновлений, железо по сложности сводится к среднему блютус-бикону.
sav13
Цена как у небольшого космического аппарата?
NRF24 + ATMega238 (а можно и 88/168) < 2$
Javian
У отладочных комплектов Ti всегда космическая цена.
По компонентам дешевле. В ценах eu.mouser.com:
TPS61291 Повышающий DC-DC преобразователь напряжения с режимом bypass
1,51 €
TPL5111 Системный таймер
0,786 €
TPS22860 Выключатель нагрузки
0,80 €
HDC1000 Датчик влажности и температуры
7,06 €
CC1310 «Беспроводной контроллер»
5,42 €
Сама суть схемы экономии энергии только в использовании таймера и выключателя нагрузки, остальное можно заменить.
На хабре есть статьи о ESP8266 и питании от батареек. Имхо для дома это удобнее и дешевле т.к. уже есть беспроводная сеть — WiFi.
habr.com/ru/post/130421
habr.com/ru/post/257141
habr.com/ru/post/304936