Сеть на Arduino

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

Аватара пользователя
Amarok
Сообщения: 1427
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

Сеть на Arduino

Сообщение Amarok » Вт сен 16, 2014 9:55 am

Продолжаю собирать свою умную квартиру. План arduino-сети таков:
NetMap.jpg
NetMap.jpg (52.69 КБ) 13495 просмотров
Главный модуль - связующее звено между Majordomo и модулями. Измеряет температуру в комнате (датчик BMP085). Передает полученную информацию с модулей в Majordomo/отправляет команды Majordomo модулям (RF433 приемник и NRF24L01).
Погодный модуль - измеряет температуру и влажность (датчик DHT22), определяет наличие дождя/снега (датчик дождя), скидывает замеры в главный модуль (RF433 передатчик).
Модуль матраса - включает/выключает компрессор противопролежнего матраса и запоминает состояние питания; измеряет температуру в комнате (датчик BMP085) и отправляет её в главный модуль (NRF24L01).
Модуль розеток - включает/выключает розетки вентилятора и инфракрасного обогревателя, запоминает состояние питания. Управляется главным модулем при помощи NRF24L01.
Модуль окна - Открывает/закрывает шторы. Открывает/закрывает окно. Управляется главным модулем при помощи NRF24L01.
Модуль двери - Отпирает дверной электрический замок; измеряет температуру (датчик BMP085). Управляется главным модулем при помощи NRF24L01.
Ранее с ардуинками дело не имел. Не могу понять как организовать прием\передачу по воздуху и как с Алиской связать. Подтолкните в нужном направлении, плз.
За это сообщение автора Amarok поблагодарил:
Bolik.Stav (Пн ноя 24, 2014 11:38 pm)
Рейтинг: 1.16%
Моя Алиска живёт на Proxmox в Debian 12
Аватара пользователя
Amarok
Сообщения: 1427
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение Amarok » Вт сен 16, 2014 11:51 am

Решил, что пока едут ардуинки, датчики и реле, пробовать писать код для модулей.
Вот заготовка для модуля матраса (принимаются любые замечания, дополнения, советы):

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

#include <EEPROM.h>
#include <BMP085.h>

int mstate;
int addr = 0; // адрес ячейки
int mon = 1; // матрас включен
int moff = 0; // матрас выключен
int mled = 13; // светодиод матраса
int tled = 14; // светодиод передачи
int relay = 7; // Определяем на каком пине находятся реле

void setup()
{
  pinMode(mled, OUTPUT);   
  pinMode(tled, OUTPUT);   
  pinMode(relay, OUTPUT);   
}

void loop()
{
 reststate();
 readbmp085();
}

// пошли подпрограммы
void reststate()
 {
  mstate = EEPROM.read(addr);
  if (mstate == 1)
  {
   matresson();
  }
  else if (mstate == 0)
  {
   matressoff();
  }
 }
 
void matresson()
 {
   digitalWrite(relay, HIGH);
   digitalWrite(mled, HIGH); 
 }
 
void matressoff()
 {
   digitalWrite(relay, LOW);
   digitalWrite(mled, LOW); 
 }

void readbmp085()
 {
 }
 
Вопрос: возможно ли вынести reststate(); в секцию setup?
Моя Алиска живёт на Proxmox в Debian 12
Аватара пользователя
shemnik69
Сообщения: 590
Зарегистрирован: Пн дек 24, 2012 3:01 pm
Откуда: Саратов Saratov
Благодарил (а): 67 раз
Поблагодарили: 63 раза

Re: Сеть на Arduino

Сообщение shemnik69 » Вт сен 23, 2014 11:30 am

