Модуль температура+датчик присутствия+реле

Ответить
Vladimir_st
Сообщения: 22
Зарегистрирован: Чт янв 11, 2018 6:32 am
Благодарил (а): 2 раза
Поблагодарили: 0

Модуль температура+датчик присутствия+реле

Сообщение Vladimir_st » Пн сен 24, 2018 2:05 pm

Пробую собрать модуль для установки в комнаты.
Желанию получать информацию:
1.Что кто-то есть дома,
2. Температуру по комнатам
3. Управление светом (включение дежурной подсветки в коридорах, имитация что в доме кто то находится).
Плюс в прихожей управление уличным светом по времени захода\восхода солнца.

Собрал данный скетч:

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

// Enable debug prints to serial monitor
#define MY_DEBUG 

// Enable and select radio type attached
#define MY_RADIO_NRF24
//#define MY_RADIO_RFM69
#define MY_REPEATER_FEATURE
#include <SPI.h>
#include <MySensors.h>  
#include <DallasTemperature.h>
#include <OneWire.h>



#define RELAY_PIN 4  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
#define NUMBER_OF_RELAYS 2 // Total number of attached relays
#define RELAY_ON 1  // GPIO value to write to turn on attached relay
#define RELAY_OFF 0 // GPIO value to write to turn off attached relay
#define COMPARE_TEMP 1 // Send temperature only if changed? 1 = Yes 0 = No


#define DIGITAL_INPUT_SENSOR 3   // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
#define CHILD_ID 3   // Id of the sensor child

#define ONE_WIRE_BUS 2 // Pin where dallase sensor is connected 
#define MAX_ATTACHED_DS18B20 1
unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds)
OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
DallasTemperature sensors(&oneWire); // Pass the oneWire reference to Dallas Temperature. 
float lastTemperature[MAX_ATTACHED_DS18B20];
int numSensors=0;
bool receivedConfig = false;
bool metric = true;
// Initialize temperature message
MyMessage msgtemp(0,V_TEMP);
MyMessage msg(CHILD_ID, V_TRIPPED);

void before()
{
  for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
    // Then set relay pins in output mode
    pinMode(pin, OUTPUT);
    // Set relay to last known state (using eeprom storage)
    digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF);
  }  
  // Startup up the OneWire library
  sensors.begin();
}

void setup()  
{ 
 pinMode(DIGITAL_INPUT_SENSOR, INPUT);      // sets the motion sensor digital pin as input 

  // requestTemperatures() will not block current thread
  sensors.setWaitForConversion(false);
}

void presentation() 

{

  sendSketchInfo("Nano, kor", "1.1");

    present(CHILD_ID, S_MOTION); 
 for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
 
    // Register all sensors to gw (they will be created as child devices)
    present(sensor, S_BINARY);
}
    

    
  // Fetch the number of attached temperature sensors  
  numSensors = sensors.getDeviceCount();

  // Present all sensors to controller
  for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
    
     present(i, S_TEMP);
}

  }



