#define MY_DEBUG // Вывод дебага #define MY_RADIO_NRF5_ESB // Выбор типа радиопередатчика(возможные варианты rfm69, rfm95, nrf24l01, nrf51-52) #define MY_RF24_PA_LEVEL (NRF5_PA_MAX) // выбор уровня радиосигнала #define MY_DISABLED_SERIAL // отключение сериала #define MY_PASSIVE_NODE // режим работы ноды(устройство в сети mysensors), PASSIVE означает что отключены все процедуры контроля транспортного уровня, обновление по воздуху, шифрование, безопасность #define MY_NODE_ID 1 // ручное назначение идентификатора ноды #define MY_PARENT_NODE_ID 0 // ручное назначение идентификатора гейта или ретранслятора //#define MY_PARENT_NODE_IS_STATIC // атрибут PARENT_NODE отвечающий за отключение функционала автоматического перестроения маршрута //#define MY_TRANSPORT_UPLINK_CHECK_DISABLED // отключение контроля работоспособности транспортного уровня #include <MySensors.h> // - библиотека MySensors #define TEMP_CHILD_ID 0 // назначение идентификатора сенсора температуры #define HUM_CHILD_ID 1 // назначение идентификатора сенсора влажности #define BARO_CHILD_ID 2 // назначение идентификатора сенсора атмосферного давления #define CHILD_ID_VOLT 254 // назначение идентификатора сенсора заряда батареи MyMessage voltMsg(CHILD_ID_VOLT, V_VOLTAGE); // инициализация сообщения для сенсора заряда батареи MyMessage temperatureMsg(TEMP_CHILD_ID, V_TEMP); // инициализация сообщения для сенсора температуры MyMessage humidityMsg(HUM_CHILD_ID, V_HUM); // инициализация сообщения для сенсора влажности MyMessage pressureMsg(BARO_CHILD_ID, V_PRESSURE); // инициализация сообщения для атмосферного давления
sendSketchInfo("BME280 Sensor", "1.0"); // Название датчика, версия ПО present(CHILD_ID_VOLT, S_MULTIMETER, "Battery"); // Презентация сенсора заряда батареи, тип сенсора, описание present(TEMP_CHILD_ID, S_TEMP, "TEMPERATURE [C or F]"); // Презентация сенсора температуры, тип сенсора, описание present(HUM_CHILD_ID, S_HUM, "HUMIDITY [%]"); // Презентация сенсора влажности, тип сенсора, описание present(BARO_CHILD_ID, S_BARO, "PRESSURE [hPa or mmHg]"); // Презентация сенсора атмосферного давления, тип сенсора, описание
send(voltMsg..set(batteryVoltage)); // отправка данных о заряде батарейки в mW sendBatteryLevel(currentBatteryPercent); // отправка данных о заряде батарейки в % send(temperatureMsg.set(temperature, 1)); // отправка данных о температуре send(humidityMsg.set(humidity, 0)); // отправка данных о влажности send(pressureMsg.set(pressure, 0)); // отправка данных о давлении
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
//#define MY_DEBUG
#define MY_RADIO_NRF5_ESB
#define MY_RF24_PA_LEVEL (NRF5_PA_MAX)
#define MY_DISABLED_SERIAL
#define MY_PASSIVE_NODE
#define MY_NODE_ID 1
#define MY_PARENT_NODE_ID 0
//#define MY_PARENT_NODE_IS_STATIC
//#define MY_TRANSPORT_UPLINK_CHECK_DISABLED
#include <MySensors.h>
bool sleep_flag;
bool metric = true;
bool last_sent_value;
uint16_t currentBatteryPercent;
uint16_t lastBatteryPercent = 1000;
uint16_t battery_vcc_min = 2150;
uint16_t battery_vcc_max = 2950;
uint16_t batteryVoltage;
uint16_t battery_alert_level = 25;
uint32_t default_sleep_time = 60000;
uint32_t SLEEP_TIME;
uint32_t newmillisforbatt;
uint32_t battsendinterval = 3600000;
float tempThreshold = 0.5;
float humThreshold = 5;
float presThreshold = 1;
float pres_mmThreshold = 1;
float temperature;
float pressure;
float pressure_mm;
float humidity;
float lastTemperature = -1;
float lastHumidity = -1;
float lastPressure = -1;
float lastPressure_mm = -1;
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme;
#define TEMP_CHILD_ID 0
#define HUM_CHILD_ID 1
#define BARO_CHILD_ID 2
#define CHILD_ID_VOLT 254
MyMessage voltMsg(CHILD_ID_VOLT, V_VOLTAGE);
MyMessage temperatureMsg(TEMP_CHILD_ID, V_TEMP);
MyMessage humidityMsg(HUM_CHILD_ID, V_HUM);
MyMessage pressureMsg(BARO_CHILD_ID, V_PRESSURE);
void preHwInit() {
pinMode(21, INPUT);
pinMode(25, OUTPUT);
digitalWrite(25, HIGH);
pinMode(26, OUTPUT);
digitalWrite(26, HIGH);
pinMode(27, OUTPUT);
digitalWrite(27, HIGH);
}
void before() {
NRF_POWER->DCDCEN = 1;
NRF_NFCT->TASKS_DISABLE = 1;
NRF_NVMC->CONFIG = 1;
NRF_UICR->NFCPINS = 0;
NRF_NVMC->CONFIG = 0;
if (NRF_SAADC->ENABLE) {
NRF_SAADC->TASKS_STOP = 1;
while (NRF_SAADC->EVENTS_STOPPED) {}
NRF_SAADC->ENABLE = 0;
while (NRF_SAADC->ENABLE) {}
}
pinMode(BLUE_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
digitalWrite(BLUE_LED, HIGH);
digitalWrite(RED_LED, HIGH);
digitalWrite(27, LOW);
}
void setup()
{
digitalWrite(27, HIGH);
bme_initAsleep();
wait(100);
sendBatteryStatus();
wait(100);
}
void presentation() {
sendSketchInfo("EFEKTA BME280 Sensor", "1.2");
present(CHILD_ID_VOLT, S_MULTIMETER, "Battery");
present(TEMP_CHILD_ID, S_TEMP, "TEMPERATURE [C or F]");
present(HUM_CHILD_ID, S_HUM, "HUMIDITY [%]");
present(BARO_CHILD_ID, S_BARO, "PRESSURE [hPa or mmHg]");
}
void loop() {
wait(10);
bme.takeForcedMeasurement();
wait(100);
sendData();
if (millis() - newmillisforbatt >= battsendinterval) {
sleep_flag = 1;
sendBatteryStatus();
}
if (sleep_flag == 0) {
sleep(SLEEP_TIME);
sleep_flag = 1;
}
}
void blinky(uint8_t pulses, uint8_t repit, uint8_t ledColor) {
for (int x = 0; x < repit; x++) {
if (x > 0) {
sleep(500);
}
for (int i = 0; i < pulses; i++) {
if (i > 0) {
sleep(100);
}
digitalWrite(ledColor, LOW);
wait(20);
digitalWrite(ledColor, HIGH);
}
}
}
void sendBatteryStatus() {
wait(20);
batteryVoltage = hwCPUVoltage();
wait(2);
if (batteryVoltage > battery_vcc_max) {
currentBatteryPercent = 100;
}
else if (batteryVoltage < battery_vcc_min) {
currentBatteryPercent = 0;
}
else {
if (lastBatteryPercent == 1000) {
currentBatteryPercent = (100 * (batteryVoltage - battery_vcc_min)) / (battery_vcc_max - battery_vcc_min) + 5;
} else {
currentBatteryPercent = (100 * (batteryVoltage - battery_vcc_min)) / (battery_vcc_max - battery_vcc_min) - 5;
}
}
sendBatteryLevel(currentBatteryPercent);
wait(100);
if (lastBatteryPercent < battery_alert_level) {
blinky(3, 1, RED_LED);
}
else {
blinky((last_sent_value == true ? 2 : 1), 1, BLUE_LED);
}
sleep_flag = 0;
newmillisforbatt = millis();
}
void sendData() {
temperature = bme.readTemperature();
wait(20);
humidity = bme.readHumidity();
wait(20);
pressure = bme.readPressure() / 100.0F;
if (!metric) {
temperature = temperature * 9.0 / 5.0 + 32.0;
} else {
pressure = pressure * 0.75006375541921;
}
CORE_DEBUG(PSTR("MY_TEMPERATURE: %d\n"), (int)temperature);
CORE_DEBUG(PSTR("MY_HUMIDITY: %d\n"), (int)humidity);
CORE_DEBUG(PSTR("MY_PRESSURE: %d\n"), (int)pressure);
if (abs(temperature - lastTemperature) >= tempThreshold) {
send(temperatureMsg.set(temperature, 1));
lastTemperature = temperature;
sleep(1000);
}
if (abs(humidity - lastHumidity) >= humThreshold) {
send(humidityMsg.set(humidity, 0));
lastHumidity = humidity;
sleep(1000);
}
if (abs(pressure - lastPressure) >= presThreshold) {
send(pressureMsg.set(pressure, 0));
lastPressure = pressure;
sleep(1000);
}
sleep_flag = 0;
}
void bme_initAsleep() {
if (! bme.begin(&Wire)) {
while (1);
}
bme.setSampling(Adafruit_BME280::MODE_FORCED,
Adafruit_BME280::SAMPLING_X1, // temperature
Adafruit_BME280::SAMPLING_X1, // pressure
Adafruit_BME280::SAMPLING_X1, // humidity
Adafruit_BME280::FILTER_OFF );
wait(1000);
}
+54 |
2375
67
|
+165 |
3664
48
|
А имеющаяся инфраструктура не включает в себя шлюз? Кто тогда принимает данные с этого датчика?
— платы — 4.8 бакса (2 сами платы и 2.8 доставка)
— nRF52832 — 8.8 бакса (5 сам модуль и 3.8 доставка, информация по ссылке из обзора)
Это уже 13.6 баксов :) А еще остальные детали, корпус, батарейка. Сильно выходит за пределы «баксов 10 максимум» :)
Все зависит от точки зрения)))
Стоимость 2 362,22 руб.
Доставка 955,66 руб.
К оплате 3 317,88 руб.
То есть если делаем 10 модулей, то плата стоит менее $1
Ну и если заменить явно избыточный NRF52 на тот же NRF51 за пару баксов с небольшим — получаем уже вполне приемлемую стоимость
Но у автора видимо «дядя на гуталиновой фабрике» )))
Хотя развести один сенсор и светодиод к контроллеру вполне можно и на односторонюю плату
NRF52 поддерживает BLE, но в проекте вместо него используется проприоретарный протокол от Нордика, на котором живет Mysenosrs
Как и от любой поделки до устройства. Если даже допустить, что оно пригодно к производству и использованию(а это не так), то остаётся ещё вопросы корпуса, упаковки, логистики, документации для производства, оснастки для производства, самого производства, всяких коробочек-листовок, инструкций, документации, сертификации, людей, разработки процессов всего этого, позиционирования на рынке, продаж, сервиса и так далее.
Там на хабре автор плавает в том, как протокол работает, что уж говорить о какой-то более серьёзной разработке, чем «залить код с правками в контроллер».
Да и в этом телеграмм-канале, "где всегда с радостью помогут всем ..., советы по работе с протоколом" тоже, судя по всему, не шибко знающие сидят :))
Копайтесь, если вам это нужно
Я вот пользуюсь уже года три и мне ВООБЩЕ неинтересно, как это реализовано на железном уровне
Вам зачем протокол? хотите коммитить? Спишитесь с ними и вам дадут все разъяснения.
Те, кто реально хочет коммитить (а такие люди есть) тут не ноют.
Если вы параноик и боитесь закладок, курите сорсы.
Берете библиотеку, пишите скетч, делаете. Если надо — читаете.
Я делал. Другие делали.
Если вам интересна ЖЕЛЕЗНАЯ реализация, тогда смотрите выше.
Ну то есть так и есть как объяснили в телеграме — «для ардуинщиков, которые просто взяли скетч и залили в девайс». Вот представьте, что сама Ардуино так документировало бы свой продукт — «все есть в коде, берите и разбирайтесь». Так бы и умерло все это в безвестности :) И этот майсенсорс так и останется уделом трех калек при таком подходе к своему развитию.
Коммиты? Или (что самое вероятное) придраться, сказать «фи» и гордо уйти.
И да, лично мне протокол действительно не нужен. Я вообще мимокрокодил. Однако когда на вполне логичный вопрос про описание протокола я вижу ответ «читайте исходные коды» то у меня сразу складывается определенное отношение к авторам этого проекта.
Интересно, если мне не интересны ваши комментарии, означает ли это, что они на этом сайте не нужны, и вас можно забанить, чтобы сэкономить место в бд? Если пользоваться той же логикой, то да.
Людей, которым интресен железный уровень — минимум, при этом а) 90% из России б) 90% этих 90% никогда не будут ничего собирать.
Ради них писать доки?
Ну, вот у меня некоторое время назад стоял вопрос о выборе протокола для подобной системы, и я смотрел на mysensors, и в итоге отказался.
Именно по этой причине — потому что по любому вопросу о чем-то менее тривиальном, чем «залить скетч в ардуино» мне предлагают обращаться в канал, авось там кто-то поможет.
Я с вами спорить не хочу, и переубеждать тоже смысла не вижу. Живите дальше, как жили, если вас устраивает, это замечательно. Но приходя к понимающим людям с «вот так спаять, вот так залить» не удивляйтесь, что вас минусуют за то, что вы не можете толком пояснить, что же вы там заливаете, и как оно работает. Просто потому, что это подход, как выразился не очень приятный мне, но умный человек, который называется, простите, «срали-мазали».
И я не очень понимаю, причем здесь телеграм канал этого замечательного человека. У Mysensors есть официальный.сайт с прекрасным форумом.
И ответьте: что ИМЕННО вы хотели узнать и не нашли?
Минусам я не удивляюсь, здесь вообще весьма токсичная аудитория
Полагаю, будет абсолютно логично, если я вас отправлю искать ответ на этот ваш вопрос в комментарии к статье на хабре. Там где-то это определенно написано, а так как ответ на вопрос нужен вам, а не мне, вам его и искать. Такая практика прекрасно работает, судя по ответам сторонников mysensors, когда их спрашивают что-то о протоколе.
Методика такая: ухватиться за небольшой изъян и глобализировать.
НИКТО мне не ответил на вопрос «зачем нужен протокол» и «что мешает его найти в сорсах, если он так нужен»
Вот человек, перенесший протокол (именно, протокол) на nrf5, он не вопил, он просто взял и сделал
Просто весь срач начался с того, что на простой тезис «у вас нет описания протокола» люди ответили не «да, нет, сообщество не считает нужным тратить ресурсы на доку для разработчиков» а «протокол есть, но только в сорцах, если надо, разберетесь, и вообще, он вам не нужен, потому что вы не можете четко ответить, зачем он нужен».
Тем, что сорцы — это реализация, а я хочу читать логику, абстрагируясь от тонкостей упаковки массивов в си и прочего такого же. Если очень надо, то, конечно, можно. Но вот повышенный порог входа при чтении исходников вместо описания протокола приводит к тому, что люди, пишущие статьи и применяющие железо в своих проектах, как, например @berk, совершенно теряются при вопросе про то, зачем нужен счетчиков пакетов в пакете и как это помогает безопасности.
Зачем им тратить время на 5 человек из РФ (а такие «любопытные», по опыту, только здесь), когда в это время можно всяких фич добавить или баги устранить?
Однако вместо этого началась какая то чушь про закладки, коммиты, и вообще «он вам не нужен».
Он описан ДОСКОНАЛЬНО.
www.mysensors.org/download/serial_api_20#message-structure
Он описан ДОСКОНАЛЬНО.
www.mysensors.org/download/serial_api_20#message-structure
Например, я сейчас потихоньку разрабатываю управление летним душем — поддержание уровня воды в баке, подогрев, индикация и т.д. Не на ардуинах. Может быть я бы и поддержал этот протокол, почему нет? Мне все равно, а кому-то может быть польза. Но так как внятного описания этого протокола нет, то мне проще реализовать свой протокол, чем копаться в чужих исходниках, восстанавливая протокол по ним.
Он описан ДОСКОНАЛЬНО.
www.mysensors.org/download/serial_api_20#message-structure
А если вы для для каждой своей поделки изобретаете протокол на уровне железа, то дерзайте
У Вас с логикой явно не все в порядке :) Нет, я не изобретаю протокол для каждой своей железки.
А то все это кошки-мышки напоминает
Но нет, тут вопрос стоит о протоколе, по которому датчик передает данные :)
По этому же протоколу датчики обращаются к шлюзу.
Это единый протокол.
По этому же протоколу датчики обращаются к шлюзу.
Это единый протокол.
И вы продолжаете играть в кошки-мышки. Какой протокол вам нужен?
Единый для чего? Там черному по белому написано: «Последовательный протокол, используемый между шлюзом и контроллером». И ни слова про «между шлюзом и нодами/датчиками».
Говорю, тк писал свой шлюз.
Более того, если посмотреть логи датчиков, то это видно.
Почитайте внимательнее.
Я вам его предоставил.
Что дальше?
Если бы сенсоры с автономным питанием еще и данные передавали обычным текстом, то это был бы вообще полный фэйл. Совершеннейший пример как не нужно делать автономные датчики.
Пишите свой протокол для вашей теплицы.
Ps у меня есть ответ, но общаться нет никакого желания.
За остальными ответами идите на форум.
То, что я знаю, я там подчерпнул. И мой сенсор MYS работает от батарейки уже 2 года и ещё столько же проработает.
Но Вы и неуважаемый AndyBlog можете сделать свои, суперпрпвильные, которые проработают 50
Не готов с Вами тут больше общаться, сорри.
Изгалялись тут надо мной, минусовали, теперь сказать нечего. До свидания.
Мы, может, и токсичные, но не стоит оскорблять тех, кто писал документацию, подозрениями о том, что они неправильно назвали страницу: там все правильно, если написано API, значит на страничке API.
Ответа, я так понимаю, не будет?
А так прикольно!
Купил бы готовый такой))
Купил себе участок и постройка дома отбирает все силы.
Коробка закончена, пару комнат уже жилых но это всего 20 кв.м. из 120.
+ участок.
Столько всего, что сидеть не вариант.
Паяльник сын чаще меня достает уже почти год.
Я все обзор на приемники хочу опубликовать но… каждую неделю, что напишу… А времени увы((
А так дома пару дуринок есть)))
Вижу у
на телефоне картинку с параметрами. Очень понравилось и хочу себе такое.
Можно ли это реализовать без плясок с бубном с программированием, просто купив какую ни будь плату или блок на Али и по блютузу или вайфаю подключить к смартфону?
Соноф Базик + BME280 = это что?
или обратитесь на 4ПДА к москвичам чтобы продали вам комплект. я бы продал но я из Питера.
Вот я и спрашиваю, полноценная замена?
И габариты у сонофф не те слегка
Из плюсов — через домотикз и хоумбридж интегрирован в эппл хоумкит и отлично работает. Данный девайс можно в хоумкит?
NRF52 на базе STM32 явно избыточен для такого простого девайса.
p.s. Кстати, почему автор уже в третьем проекте так усиленно избегает публикацию схем?
Это что, жуткое ноухау?
Все китайцы на свои коммерческие продукты их давно публикуют
Sparkfun, Wemos, Sonoff (Itead) — все схемы публикуют в свободном доступе на свои устройства.
Те кто по схеме способен повторить такое устройство по схеме, никогда не купят у автора задорого, зато по косячкам подскажут много
Разница копеечная, а удобство налицо
Если взять Atmega168 (для данной задачи вполне достаточно), то еще дешевле
Ну и все неудобство это распаять TQFP32 корпус на плату
Тут что-то вроде мало потребляющего stm8l051 за 0.5$ нужно. Даже на 16МГц в активном режиме 1.9мА.
А в режиме сна они все на уровне саморазряда батареи кушают
Еще я там и цену привел, ведь речь в вашем сообщении была вроде как о: ? И даже еще один вариант МК привел, еще дешевле.
Но судя по вашему ответу и все что вы из моего ответа смогли вынести, не обращайте внимание, пользуйтесь «самым дешевым вариантом», сразу видно разбирающегося человека в характеристиках и ассортименте МК :)).
движение+sht20
но он же не примет с этого сенсора данные еще нужно как то прикрутить nRF52832
но как все это связать не написано может кто подскажет
сенсоры на нрф5, репитеры, гейт совместимы с сенсорами репитерами гейтом на нрф24l01
их надо ставить на плату таким образом, чтобы минимизировать влияние температуры платы
както примерно так:
g1tech.org/wp-content/uploads/2019/01/bme1.jpg
P.S. гдето помоему у silabs был application note на эту тему, но сходу не нашел
Еще есть фотка с измерителя температуры/влажности правлиьного
sales.wspanialysklep.org/storage/thumbnails/4/55160_Bezprzewodowy-termometr-cyfrowy-miernik-wilgotno%C5%9Bci-higrometr-termometr-ms6508.jpg
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.