Идея замечательная!
Вопрос?
А почему не использовать проводные каналы обмена информацией.
Например преобразователи RS485 и витую пару? Цена вопроса копейки тот же МАХ485 (30-60 р).
Потом, как Ваш главный модуль (Мега 256) это по сути Мастер сети (он содержит несколько USART портов RX/TX) и он все равно только и будет делать, что опрашивать и анализировать полученные от модулей данные.
Кроме того (это не антиреклама) радиоканал самый капризный.
Да на нем проще связать (библиотеки, наработки т.д) но если смотреть на стабильность и самое главное на устойчивость то я бы отдал предпочтение проводу (ведь питание для всех остальных модулей все равно будете подводить) :D
Еще добавлю вот что. По возможности (если будете строить систему на радиоканале) закладывайте в скетчи анализ подтверждения полученной/преданной информации и минимальный (по логике работы модуля) скажем так "интеллект" на реакцию от тех же датчиков. Например модуль двери
Я так понимаю здесь еще нужен блок (в программе) для домофонных ключей. Т.е например Ардуино (по сути это МК Атмега) получил команду на открытие двери. запомнил ее. открыл замок. замерил температуру. можно даже время срабатывания запомнить ( :D ) а затем по запросу от Мастера (Status) выдал все параметры. Самое главное что он по сути автономен на уровне железа но увязан в МД на уровне информ обмена.

У меня подобная (по смыслу) сеть работает но не на ардуино. (т.е платы), а на Атмегах в которых прошиты загрузчики Ардуино и по сути скетчи те же (просто сам МК)связь идет по каналам RS 485, где 1 витая пара из 4 в кабеле UTP это сигнальная цепь, а 3 остальных в параллель, это питание 24/12/5 в. причем в самих модулях стоят преобразователи 24/5 (где далеко ) или 12/5 в. Данная сеть работает на много стабильнее прежней 1-ware (оставлена только для температурных датчиков).
Аватара пользователя
Amarok
Сообщения: 1427
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Сеть на Arduino

Сообщение Amarok » Вт сен 23, 2014 3:57 pm

shemnik69 писал(а):А почему не использовать проводные каналы обмена информацией.
Сам я тоже за провода; но планировка квартиры и расположение блоков ратуют за воздух.
Жду вот сенсоры. Диодиками уже наморгался... :)
Моя Алиска живёт на Proxmox в Debian 12
aurodionov
Сообщения: 87
Зарегистрирован: Пн янв 27, 2014 2:50 pm
Откуда: Россия, Тюмень
Благодарил (а): 12 раз
Поблагодарили: 14 раз

Re: Сеть на Arduino

Сообщение aurodionov » Ср сен 24, 2014 9:18 am

shemnik69 писал(а):Идея замечательная!
Вопрос?
А почему не использовать проводные каналы обмена информацией.
Например преобразователи RS485 и витую пару? Цена вопроса копейки тот же МАХ485 (30-60 р).
Потом, как Ваш главный модуль (Мега 256) это по сути Мастер сети (он содержит несколько USART портов RX/TX) и он все равно только и будет делать, что опрашивать и анализировать полученные от модулей данные.
Кроме того (это не антиреклама) радиоканал самый капризный.
Да на нем проще связать (библиотеки, наработки т.д) но если смотреть на стабильность и самое главное на устойчивость то я бы отдал предпочтение проводу (ведь питание для всех остальных модулей все равно будете подводить) :D
Еще добавлю вот что. По возможности (если будете строить систему на радиоканале) закладывайте в скетчи анализ подтверждения полученной/преданной информации и минимальный (по логике работы модуля) скажем так "интеллект" на реакцию от тех же датчиков. Например модуль двери
Я так понимаю здесь еще нужен блок (в программе) для домофонных ключей. Т.е например Ардуино (по сути это МК Атмега) получил команду на открытие двери. запомнил ее. открыл замок. замерил температуру. можно даже время срабатывания запомнить ( :D ) а затем по запросу от Мастера (Status) выдал все параметры. Самое главное что он по сути автономен на уровне железа но увязан в МД на уровне информ обмена.

У меня подобная (по смыслу) сеть работает но не на ардуино. (т.е платы), а на Атмегах в которых прошиты загрузчики Ардуино и по сути скетчи те же (просто сам МК)связь идет по каналам RS 485, где 1 витая пара из 4 в кабеле UTP это сигнальная цепь, а 3 остальных в параллель, это питание 24/12/5 в. причем в самих модулях стоят преобразователи 24/5 (где далеко ) или 12/5 в. Данная сеть работает на много стабильнее прежней 1-ware (оставлена только для температурных датчиков).
У Вас ,протокол modbus.
Если да , можно подробней, что и как реализовано
Аватара пользователя
shemnik69
Сообщения: 590
Зарегистрирован: Пн дек 24, 2012 3:01 pm
Откуда: Саратов Saratov
Благодарил (а): 67 раз
Поблагодарили: 63 раза