void loop()     
  {
      bool tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH;
 
    Serial.println(tripped);
    send(msg.set(tripped?"1":"0"));  // Send tripped value to gw

    // Sleep until interrupt comes in on motion sensor. Send update every two minute.
    sleep(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR), CHANGE, SLEEP_TIME);   

  // Fetch temperatures from Dallas sensors
  sensors.requestTemperatures();

  // query conversion time and sleep until conversion completed
  int16_t conversionTime = sensors.millisToWaitForConversion(sensors.getResolution());
  // sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater)
  sleep(conversionTime);

  // Read temperatures and send them to controller 
  for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {

    // Fetch and round temperature to one decimal
    float temperature = static_cast<float>(static_cast<int>((getControllerConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;

    // Only send data if temperature has changed and no error
    #if COMPARE_TEMP == 1
    if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) {
    #else
    if (temperature != -127.00 && temperature != 85.00) {
    #endif

      // Send in the new temperature
      send(msgtemp.setSensor(i).set(temperature,1));
      // Save new temperatures for next compare
      lastTemperature[i]=temperature;
    }
    sleep(SLEEP_TIME);
    Serial.println(temperature);
  }
}
void receive(const MyMessage &message)
{
  // We only expect one type of message from controller. But we better check anyway.
  if (message.type==V_STATUS) {
    // Change relay state
    digitalWrite(message.sensor-1+RELAY_PIN, message.getBool()?RELAY_ON:RELAY_OFF);
    // Store state in eeprom
    saveState(message.sensor, message.getBool());
    // Write some debug info
    Serial.print("Incoming change for sensor:");
    Serial.print(message.sensor);
    Serial.print(", New status: ");
    Serial.println(message.getBool());
  }
 } 
 
Плюс гейт на Меге с W5100.
Все работает, но не могу победить реле. Не управляется хоть ты тресни.

Благодарен буду за любую помощь, ардуино начал заниматься не так давно и еще не все достаточно понимаю.
Berkseo
Сообщения: 56
Зарегистрирован: Вт янв 24, 2017 12:30 am
Благодарил (а): 6 раз
Поблагодарили: 22 раза

Re: Модуль температура+датчик присутствия+реле

Сообщение Berkseo » Пн сен 24, 2018 2:31 pm

Vladimir_st писал(а):
Пн сен 24, 2018 2:05 pm
Пробую собрать модуль для установки в комнаты.
Желанию получать информацию:
1.Что кто-то есть дома,
2. Температуру по комнатам
3. Управление светом (включение дежурной подсветки в коридорах, имитация что в доме кто то находится).
Плюс в прихожей управление уличным светом по времени захода\восхода солнца.

Собрал данный скетч:

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

// Enable debug prints to serial monitor
#define MY_DEBUG 

// Enable and select radio type attached
#define MY_RADIO_NRF24
//#define MY_RADIO_RFM69
#define MY_REPEATER_FEATURE
#include <SPI.h>
#include <MySensors.h>  
#include <DallasTemperature.h>
#include <OneWire.h>



#define RELAY_PIN 4  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
#define NUMBER_OF_RELAYS 2 // Total number of attached relays
#define RELAY_ON 1  // GPIO value to write to turn on attached relay
#define RELAY_OFF 0 // GPIO value to write to turn off attached relay
#define COMPARE_TEMP 1 // Send temperature only if changed? 1 = Yes 0 = No


#define DIGITAL_INPUT_SENSOR 3   // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
#define CHILD_ID 3   // Id of the sensor child

#define ONE_WIRE_BUS 2 // Pin where dallase sensor is connected 
#define MAX_ATTACHED_DS18B20 1
unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds)
OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
DallasTemperature sensors(&oneWire); // Pass the oneWire reference to Dallas Temperature. 
float lastTemperature[MAX_ATTACHED_DS18B20];
int numSensors=0;
bool receivedConfig = false;
bool metric = true;
// Initialize temperature message
MyMessage msgtemp(0,V_TEMP);
MyMessage msg(CHILD_ID, V_TRIPPED);

void before()
{
  for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
    // Then set relay pins in output mode
    pinMode(pin, OUTPUT);
    // Set relay to last known state (using eeprom storage)
    digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF);
  }  
  // Startup up the OneWire library
  sensors.begin();
}

void setup()  
{ 
 pinMode(DIGITAL_INPUT_SENSOR, INPUT);      // sets the motion sensor digital pin as input 

  // requestTemperatures() will not block current thread
  sensors.setWaitForConversion(false);
}

void presentation() 

{

  sendSketchInfo("Nano, kor", "1.1");

    present(CHILD_ID, S_MOTION); 
 for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
 
    // Register all sensors to gw (they will be created as child devices)
    present(sensor, S_BINARY);
}
    

    
  // Fetch the number of attached temperature sensors  
  numSensors = sensors.getDeviceCount();

  // Present all sensors to controller
  for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
    
     present(i, S_TEMP);
}

  }



