Оптимизация объема данных от датчиков

Ответить
Аватара пользователя
Sandr
Сообщения: 124
Зарегистрирован: Пн ноя 16, 2015 5:10 pm
Благодарил (а): 19 раз
Поблагодарили: 26 раз

Оптимизация объема данных от датчиков

Сообщение Sandr » Чт апр 21, 2016 10:24 am

Обратил внимание что при большом количестве нод/сенсоров объем данных идущих на MJD не разумно большой
(Если использовать стандартные примеры с mySensors.org)

По моему IMHO в редком случае нам столь уж важно знать поменялась ли температура на 0.1 градуса или влажность на 0,1%
в результате предлагаю ввести в скетчи нод расчет разницы в значениях предыдущий/полученный
выглядит это так
вводим новую переменную в начале скетча
float diff = 0;

и при каждом измерении производим расчет разницы
diff = abs ( предыдущий_замер - полученный_замер);

а далее в условии решающем отсылать ли данные на gateway
пишем
if (diff > 0.1){
gw.send( .........
}
например в данном случае будут отправляться обновления лишь если разница более 0,1
У себя я использую для комнатных датчиков температуры/влажности порог в 0,2
мне вообщем то не важно что в комнате выросла температура на 0.2 градуса
а вот на 0,3 ....... :)))))) (шутка)

далее выложу пару своих скетчей
Последний раз редактировалось Sandr Чт апр 21, 2016 12:42 pm, всего редактировалось 1 раз.
Win Home Serv 2011 / Intel Core i3 / 32 GB ram /
Сцена погода (вертикальная)
mySensor скетчи ( 4х канальный димер | Оптимизация скетчей )
Ну и конечно моя маленькая фабрика - 3D печать / фрезеровка / литье
Аватара пользователя
Sandr
Сообщения: 124
Зарегистрирован: Пн ноя 16, 2015 5:10 pm
Благодарил (а): 19 раз
Поблагодарили: 26 раз

датчик Движения + температуры/влажности (PIR + DHT)

Сообщение Sandr » Чт апр 21, 2016 10:35 am

Мой любимый датчик Температура/Влажность + Движения (собран из примеров на mysensors.org)
Простой и надежный вариант -вешается подальше от обогревающих элементов (батарея/телевизор и т.п) По Российским нормам "На уровне 1.5м от пола, не на стене разделяющей с улицей"

Ну и в месте дающем хороший обзор датчику движения
СпойлерПоказать

Код: Выделить всё

/**
   The MySensors Arduino library handles the wireless radio link and protocol
   between your home built sensors/actuators and HA controller of choice.
   The sensors forms a self healing radio network with optional repeaters. Each
   repeater and gateway builds a routing tables in EEPROM which keeps track of the
   network topology allowing messages to be routed to nodes.

   Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
   Copyright (C) 2013-2015 Sensnology AB
   Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors

   Documentation: http://www.mysensors.org
   Support Forum: http://forum.mysensors.org

   This program is free software; you can redistribute it and/or
   modify it under the terms of the GNU General Public License
   version 2 as published by the Free Software Foundation.

 *******************************

   REVISION HISTORY
   Version 1.0 - Henrik Ekblad

   DESCRIPTION
   Motion Sensor example using HC-SR501
   http://www.mysensors.org/build/motion

*/

#include <MySensor.h>
#include <SPI.h>
#include <DHT.h>

unsigned long SLEEP_TIME = 120000; // Sleep time between reports (in milliseconds)
#define DIGITAL_INPUT_SENSOR 3   // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
#define HUMIDITY_SENSOR_DIGITAL_PIN 5
#define INTERRUPT DIGITAL_INPUT_SENSOR-2 // Usually the interrupt = pin -2 (on uno/nano anyway)
#define CHILD_ID_HUM 0
#define CHILD_ID_TEMP 1
#define CHILD_ID_MOTION 2   // Id of the sensor child

MySensor gw;
DHT dht;
float lastTemp;
float lastHum;
boolean lastTripped;
float diff = 0;
boolean metric = true;
// Initialize motion message
MyMessage msgHum(CHILD_ID_HUM, V_HUM);
MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
MyMessage msgMotion(CHILD_ID_MOTION, V_TRIPPED);