Re: Сеть на Arduino

Сообщение shemnik69 » Вт сен 30, 2014 1:53 pm

Сама сеть как таковая, это условно. Есть несколько отдаленных от центрального блока (шкаф УД) модулей на Атмега 8 и 328. Они по сути, это полуавтономные (по логике работы) устройства. Основная идея, была в том, чтобы например модуль той же калитки, никак не зависел от сервера. Или блок управления ворот. А также блок (и) управления освещением двора. Условно ссылаюсь на Ардуино, но у меня не платы Ардуино, а самодельные платы (ЛУТ) где МК это Атмега в которой прошит загрузчик (bootloader) который позволяет легко как прошивать сам МК используя плату Ардуино как програматор так и по сути делать это удаленно.
Т.е например Атмега имеет канал USART/RS485 или RS422 (другой драйвер) но не в стандартной схеме включения, а с дополнием т.е элементы (транзистор и несколько деталей) которые позволяют автоматически переводить драйвер MAX485/487 и др. в режим предачи. Тем саммым, если к каналу присоеденить преобразователь usb/RS485 (свисток) то пользуясь программой (например IDE arduino-1.0.5) используя канал предачи програмируем (изменяем тот же скетч).
Теперь про управление.
В основном все (большинство) позиционируются в сторону modbus.
Это понятно протокол обкатан и решены вопросы коллизий при "многомастерном" опросе. Но это хорошо когда знаешь как програмировать.... а если.
Тогда варинаты идти и спотыкаться или делать альтернативное по смыслу и логике но на друом (или том-же) железе.
Кроме того не так много задач в данных сетях где именно многомастерный режим нужен. И по сути то многомастерный режим нужен только в тех условиях, где например есть устройство которое так много получает информации и так много ее раздает по запросам, то есть смысл такое устройство превести на TCP/IP протокол и все вопросы отпадают. Но большинству такой режим не нужен.
Например возьмем 2 датчика движения, 3 прожектора. 1 (3) датчика температуры) ну и скажем 3 канала управления реле.
Привяжем это на любой МК имеющий USART (Атмега. PIC). Все это и будет отдельный модуль.
Что от данного модуля нужно системе МД.? Не так много. Только данные о текущем состоянии например датчиков движения. НО постоянный заброс данных от модуля не дает пользы только вредит поэтому пусть будет по запросу т.е мастер 1 МД. А вот уже например включение прожектора от сигнала ДД пусть будет решать МК. Также, пусть раз в 10 сек. МД посылает запрос на который получит ответ в виде значения температуры. Ну что? где тут многомастерный режим? Кому нужны данные если например ДД "встал". Да МК так и будет их получать и обрабатывать и будет включать например прожектор, или включать (нагреватель) как термостат в том же погребе. Но сама информационная часть будет исходить по запросу.

Я не настаиваю на таком варианте, более того, это не догма, поскольку система будет распределенная и во много раз более удобная и надежная (например датчики протечки. пожарный. перегрева. нестандартного режима (напримр вибрации!!!) и т.п а также разумеется калитка и ворота.

Во вложении один из вариантов преобразователя lдля драйвера RS485
Вложения
ttl-rs485.zip
(16.47 КБ) 253 скачивания
За это сообщение автора shemnik69 поблагодарил:
cabat (Вт сен 30, 2014 1:57 pm)
Рейтинг: 1.16%
Аватара пользователя
Amarok
Сообщения: 1427
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

Avalon Weather Station

Сообщение Amarok » Вт ноя 18, 2014 7:59 am

И так, продолжаю постройку своего полу-умного дома :) Метеостанция выполнена на Arduino Pro Mini (ATmega328 5V 16M).
Код (черновой):
СпойлерПоказать

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

// Arduino Pro Mini (ATmega328 5V 16M)
// красный - питание | синий - земля
// желтый - дата | зеленый - дата цифровая
// 433Mhz передатчик (pin12)
// датчик дождя FC-37 (pinA0,pin3)
// датчик температуры и влажности DHT22 (pin2)

#include "DHT.h"

#define DHTPIN 2     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)

float hum;
float temp;
int weather;

DHT dht(DHTPIN, DHTTYPE);