void loop()     
  {
      bool tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH;
 
    Serial.println(tripped);
    send(msg.set(tripped?"1":"0"));  // Send tripped value to gw

    // Sleep until interrupt comes in on motion sensor. Send update every two minute.
    sleep(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR), CHANGE, SLEEP_TIME);   

  // Fetch temperatures from Dallas sensors
  sensors.requestTemperatures();

  // query conversion time and sleep until conversion completed
  int16_t conversionTime = sensors.millisToWaitForConversion(sensors.getResolution());
  // sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater)
  sleep(conversionTime);

  // Read temperatures and send them to controller 
  for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {

    // Fetch and round temperature to one decimal
    float temperature = static_cast<float>(static_cast<int>((getControllerConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;

    // Only send data if temperature has changed and no error
    #if COMPARE_TEMP == 1
    if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) {
    #else
    if (temperature != -127.00 && temperature != 85.00) {
    #endif

      // Send in the new temperature
      send(msgtemp.setSensor(i).set(temperature,1));
      // Save new temperatures for next compare
      lastTemperature[i]=temperature;
    }
    sleep(SLEEP_TIME);
    Serial.println(temperature);
  }
}
void receive(const MyMessage &message)
{
  // We only expect one type of message from controller. But we better check anyway.
  if (message.type==V_STATUS) {
    // Change relay state
    digitalWrite(message.sensor-1+RELAY_PIN, message.getBool()?RELAY_ON:RELAY_OFF);
    // Store state in eeprom
    saveState(message.sensor, message.getBool());
    // Write some debug info
    Serial.print("Incoming change for sensor:");
    Serial.print(message.sensor);
    Serial.print(", New status: ");
    Serial.println(message.getBool());
  }
 } 
 
Плюс гейт на Меге с W5100.
Все работает, но не могу победить реле. Не управляется хоть ты тресни.

Благодарен буду за любую помощь, ардуино начал заниматься не так давно и еще не все достаточно понимаю.
Есть несколько моментов. У вас что за реле, по коду идет "перебор" при инициализации сенсоров реле, так используют когда их много, но кнопка судя по интеррупту у вас одна, это как? Неуправляется.... я так понимаю с контролера, а как? если у вас нода спит, и как она может быть спящей если у вас режим репитера работает. опишите ваш проект, что из железа, подправлю скетч что бы все работало, но надо понмать что там у вас и на каких пинах
Vladimir_st
Сообщения: 22
Зарегистрирован: Чт янв 11, 2018 6:32 am
Благодарил (а): 2 раза
Поблагодарили: 0

Re: Модуль температура+датчик присутствия+реле

Сообщение Vladimir_st » Пн сен 24, 2018 2:56 pm

Проект простой :)

Сервер на Распбери 3 с Мажордомо + гейт Мега +W5100 (скетч для Гейта взял с mysensors без переделок)

Плюс будут несколько нод:

1. Скетч выложил выше -будет стоять в прихожей: датчик температуры DS18B20, датчик присутствия HC-SR501, сдвоенное реле.
Хотелось бы видеть температуру по запросу, по датчику определять что кто то пришел (зажигать автоматически свет в прихожей). Вторая реле должна включать уличный свет по заходу солнца.

2 Еще одна для котельной с датчиком DS18B20 + пара с водонепроницаемых датчиков DS18B20 .. с нее хотелось бы получать уведомления о снижении температуры.

3. ну и штуки 3 DHT22+HC-SR501+ Реле - раскидать по комнатам, чтобы видеть температуру и имитировать присутствие дома.

Реле не управляются со страницы сайта. В панели управления, отсылкой состояния через mysensors/сенсоры\установить - работает.
Пины в скетче указаны верно, температура, объемник работают.

Буду очень благодарен за помощь, а то вроде все работает, но как то глючно.. Ноды я понимаю лучше спящие, но для меня это непонятно на данном этапе.
Последний раз редактировалось Vladimir_st Пн сен 24, 2018 5:06 pm, всего редактировалось 4 раза.
Vladimir_st
Сообщения: 22
Зарегистрирован: Чт янв 11, 2018 6:32 am
Благодарил (а): 2 раза
Поблагодарили: 0

Re: Модуль температура+датчик присутствия+реле

Сообщение Vladimir_st » Пн сен 24, 2018 2:57 pm

Фото железа
IMG_0128.JPG
фото
IMG_0128.JPG (2.08 МБ) 7021 просмотр
Berkseo
Сообщения: 56
Зарегистрирован: Вт янв 24, 2017 12:30 am
Благодарил (а): 6 раз
Поблагодарили: 22 раза

Re: Модуль температура+датчик присутствия+реле

Сообщение Berkseo » Вт сен 25, 2018 12:34 pm

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

// Enable debug prints to serial monitor
#define MY_DEBUG

// Enable and select radio type attached
#define MY_RADIO_NRF24
//#define MY_RADIO_RFM69
#define MY_REPEATER_FEATURE
#include <SPI.h>
#include <MySensors.h>
#include <DallasTemperature.h>
#include <OneWire.h>



#define RELAY_PIN 4  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
#define NUMBER_OF_RELAYS 2 // Total number of attached relays
#define RELAY_ON 1  // GPIO value to write to turn on attached relay
#define RELAY_OFF 0 // GPIO value to write to turn off attached relay
#define COMPARE_TEMP 1 // Send temperature only if changed? 1 = Yes 0 = No


#define DIGITAL_INPUT_SENSOR 3   // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
#define CHILD_ID 3   // Id of the sensor child

#define ONE_WIRE_BUS 2 // Pin where dallase sensor is connected 
#define MAX_ATTACHED_DS18B20 1
OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
DallasTemperature sensors(&oneWire); // Pass the oneWire reference to Dallas Temperature.
float lastTemperature[MAX_ATTACHED_DS18B20];
int numSensors = 0;
bool receivedConfig = false;
bool metric = true;
// Initialize temperature message
MyMessage msgtemp(0, V_TEMP);
MyMessage msg(CHILD_ID, V_TRIPPED);

void before()
{
  for (int sensor = 1, pin = RELAY_PIN; sensor <= NUMBER_OF_RELAYS; sensor++, pin++) {
    // Then set relay pins in output mode
    pinMode(pin, OUTPUT);
    // Set relay to last known state (using eeprom storage)
    digitalWrite(pin, loadState(sensor) ? RELAY_ON : RELAY_OFF);
  }
  // Startup up the OneWire library
  sensors.begin();
}

void setup()
{
  pinMode(DIGITAL_INPUT_SENSOR, INPUT);      // sets the motion sensor digital pin as input

  // requestTemperatures() will not block current thread
  sensors.setWaitForConversion(false);
}

void presentation()

{

  sendSketchInfo("Nano, kor", "1.1");

  present(CHILD_ID, S_MOTION);
  for (int sensor = 1, pin = RELAY_PIN; sensor <= NUMBER_OF_RELAYS; sensor++, pin++) {

    // Register all sensors to gw (they will be created as child devices)
    present(sensor, S_BINARY);
  }



  // Fetch the number of attached temperature sensors
  numSensors = sensors.getDeviceCount();

  // Present all sensors to controller
  for (int i = 0; i < numSensors && i < MAX_ATTACHED_DS18B20; i++) {

    present(i, S_TEMP);
  }

}



void loop()
{
  bool tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH;

  Serial.println(tripped);
  send(msg.set(tripped ? "1" : "0")); // Send tripped value to gw

  // Fetch temperatures from Dallas sensors
  sensors.requestTemperatures();

  // query conversion time and sleep until conversion completed
  int16_t conversionTime = sensors.millisToWaitForConversion(sensors.getResolution());
  // sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater)
  wait(conversionTime);

  // Read temperatures and send them to controller
  for (int i = 0; i < numSensors && i < MAX_ATTACHED_DS18B20; i++) {

    // Fetch and round temperature to one decimal
    float temperature = static_cast<float>(static_cast<int>((getControllerConfig().isMetric ? sensors.getTempCByIndex(i) : sensors.getTempFByIndex(i)) * 10.)) / 10.;

    // Only send data if temperature has changed and no error
#if COMPARE_TEMP == 1
    if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) {
#else
    if (temperature != -127.00 && temperature != 85.00) {
#endif

      // Send in the new temperature
      send(msgtemp.setSensor(i).set(temperature, 1));
      // Save new temperatures for next compare
      lastTemperature[i] = temperature;
    }
    Serial.println(temperature);
  }
}
void receive(const MyMessage &message)
{
  // We only expect one type of message from controller. But we better check anyway.
  if (message.type == V_STATUS) {
    // Change relay state
    digitalWrite(message.sensor - 1 + RELAY_PIN, message.getBool() ? RELAY_ON : RELAY_OFF);
    // Store state in eeprom
    saveState(message.sensor, message.getBool());
    // Write some debug info
    Serial.print("Incoming change for sensor:");
    Serial.print(message.sensor);
    Serial.print(", New status: ");
    Serial.println(message.getBool());
  }
}
Это вариант без слипа, тк у вас включен режим репитера на этой ноде. Слип вобще нет смысла использовать если у вас нода не батарейная.
Я правда не совсем понял как у вас реле управлялось из модуля майсенсорс если она засыпала переодически(у вас же простой слип, не смартслип, тоесть контролер не оповещался когда нода просыпается), подозреваю что работало через раз, когда отправка совпадала с моментом когда нода не спит.
Что касается управления через кнопки с главной страницы сайта, попробуйте к обеим релюхам добавить (на странице сенсоры ) устройства через простые устройства, там поставьте галки отображать в меню и на сцене.
За это сообщение автора Berkseo поблагодарил:
Vladimir_st (Вт сен 25, 2018 1:21 pm)
Рейтинг: 1.16%
Vladimir_st
Сообщения: 22
Зарегистрирован: Чт янв 11, 2018 6:32 am
Благодарил (а): 2 раза
Поблагодарили: 0

Re: Модуль температура+датчик присутствия+реле

Сообщение Vladimir_st » Вт сен 25, 2018 5:05 pm

Спасибо большое, действительно реле работало нестабильно :D
Но сейчас почему то совсем отзывается перестали, с вашим скетчем тоже самое.

Не пойму в чем дело..Привязал к чистой версии Мажордомо. Только mysensors поставил.
Снимок экрана 2018-09-25 в 21.00.56.png
Снимок экрана 2018-09-25 в 21.00.56.png (520.65 КБ) 6964 просмотра
Vladimir_st
Сообщения: 22
Зарегистрирован: Чт янв 11, 2018 6:32 am
Благодарил (а): 2 раза
Поблагодарили: 0

Re: Модуль температура+датчик присутствия+реле

Сообщение Vladimir_st » Ср сен 26, 2018 8:42 am

Разобрался :evil: Оказывается после каждой операции привязки\отвязки необходимо перезагружать Распберри..

Теперь все работает :lol: Только осталась непонятность - создал два объекта: в Меню управления и на Сцене.
Если переключаешь первое должно изменятся и второе и наоборот?
У меня для этого необходимо перегружать страницу, по моему так не должно быть?
Berkseo
Сообщения: 56
Зарегистрирован: Вт янв 24, 2017 12:30 am
Благодарил (а): 6 раз
Поблагодарили: 22 раза

Re: Модуль температура+датчик присутствия+реле

Сообщение Berkseo » Ср сен 26, 2018 1:39 pm

Vladimir_st писал(а):
Ср сен 26, 2018 8:42 am
Разобрался :evil: Оказывается после каждой операции привязки\отвязки необходимо перезагружать Распберри..

Теперь все работает :lol: Только осталась непонятность - создал два объекта: в Меню управления и на Сцене.
Если переключаешь первое должно изменятся и второе и наоборот?
У меня для этого необходимо перегружать страницу, по моему так не должно быть?
недолжно, похоже апач собрали криво
Vladimir_st
Сообщения: 22
Зарегистрирован: Чт янв 11, 2018 6:32 am
Благодарил (а): 2 раза
Поблагодарили: 0

Re: Модуль температура+датчик присутствия+реле

Сообщение Vladimir_st » Ср сен 26, 2018 2:45 pm

Записывал образ Сергея, а как то починить можно ?
Berkseo
Сообщения: 56
Зарегистрирован: Вт янв 24, 2017 12:30 am
Благодарил (а): 6 раз
Поблагодарили: 22 раза

Re: Модуль температура+датчик присутствия+реле

Сообщение Berkseo » Ср сен 26, 2018 6:02 pm

Vladimir_st писал(а):
Ср сен 26, 2018 2:45 pm
Записывал образ Сергея, а как то починить можно ?
Если вы про страницу которая сверху на скрине то да ее надо перезагружать
Ответить