void setup()
{
  gw.begin();
  dht.setup(HUMIDITY_SENSOR_DIGITAL_PIN);

  // Send the sketch version information to the gateway and Controller
  gw.sendSketchInfo("Motion Sensor & DHT22", "1.2");

  pinMode(DIGITAL_INPUT_SENSOR, INPUT);      // sets the motion sensor digital pin as input
  // Register all sensors to gw (they will be created as child devices)
  gw.present(CHILD_ID_HUM, S_HUM);
  gw.present(CHILD_ID_TEMP, S_TEMP);
  gw.present(CHILD_ID_MOTION, S_MOTION);

  metric = gw.getConfig().isMetric;
}

void loop()
{
  // Read digital motion value
  boolean tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH;
#ifdef DEBUG
  Serial.print("PIR: ");
  Serial.println(tripped);
#endif
  if ( lastTripped != tripped ){
    lastTripped = tripped;
    gw.send(msgMotion.set(tripped ? "1" : "0")); // Send tripped value to gw
  }
  delay(dht.getMinimumSamplingPeriod());

  float temperature = dht.getTemperature();
  diff = abs(temperature - lastTemp);
  if (isnan(temperature)) {
    Serial.println("Failed reading temperature from DHT");
  } else if ( diff > 0.2 ) {
    lastTemp = temperature;
    if (!metric) {
      temperature = dht.toFahrenheit(temperature);
    }
    gw.send(msgTemp.set(temperature, 1));
#ifdef DEBUG
    Serial.print("T: ");
    Serial.println(temperature);
#endif
  }

  float humidity = dht.getHumidity();
  diff = abs(humidity - lastHum);
  if (isnan(humidity)) {
#ifdef DEBUG
    Serial.println("Failed reading humidity from DHT");
#endif
  } else if (diff > 0.2) {
    lastHum = humidity;
    gw.send(msgHum.set(humidity, 1));
#ifdef DEBUG
    Serial.print("H: ");
    Serial.println(humidity);
#endif
  }
  // Sleep until interrupt comes in on motion sensor. Send update every two minute.
  gw.sleep(INTERRUPT, CHANGE, SLEEP_TIME);
}
Данные о температуре/влажности отправляются:
1) если обнаружено движение и разница в значениях (было/стало) более 0.2
2) если с предыдущей отправки прошло две минуты (а движения нет) и разница в значениях (было/стало) более 0.2

PS: немного подправил исходники - все serial.print завел в #ifdef DEBUG
Вложения
ms_Motion_DHT22_Sensor.rar
Готовый скетч
(1.69 КБ) 154 скачивания
За это сообщение автора Sandr поблагодарили (всего 2):
lanket (Чт апр 21, 2016 2:15 pm) • TrDA (Ср апр 03, 2019 11:40 am)
Рейтинг: 2.53%
Win Home Serv 2011 / Intel Core i3 / 32 GB ram /
Сцена погода (вертикальная)
mySensor скетчи ( 4х канальный димер | Оптимизация скетчей )
Ну и конечно моя маленькая фабрика - 3D печать / фрезеровка / литье
Ivan
Сообщения: 1474
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 323 раза

Re: Оптимизация объема данных от датчиков

Сообщение Ivan » Чт апр 21, 2016 12:32 pm

Не понятно причем тут модуль. Оптимизируйте передачу на стороне датчика. Заодно сэкономите батарейку.

Небольшое замечание насчёт стены на улицу и температурного датчика. Всё правильно, но вот если он у вас совмещён с датчиком движения, то его лучше какраз крепить на стену возле окна. Потому как если на противоположную он будет слепится солнцем, а ещё будет ловить движение шторы при открытом окне (Хоть штора не излучает тепло но вот когда на неё падает солнце, 100% срабатывание). Получается вы либо получаете температуру с погрешностью (холод от внешней стены), либо проблему с датчиком движения.

