Найти тему
Два направления.

Умный дом Majordomo. Опыт применения Mysensors, MQTT и DS1820 (Узел датчик).

Начало

MQTT брокер

MQTT Gateway

Узел датчик

Рассмотрим схемы подключения.

Подключение NRF24L01+ к Arduino mini

-2

К 3 Pin arduino подключаем датчики DS18b20.

-3

Соберем схему для программирования Arduino Pro Mini. Извлекаем микроконтроллер из Arduino Uno.

-4

Теперь займемся скетчем. Скетч создавался в программе Flprog.

С помощью этой программы можно запрограммировать контроллер не зная текстовых языков программирования, а выглядит это как рисование электронной или электрической схемы. (8)

Для того чтоб скетч работал в сети, необходимо поменять адреса датчиков DS18b20 на Ваши. Две строки с адресом выделены жирным шрифтом. Адрес можно узнать с помощью программы Flprog (8) или Arduino.

Скетч

#define MY_RADIO_NRF24
#define MY_RF24_PA_LEVEL RF24_PA_MAX
#include <OneWire.h>
#include <MySensors.h>
#include <SPI.h>
byte _d18x2x2Addr[8]={0x28, 0xEE, 0x53, 0x84, 0x17, 0x16, 0x1, 0x0};
byte _d18x2x1Addr[8]={0x28, 0xFF, 0x9C, 0x94, 0x3C, 0x4, 0x0, 0x6F};
OneWire _ow3(3);
bool Send_187981492_1;
String Data_send_187981492_1;
bool Request_187981492_1;
String Incoming_data_187981492_1;
bool New_187981492_1;
MyMessage msg_187981492_1(1, V_TEXT);
bool Ack_187981492_1;
byte c_187981492_1;
byte count_187981492_1=0;
bool Send_187981492_2;
String Data_send_187981492_2;
bool Request_187981492_2;
String Incoming_data_187981492_2;
bool New_187981492_2;
MyMessage msg_187981492_2(2, V_TEXT);
bool Ack_187981492_2;
byte c_187981492_2;
byte count_187981492_2=0;
bool EN_79363943_1;
unsigned long _d18x2x1Tti = 0UL;
float _d18x2x1O = 0.00;
bool _trgrt3 = 0;
bool _trgrt3I = 0;
bool _gen3I = 0;
bool _gen3O = 0;
unsigned long _gen3P = 0UL;
bool _trgrt1 = 0;
bool _trgrt1I = 0;
unsigned long _d18x2x2Tti = 0UL;
float _d18x2x2O = 0.00;
void setup()
{
if (0) {
request(1, V_TEXT, 0);
wait ( 50, 1, V_TEXT );
}
if (0) {
request(2, V_TEXT, 0);
wait ( 50, 1, V_TEXT );
}
}
void loop()
{
EN_79363943_1 = !(_gen3O);
if( EN_79363943_1 ){
sleep( 60000 );}
if (1) { if (! _gen3I) { _gen3I = 1; _gen3O = 1; _gen3P = millis(); } } else { _gen3I = 0 ; _gen3O= 0;}
 if (_gen3I) { if ( _isTimer ( _gen3P , 1 )) { _gen3P = millis(); _gen3O = ! _gen3O;}}
if (_gen3O) { if (_trgrt3I) { _trgrt3 = 0;} else {_trgrt3 = 1; _trgrt3I = 1;} } else {_trgrt3 = 0; _trgrt3I = 0;};
 Send_187981492_1 = _trgrt3;
Data_send_187981492_1 = ( _floatToStringWitRaz((_d18x2x1O),2));
Request_187981492_1 = 0;
if (Request_187981492_1) {
request(1, V_TEXT, 0);
wait ( 50, 1, V_TEXT );
}
if ( Send_187981492_1 ) {
Ack_187981492_1 = 0;
send(msg_187981492_1.set( Data_send_187981492_1.c_str()), true );
wait ( 50, 1, V_TEXT );
wait ( 100, 1, V_TEXT );
 while (Ack_187981492_1 == 0) {
 c_187981492_1++;
send(msg_187981492_1.set( Data_send_187981492_1.c_str()), true );
wait ( 50, 1, V_TEXT);
wait ( 500, 1, V_TEXT);
 if (c_187981492_1 == 3 ){
  c_187981492_1 = 0;
  Ack_187981492_1 = 1;
}
}
}
if (New_187981492_1 == 1){
count_187981492_1++;}
if (count_187981492_1 == 2){
count_187981492_1 = 0;
New_187981492_1 = 0;}
if(_gen3O) {
if(_isTimer(_d18x2x1Tti, 1000)) {
_d18x2x1Tti = millis();
_d18x2x1O= _readDS18_ow3(_d18x2x1Addr, 0);}}
if (_gen3O) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;};
 Send_187981492_2 = _trgrt1;