void setup() 
{
  Serial.begin(9600); 
  Serial.println("Avalon Weather Station started");
  dht.begin();
}

void loop() 
{
requestdht();
float hum = dht.readHumidity();
float temp = dht.readTemperature();

Serial.print("DHT Humidity: ");
Serial.print(hum);
Serial.println("%\t");

Serial.print("DHT Temperature: ");
Serial.print(temp);
Serial.println("*C");

int sensorValue = analogRead(A0); // считываем показания датчика дождя
Serial.print("Rain: ");
Serial.println(sensorValue);

delay(5000);
}

void requestdht()
{
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(t) || isnan(h)) {
    Serial.println("Failed to read from DHT");
  } else {
    float hum = h;
  }
}
Теперь все эти значения надо передать по радио-каналу на Mega2560.
И тут я завис... Решил использовать VirtualWire и EasyTransferVirtualWire. Но не понимаю КАК в структуру

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

struct SEND_DATA_STRUCTURE{
  //наша структура данны. она должна быть определена одинаково на приёмнике и передатчике
  //кроме того, размер структуры не должен превышать 26 байт (ограничение VirtualWire)
  unsigned int device_id;
  unsigned int destination_id;    
  unsigned int packet_id;
  byte command;
  int data;
};
 
Передавать значения датчиков? Подскажите, плз :cry:
Моя Алиска живёт на Proxmox в Debian 12
Аватара пользователя
Amarok
Сообщения: 1427
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

Avalon Weather Station v2.1

Сообщение Amarok » Вт ноя 18, 2014 10:30 am

Решилось! :D :D :D
СпойлерПоказать

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

// Avalon Weather Station v2
// Arduino Pro Mini (ATmega328 5V 16M)
// красный - питание | синий - земля
// желтый - дата | зеленый - дата цифровая
// 433Mhz передатчик (pin12)
// датчик дождя FC-37 (pinA0,pin3)
// датчик температуры и влажности DHT22 (pin2)

#include <VirtualWire.h>
#include <EasyTransferVirtualWire.h>
#include "DHT.h"

#define DHTPIN 2     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)

int led_pin = 13;
int device_id = 1;
int rainValue;
float hum;
float temp;

DHT dht(DHTPIN, DHTTYPE);

//create object
EasyTransferVirtualWire ET; 

//наша структура данных. она должна быть определена одинаково на приёмнике и передатчике кроме того, размер структуры не должен превышать 26 байт (ограничение VirtualWire)
struct SEND_DATA_STRUCTURE{
  byte ID;
  int temperature;    
  int humidity;
  int rain;
};

//переменная с данными нашей структуры
SEND_DATA_STRUCTURE mydata;

void setup() 
{
  // блок инициализации
  pinMode(led_pin, OUTPUT);
  ET.begin(details(mydata));
  mydata.ID = device_id;
  vw_set_tx_pin(12); //установка пина, к которому подключен data-вход передатчика
  vw_setup(2000);        //скорость передачи
  
  Serial.begin(9600); 
  Serial.println("");
  Serial.println("Avalon Weather Station v2.1 started");
  Serial.print("Device ID: ");
  Serial.println(device_id);

  randomSeed(analogRead(0));

  dht.begin();
  Serial.println("Welcome!");
  delay(1000);
}

void loop() 
{
sensorRain();
requestdht();
transmitter();
delay(10000);
}

// подпрограмма передатчика
void transmitter()
{
  digitalWrite(led_pin, HIGH); // включаем светодиод для отображения процесса передачи
  mydata.temperature = dht.readTemperature();
  mydata.humidity = dht.readHumidity();
  mydata.rain = analogRead(A0);
  Serial.print("Transmitting: ");   
  Serial.print(mydata.temperature); 
  Serial.print(" *C | ");   
  Serial.print(mydata.humidity);   
  Serial.print("% Humidity | "); 
  Serial.print(mydata.rain);
  Serial.println(" Rain"); 
  ET.sendData(); // отправка данных
  digitalWrite(led_pin, LOW); //выключаем светодиод
  Serial.println("DONE");
}

// подпрограмма дождевого датчика
void sensorRain()
{
int rainValue = analogRead(A0); // считываем показания датчика дождя
}