Я вот всё хотел сделать мульти устройство: датчик температуры + влажности + движения + дыма + инфракрасный передатчик + 2 релюшки для люстры. Всё это запихнуть в коробку от датчика дыма и повесить возле люстры (то есть по середине комнаты) заодно питаться от сети люстры и управлять ею
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
Аватара пользователя
Sandr
Сообщения: 124
Зарегистрирован: Пн ноя 16, 2015 5:10 pm
Благодарил (а): 19 раз
Поблагодарили: 26 раз

Re: Оптимизация объема данных от датчиков

Сообщение Sandr » Чт апр 21, 2016 12:41 pm

Ivan писал(а):Не понятно причем тут модуль. Оптимизируйте передачу на стороне датчика. Заодно сэкономите батарейку.
А кто сказал "Модуль" ?
Я как раз и привожу пример с оптимизацией на датчике.
Ivan писал(а):Небольшое замечание насчёт стены на улицу и температурного датчика. Всё правильно, но вот если он у вас совмещён с датчиком движения, то его лучше какраз крепить на стену возле окна. Потому как если на противоположную он будет слепится солнцем, а ещё будет ловить движение шторы при открытом окне (Хоть штора не излучает тепло но вот когда на неё падает солнце, 100% срабатывание). Получается вы либо получаете температуру с погрешностью (холод от внешней стены), либо проблему с датчиком движения.
С доводами согласен - но все зависит от расположения помещения относительно сторон света
У меня например в каждом из помещений есть не наружная стена, не освещаемая солнцем :)
Ivan писал(а): Я вот всё хотел сделать мульти устройство: датчик температуры + влажности + движения + дыма + инфракрасный передатчик + 2 релюшки для люстры. Всё это запихнуть в коробку от датчика дыма и повесить возле люстры (то есть по середине комнаты) заодно питаться от сети люстры и управлять ею
Лишь температуру/влажность надо исключить - под потолком другой климат чем на полу :)
Win Home Serv 2011 / Intel Core i3 / 32 GB ram /
Сцена погода (вертикальная)
mySensor скетчи ( 4х канальный димер | Оптимизация скетчей )
Ну и конечно моя маленькая фабрика - 3D печать / фрезеровка / литье
Ivan
Сообщения: 1474
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 323 раза

Re: Оптимизация объема данных от датчиков

Сообщение Ivan » Чт апр 21, 2016 1:03 pm

Sandr писал(а):Лишь температуру/влажность надо исключить - под потолком другой климат чем на полу :)
Лучше в объектах сделать метод поправок данных. Например опустить температуру на 0.5 (лишьбы не зависило от прямого нагрева солнца)

Вообще я думаю +-1 градус погрешность это не страшно.
Если просто мониторить вообще не страшно.
А если опираться на эти данные для управления (у меня отопление). То у меня и без поправок нормально (усреднение на дом). Хотя зимой при сильном ветре видна разница на 2 градуса в зависимости от расположения комнат к направлению ветра
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
Аватара пользователя
Sandr
Сообщения: 124
Зарегистрирован: Пн ноя 16, 2015 5:10 pm
Благодарил (а): 19 раз
Поблагодарили: 26 раз

Re: Оптимизация объема данных от датчиков

Сообщение Sandr » Вт май 03, 2016 9:07 pm

Еще один доработанный скетч от mySensors
на этот раз ШИМ димер

В оригинальном, одноканальном, скетче написано "This sketch is extensible to support more than one MOSFET/PWM dimmer per circuit."
На мой взгляд скалирование (увеличение каналов) в нем производится не очень удобно
Вот и дописал его дополнив структурой каналов

Код: Выделить всё

// Структура сенсоров
typedef struct {
  int ledPin; // PWM Порт
  int currLvl; // текущий уровень
  MyMessage dimmerMsg;
  MyMessage lightMsg;
} dSensor;
dSensor registers[3] = {
  {3, 0, {0, V_DIMMER}, {0, V_LIGHT}},
  {5, 0, {1, V_DIMMER}, {1, V_LIGHT}},
  {6, 0, {2, V_DIMMER}, {2, V_LIGHT}},
};
 