Data_send_187981492_2 = ( _floatToStringWitRaz((_d18x2x2O),2));
Request_187981492_2 = 0;
if (Request_187981492_2) {
request(2, V_TEXT, 0);
wait ( 50, 1, V_TEXT );
}
if ( Send_187981492_2 ) {
Ack_187981492_2 = 0;
send(msg_187981492_2.set( Data_send_187981492_2.c_str()), true );
wait ( 50, 1, V_TEXT );
wait ( 100, 1, V_TEXT );
 while (Ack_187981492_2 == 0) {
 c_187981492_2++;
send(msg_187981492_2.set( Data_send_187981492_2.c_str()), true );
wait ( 50, 1, V_TEXT);
wait ( 500, 1, V_TEXT);
 if (c_187981492_2 == 3 ){
  c_187981492_2 = 0;
  Ack_187981492_2 = 1;
}
}
}
if (New_187981492_2 == 1){
count_187981492_2++;}
if (count_187981492_2 == 2){
count_187981492_2 = 0;
New_187981492_2 = 0;}
if(_gen3O) {
if(_isTimer(_d18x2x2Tti, 1000)) {
_d18x2x2Tti = millis();
_d18x2x2O= _readDS18_ow3(_d18x2x2Addr, 0);}}
}
String _floatToStringWitRaz(float value, int raz)
{
  return String(value,raz);
}
bool _isTimer(unsigned long startTime, unsigned long period )
  {
  unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
  }
float _convertDS18x2xData(byte type_s, byte data[12])
{
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s)
  {
  raw = raw << 3;
  if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; }
  }
else
  {
  byte cfg = (data[4] & 0x60);
  if (cfg == 0x00) raw = raw & ~7; else if (cfg == 0x20) raw = raw & ~3; else if (cfg == 0x40) raw = raw & ~1;
  }
return (float)raw / 16.0;
}
float _readDS18_ow3(byte addr[8], byte type_s)
{ byte data[12];
byte i;
_ow3.reset();
_ow3.select(addr);
_ow3.write(0xBE);
for ( i = 0; i < 9; i++) {
 data[i] = _ow3.read();}
_ow3.reset();
_ow3.select(addr);
_ow3.write(0x44, 1);
return _convertDS18x2xData(type_s, data);}void presentation()
{
sendSketchInfo("Test_Node", "1.0");
}
void receive_187981492_1(const MyMessage &message)
{
if ((message.sender == 0 )&&(message.sensor == 1 )&&(message.type == V_TEXT)) {
  Incoming_data_187981492_1 = message.getString();
  New_187981492_1 = 1;
}
if ((message.sender == 0 )&&(message.sensor == 1 )&&(message.isAck())){
  Ack_187981492_1 = 1;
}
}
void presentation_187981492_1()
{
wait (20);
present(1, S_INFO, "1820");
}
void receive_187981492_2(const MyMessage &message)
{
if ((message.sender == 0 )&&(message.sensor == 2 )&&(message.type == V_TEXT)) {
  Incoming_data_187981492_2 = message.getString();
  New_187981492_2 = 1;
}
if ((message.sender == 0 )&&(message.sensor == 2 )&&(message.isAck())){
  Ack_187981492_2 = 1;
}
}
void presentation_187981492_2()
{
wait (20);
present(2, S_INFO, "1820");
}

Теперь загружаем скетч в микроконтроллер. В программе Arduino создаем новый скетч. Копируем наш скетч в новое окно и меняем адреса датчиков на Ваши. Теперь выбираем плату

 Инструменты -> Плата -> Arduino Pro Mini

Выбираем порт

Инструменты -> Порт -> Порт Arduino Uno

Нажимаем кнопку загрузка

-5

После успешной загрузки узел датчик готов к работе.

.............................................................................................................

Далее приступим к настройки умного дома Majordomo ( Настройки языка Majordomo и MQTT)

Продолжение следует.

Если интересует как создавался скетч то после 10 лайков будет описание.