void requestdht()
{
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(t) || isnan(h)) {
    Serial.println("Failed to read from DHT");
  } else {
    float hum = h;
  }

} 
И ловим на Меге:
СпойлерПоказать

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

//Adruino Mega2560
//красный - питание | синий - земля
//желтый - дата | зеленый - дата цифровая
//Ethernet Shield W5100 (pin:4,10,11,12,13,50,51,52)
//433Mhz приемник (pin7)
//радио модуль NRF24L01+
//датчик температуры и давления BMP085 (pinSDA(20), pinSCL(21))
//
//Описание блока:
//* считывает информацию с WeatherStation (при помощи 433Mhz приемника)
//* измеряет температуру и давление в помещении (датчик BMP085)
//* общение (прием и передача данных) при помощи модуля NRF24L01+ с Relay модулями (состояния модулей должны запоминаться)
/////////////////////////////////////

#include <VirtualWire.h>
#include <EasyTransferVirtualWire.h>

//create object
EasyTransferVirtualWire ET; 

//наша структура данных. она должна быть определена одинаково на приёмнике и передатчике кроме того, размер структуры не должен превышать 26 байт (ограничение VirtualWire)
struct SEND_DATA_STRUCTURE{
  byte ID;
  int temperature;    
  int humidity;
  int rain;
};

//переменная с данными нашей структуры
SEND_DATA_STRUCTURE mydata;

void setup(){
  ET.begin(details(mydata));
  Serial.begin(9600);
  vw_set_ptt_inverted(true); // Required for DR3100
  vw_setup(2000);  // Bits per sec
  vw_set_tx_pin(11);
  vw_rx_start();       // Start the receiver PLL running

  Serial.println("Avalon Project Server Started");
  Serial.println("Welcome!");
  
  pinMode(13, OUTPUT);  
}

void loop(){
  //check and see if a data packet has come in. 
  if(ET.receiveData()){
     Serial.println("");
     Serial.print("ID: ");
     Serial.print(mydata.ID);
     Serial.print(" | Temperature: ");
     Serial.print(mydata.temperature);
     Serial.print("*C | Humidity: ");
     Serial.print(mydata.humidity);
     Serial.print("% | Rain: ");
     Serial.print(mydata.rain);
     Serial.println("");
    }
    
  } 
 
Приключения продолжаются. Меня ждут новые и увлекательные затыки :D
Моя Алиска живёт на Proxmox в Debian 12
Аватара пользователя
shemnik69
Сообщения: 590
Зарегистрирован: Пн дек 24, 2012 3:01 pm
Откуда: Саратов Saratov
Благодарил (а): 67 раз
Поблагодарили: 63 раза

Re: Сеть на Arduino

Сообщение shemnik69 » Вт ноя 18, 2014 11:16 am

Присоединяюсь к Вашему проекту... (только у меня немного железо свое) и смущает вот один момент..
.. если у ВАС, будет использована программа взаимодействия с COM портами (GW), то по опыту ее эксплуатации, ей не стоит много давать "лишних данных".
Суть в том что если постоянно ей слать данные то она очень увеличивает Log/// (за сутки доходило до 200 Мб!!!) /Может это и хорошо для отлавливания ошибок (как в 200 МБ их искать?) но с точки зрения V дата/ V HDD это не совсем рационально. Поэтому строчки вывода данных не отражающих именно изменения статуса наверное следует именно в работающей версии убрать. Это как рекомендация. :D
Аватара пользователя
Amarok
Сообщения: 1427
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Сеть на Arduino

Сообщение Amarok » Вт ноя 18, 2014 12:23 pm

shemnik69 писал(а):если у ВАС, будет использована программа взаимодействия с COM портами (GW), то по опыту ее эксплуатации, ей не стоит много давать "лишних данных".
Суть в том что если постоянно ей слать данные то она очень увеличивает Log/// (за сутки доходило до 200 Мб!!!) /Может это и хорошо для отлавливания ошибок (как в 200 МБ их искать?) но с точки зрения V дата/ V HDD это не совсем рационально. Поэтому строчки вывода данных не отражающих именно изменения статуса наверное следует именно в работающей версии убрать. Это как рекомендация. :D
Учту. Спасибо. :) Но планирую подключить к Mega2560 шилд W5100
Моя Алиска живёт на Proxmox в Debian 12
Ответить