Теперь достаточно добавить в массив структуры необходимое количество PWM (ШИМ) портов
Единственное ограничение - эти самые ШИМ порты
у ATMEGA 328 их всего 6 (3, 5, 6, 9, 10, 11) причем 9-11 заняты радиомодулем :(
ну да иладно - не все порты нам нужны с димерами
в конце концом можно выставить 3 димируемых вывода и 4 просто включение выключение
например так

Код: Выделить всё

dSensor registers[7] = {
  {3, 0, {0, V_DIMMER}, {0, V_LIGHT}}, // PWM
  {5, 0, {1, V_DIMMER}, {1, V_LIGHT}}, // PWM
  {6, 0, {2, V_DIMMER}, {2, V_LIGHT}}, // PWM
  {2, 0, {3, V_DIMMER}, {3, V_LIGHT}}, // on/off
  {4, 0, {4, V_DIMMER}, {4, V_LIGHT}}, // on/off
  {7, 0, {5, V_DIMMER}, {5, V_LIGHT}}, // on/off
  {8, 0, {6, V_DIMMER}, {6, V_LIGHT}}, // on/off
}; 
PS% Зато в MEGA портов ШИМ целых 15 шт

Пробуем и комментируем
ms_DimmableLEDActuatorX.zip
(1.8 КБ) 125 скачиваний
PSS: И еще в дополнение, по работе я часто сталкиваюсь с PWM димированием. И мы часто используем PWM усилители производства SunRich
в частности 4х канальные на 5 Ампер и на 8 Ампер, Усилители поддерживают работу с диодами на 12/24/36 вольт, что очень удобно при выборе ленты

В результате я ставлю на каждый управляющий вывод ардуины по оптопаре PC817 (по 2 руб аз шт) и управляю таким 4х канальным усилителем
Например 8 ампер на 24в это 192 вата на канал - аж 30 метров ленты 4.8 вата на канал (или 120 метров одноцветной на 4х канала) при учете 25% запаса прочности
За это сообщение автора Sandr поблагодарил:
NightRider (Ср май 04, 2016 12:02 am)
Рейтинг: 1.27%
Win Home Serv 2011 / Intel Core i3 / 32 GB ram /
Сцена погода (вертикальная)
mySensor скетчи ( 4х канальный димер | Оптимизация скетчей )
Ну и конечно моя маленькая фабрика - 3D печать / фрезеровка / литье
Аватара пользователя
Sandr
Сообщения: 124
Зарегистрирован: Пн ноя 16, 2015 5:10 pm
Благодарил (а): 19 раз
Поблагодарили: 26 раз

Re: Оптимизация объема данных от датчиков

Сообщение Sandr » Ср май 04, 2016 9:25 am

Небольшое дополнение к ШИМ димеру

Для тех кому нужны еще пара димируемых ШИМ каналов на одной atmega328

в файле /libraries/MySensors/MyConfig.h
меняем порты CSN/CE с 9/10 на 7/8

Код: Выделить всё

/**********************************
*  NRF24L01 Driver Defaults
***********************************/
#define RF24_CE_PIN           7
#define RF24_CS_PIN           8 
и переключаем NRF на эти два пина
тем самым освобождая 9 и 10 PWM пины ,)

В результате у нас 5 димируемых каналов на одной AtMega328

*** Сообщение запрещено. Сообщение похоже на спам. ***
За это сообщение автора Sandr поблагодарил:
ipz (Ср июл 20, 2016 12:38 am)
Рейтинг: 1.27%
Win Home Serv 2011 / Intel Core i3 / 32 GB ram /
Сцена погода (вертикальная)
mySensor скетчи ( 4х канальный димер | Оптимизация скетчей )
Ну и конечно моя маленькая фабрика - 3D печать / фрезеровка / литье
Ivan
Сообщения: 1474
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 323 раза

Re: Оптимизация объема данных от датчиков

Сообщение Ivan » Ср май 04, 2016 12:45 pm

Учтите что скетчи на MySensors демонстрационные, а не законченные
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
Ответить