mqtt нужна помощь

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

artemon25
Сообщения: 112
Зарегистрирован: Чт авг 25, 2016 10:33 pm
Благодарил (а): 15 раз
Поблагодарили: 6 раз

mqtt нужна помощь

Сообщение artemon25 » Ср ноя 30, 2016 11:36 pm

добрый вечер всем нашёл этот скетч и обрадовался потому что это то что я и хотел но не тут было ни как не могу скомпилировать этот скетч , постоянно какие то ошибки сначала с библиотеками были вроде решил потом со строками

EthernetClient ethClient; //ЗДЕСЬ КОМЕНТИРУЮ И КОПИРУЮ В ДРУГОЕ МЕСТО НИЖЕ

PubSubClient client(server, 1883, callback, ethClient);

перенёс их ниже как подсказали эта ошибка исчезла и вот теперь уже несколько дней мучаюсь с ошибкой 58 строка

DHT DHT; ошибка no matching function for call to 'DHT::DHT()'

я думаю что проблема с библиотекой но я несколько установил проблема не исчезла . IDE 16.6

но пробовал и другие если кому не сложно выложите библиотеку DHT с которой этот скетч компилируется ну и заодно свой скетч и версию IDE. сейчас у меня ват такой скетч
СпойлерПоказать
#include <SPI.h> // Ethernet shield
#include <Ethernet.h> // Ethernet shield
#include <PubSubClient.h> // MQTT
#include <Servo.h>
#include <DHT.h>
#include <OneWire.h>
#include <DallasTemperature.h>
Servo servo;

byte mac[] = { 0xC1, 0x7C, 0x38, 0x41, 0x89, 0x12 };
byte server[] = { 192, 168, 1, 190 }; //IP Брокера
byte ip[] = { 192, 168, 1, 167 }; //IP Клиента (Arduino)


//EthernetClient ethClient; //ЗДЕСЬ КОМЕНТИРУЮ И КОПИРУЮ В ДРУГОЕ МЕСТО НИЖЕ
//PubSubClient client(server, 1883, callback, ethClient);
#define id_connect "myhome-kitchen"
#define Prefix_subscribe "myhome/Kitchen/"

///////////////Объявляем порты ввода-вывода
#define ServoPin 3 //Порт к которому подключен сервопривод

const int start_DI_pin [] = {2, 4, 5}; // Порты Ввода
int n_DI_pin = sizeof(start_DI_pin) / sizeof(start_DI_pin[0]) - 1; //Вычисляем длинну массива

const int start_DO_pin [] = {6, 7}; //Порты Вывода
int n_DO_pin = sizeof(start_DO_pin) / sizeof(start_DO_pin[0]) - 1; //Вычисляем длинну массива

int DI[] = {0, 0, 0};
int old_DI[] = {0, 0};

///////////////////////////Переменные для работы с освещением//////////////////////////////////////
int ServoAngle = 100; //Угол сервопривода при включении
int flag = 0;
int flag2 = 0;
int pause = 0;

//------------------------------------------- Sensors -------------------------------------------//
const int MQ7_Pin = A0; // Куда подключили MQ7
//int MQ7Value = 0;
int MQ7Value = analogRead(MQ7_Pin);


const int foto_Pin = A1; // устанавливаем входную ногу для Фоторезистора
//unsigned int fotoValue = 0; // цифровое значение фоторезистора
unsigned int fotoValue = analogRead(foto_Pin);

#define ONE_WIRE_BUS 8
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS_sensors(&oneWire);
// 28 FF F2 5C 53 15 2 97
DeviceAddress addr_T1 = { 0x28, 0xFF, 0xF2, 0x5C, 0x53, 0x15, 0x02, 0x97 };

float T1 = 0;

DHT DHT;
#define DHT22_PIN 9
float Hout = 0;
float Tout = 0;
//#define DHTPIN 2 // Номер пина, к которому подсоединен датчик
//#define DHTTYPE DHT22 // Задаём тип DHT датчика
//DHT dht(DHTPIN, DHTTYPE);


////////////////////////////////////////////////////////////////////////////
void callback(char* topic, byte* payload, unsigned int length) {
payload[length] = '\0';
// Serial.print(topic);
// Serial.print("=");
String strTopic = String(topic);
String strPayload = String((char*)payload);
// Serial.println(strPayload);
callback_iobroker(strTopic, strPayload);
}

EthernetClient ethClient; //ЗДЕСЬ КОМЕНТИРУЮ И КОПИРУЮ В ДРУГОЕ МЕСТО НИЖЕ
PubSubClient client(server, 1883, callback, ethClient);
////////////////////////////////////////////////////////////////////////////
void setup() {
//Serial.begin(57600);
// Serial.println("start");
//Объявляем порты Digital inputs/outputs
for (int i = 0 ; i <= n_DI_pin; i++) {
pinMode (start_DI_pin , INPUT);
}
digitalWrite(5, HIGH); //Окно
digitalWrite(4, HIGH); //Объемник
for (int i = 0 ; i <= n_DO_pin; i++) {
pinMode (start_DO_pin , OUTPUT);
}

Ethernet.begin(mac, ip);
if (client.connect(id_connect)) {
getSensors();
control();
// client.publish("myhome/Kitchen/Change_Counter", "0");
// client.publish("myhome/Kitchen/Temp_room", "0");
// client.publish("myhome/Kitchen/Humidity_room", "0");
// client.publish("myhome/Kitchen/Temp_radiator", "0");
// client.publish("myhome/Kitchen/Temp_in", "0");
// client.publish("myhome/Kitchen/Lux", "0");
// client.publish("myhome/Kitchen/Servo", "0");
// client.publish("myhome/Kitchen/MQ7", "0");

client.subscribe("myhome/Kitchen/#");
}
}
/////////////////////////////////////////////////////////////////////////
void loop() {
client.loop();
control();
getSensors();
if (!client.connected()) {
if (client.connect(id_connect)) {
control();
getSensors();
client.subscribe("myhome/Kitchen/#");
}
}
}


и отдельно Functionsm
СпойлерПоказать
/////////////////////////////////От Брокера//////////////////////////////////////////////
void callback_iobroker(String strTopic, String strPayload){
if (strTopic == "myhome/Kitchen/Servo"){
ServoAngle=strPayload.toInt();
if (ServoAngle >= 0 && ServoAngle <= 255){
servo.attach(ServoPin);
//delay(200); //ждем 2 секунды
servo.write(ServoAngle); //ставим вал под 0
delay(1000); //ждем 2 секунды
//client.publish("myhome/Kitchen/Servo", b);
servo.detach();
}
}
}

////////////////////////////////////Брокеру/////////////////////////////////////
void control(){

if(digitalRead(5)==HIGH && flag==0) { //если окно открыто
client.publish("myhome/Kitchen/Window", "1");
flag=1;
}
if(digitalRead(5)==LOW && flag==1){//если окно закрыто
client.publish("myhome/Kitchen/Window", "0");
flag=0;//обнуляем переменную flag
}

if(digitalRead(4)==HIGH && flag2==0) { // Если есть движение
client.publish("myhome/Kitchen/Motion", "1");
flag2=1;
}
if(digitalRead(4)==LOW && flag2==1){// Если нет движения
client.publish("myhome/Kitchen/Motion", "0");
flag2=0;//обнуляем переменную flag
}
}
///////////////////////////////Данные сенсоров////////////////////////////////////

void getSensors () {

MQ7Value = analogRead(MQ7_Pin);
fotoValue = analogRead(foto_Pin); // считываем значение с фоторезистора
// ServoAngle = analogRead(2);

//Обработка данных датчика DHT22. Подключение к порту цифровому P9 Arduino
//Глобальные переменные Hout и Tout типа флоат - влажность (%) и температура (град. С)
if (DHT.read22(DHT22_PIN)== DHTLIB_OK) {
Hout = DHT.humidity;
Tout = DHT.temperature;
}
if (Hout == 0 || Tout == 0){
delay (1000);
if (DHT.read22(DHT22_PIN)== DHTLIB_OK) {
Hout = DHT.humidity;
Tout = DHT.temperature;
}
}
//Обработка данных цифровых датчиков температуры типа DS18B20.
//Шина 1-Wire на цифровой пин P8 Arduino.
//Подключено 2 датчика температуры, адреса задаются в секции глобальных констант "Sensors"
//Три значение температуры T1, T2, типа float (град. С).
DS_sensors.requestTemperatures();
T1 = DS_sensors.getTempC(addr_T1);

///////////////////////Паблик данных сенсоров////////////////////////
if (pause == 50 || pause == 0){

char b[5];
String char_Hout = String(Hout);
char_Hout.toCharArray(b,5);
client.publish("myhome/Kitchen/Humidity_room", b);

String char_Tout = String(Tout);
char_Tout.toCharArray(b,5);
client.publish("myhome/Kitchen/Temp_room", b);

String char_T1 = String(T1);
char_T1.toCharArray(b,5);
client.publish("myhome/Kitchen/Temp_radiator", b);

String char_fotoValue = String(fotoValue);
char_fotoValue.toCharArray(b,4);
client.publish("myhome/Kitchen/Lux", b);

String char_ServoAngle = String(ServoAngle);
char_ServoAngle.toCharArray(b,4);
client.publish("myhome/Kitchen/Servo", b);

String char_MQ7Value = String(MQ7Value);
char_MQ7Value.toCharArray(b,4);
client.publish("myhome/Kitchen/MQ7", b);

pause = 1;
}
else pause++;
}


а вот скетч целиком http://forum.iobroker.net/download/file.php?id=2951

Можете подсказать отчего у меня всё так получается.

Заранее всем спасибо за ответы жду ответов
Аватара пользователя
foxvlad
Сообщения: 287
Зарегистрирован: Пн сен 22, 2014 3:18 pm
Откуда: Сочи
Благодарил (а): 78 раз
Поблагодарили: 78 раз
Контактная информация:

Re: mqtt нужна помощь

Сообщение foxvlad » Чт дек 01, 2016 8:44 am

Одно скажу, когда делал шлюз тоже пытался найти в интернете готовый рабочий пример MQTT, и все не компилировались, пока сам не сделал из примеров которые идут с библиотекой.

И тоже самое для всех своих остальных поделок. Нужно самим писать.
Аватара пользователя
ZhenyaRUS39
Сообщения: 46
Зарегистрирован: Ср ноя 16, 2016 12:41 pm
Благодарил (а): 31 раз
Поблагодарили: 5 раз

Re: mqtt нужна помощь

Сообщение ZhenyaRUS39 » Чт дек 01, 2016 9:26 am

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

И тоже самое для всех своих остальных поделок. Нужно самим писать.
присоединяюсь к этим словам, несколько дней назад тоже делал обмен данными по MQTT между Arduino и MD. Библиотеки в Arduino постоянно обновляются и мешают друг другу.
Пришлось самому голову ломать:
отправляю с ардуино так:
СпойлерПоказать

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

// плата ESP8266 "Witty Cloud" 

#include <ESP8266WiFi.h>                // соединяем на плате gpio16 и reset для возмоности глубокого сна(DeepSleep)
#include <EEPROM.h>
#include <PubSubClient.h>

#define SignalOut 4                     // порт выходного сигнала
#define SignalInput 5                   // порт входного сигнала
const char *ssid = "Evgenii";           // имя домашней wi-fi сети
const char *password = "66666666";      // пароль домашней wi-fi сети
const char *mqtt_server = "192.168.1.84"; // адресс брокера
byte Number;                            // номер цикла
byte NumberMax;                         // максимальный номер цикла
byte NumberMaxOld;                      // промежуточное, для проверки изменения состояния, максимальный номер цикла
long TimeSleepMicro;                    // протяженность сна в микросекундах  (1 000 000) = 1 секунда, (небходимо для работы таймера)
int TimeSleep;                          // протяженность сна в секундах (необходимо для передачи данных между устройствами)
int TimeSleepOld;                       // промежуточное, для проверки изменения состояния
int status = WL_IDLE_STATUS;
IPAddress ip(192, 168, 1, 250);         // статический IP
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0); 

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;

void setup() 
{
  pinMode(13, OUTPUT);                  // светодиод (15 -красный, 12-зеленый, 13-синий)
  pinMode(15, OUTPUT);                  // светодиод 
  TimeSleepMicro =  TimeSleep * 1000000;   //  перевод в микросекунды из секунд    
}

void loop() 
{ 
  
  digitalWrite(13, LOW);               //  выключить светодиод
  
  
  EEPROM.begin(256);
  Number = EEPROM.read(1);             //  читаем номер цикла из энергонезависимой памяти
  NumberMax = EEPROM.read(2);          //  максимальное количестов циклов (после сбрасывается до первого)
  NumberMaxOld = NumberMax;            //  промежуточное, для проверки изменения 
    if (NumberMax == 0)                //  для первого старта с длительностью сна в 1 секунду
       { 
        NumberMax = 10; 
       }
       
  TimeSleep = EEPROM.read(3);          //  читаем протяженность сна из энергонезависимой памяти
  TimeSleepOld = TimeSleep;            // промежуточное, для проверки изменения 
    if (TimeSleep == 0)                //  для первого старта с длительностью сна в 1 секунду
       { 
        TimeSleep = 1; 
       }
       
  NumberMax = 6;                       //  максимальное количестов циклов (после сбрасывается до первого)
   
  Serial.begin(115200);
  delay(10);
  Serial.print("Number = ");
  Serial.print(Number);
  Serial.print("/");
  Serial.println(NumberMax);  
  //Serial.end(); 
  
  digitalWrite(SignalOut, HIGH);       //  отправляем сигнал
  digitalRead(SignalInput);            //  принимаем сигнал     
  
  if (SignalInput == HIGH || Number == 6)  //  если есть сигнал на контактах или если подошла очередь по циклам
   { 
      
      delay(10);
       // We start by connecting to a WiFi network
      Serial.println();
      Serial.println();
      Serial.print("Connecting to ");
      Serial.println(ssid);
      WiFi.config(ip, gateway, subnet);
      WiFi.begin(ssid, password);
  
      while (WiFi.status() != WL_CONNECTED) 
        {
         delay(500);
         Serial.print(".");
        }

      Serial.println("");
      Serial.println("WiFi connected");  
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());
      
      client.setServer(mqtt_server, 1883);
      while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP8266Client-";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    if (client.connect(clientId.c_str())) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      
      client.publish("/outTopic", "/hello world");
      
      // ... and resubscribe
      client.subscribe("inTopic");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 2 seconds before retrying
      delay(2000);
    }
  }
      
      digitalWrite(13, HIGH);               // включить светодиод, если подключились
      delay(3000);                        
      WiFi.disconnect();
    }

  Number = Number + 1;                      // увеличиваем цикл на 1 

  if (Number > NumberMax)                   // если номер цикла стал выше чем максимальный, то сбрасываем цикл до первого 
       { 
          Number = 1;
       }
    
       EEPROM.write(1, Number);            // записываем номер цикла в энергонезависимую память
        //EEPROM.commit();
        //EEPROM.end();
  

  if (NumberMax != NumberMaxOld)            // если значение максимального номера цикла сменилось, то записываем новое значение в память
       { 
        EEPROM.write(2, NumberMax);
        //EEPROM.commit();
        //EEPROM.end(); 
       }             
  if (TimeSleep != TimeSleepOld)            // если значение таймера сна сменились с начала цикла, то записываем новое значение в память
       { 
        EEPROM.write(3, TimeSleep);
        //EEPROM.commit();
        //EEPROM.end(); 
       }
       
       EEPROM.commit();            
       EEPROM.end();
  
digitalWrite(15, HIGH); 
delay(2000);
      
 //delay(1000);                               // wait for a second
 //ESP.deepSleep(TimeSleepMicro);           // таймер сна (в микросекундах)  (1 000 000) = 1 секунда,
}
Код для MQTT (отдельно кусок)
СпойлерПоказать

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

client.setServer(mqtt_server, 1883);
      while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP8266Client-";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    if (client.connect(clientId.c_str())) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      
      client.publish("/outTopic", "/hello world");
      
      // ... and resubscribe
      client.subscribe("inTopic");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds"); 
gorobey
Сообщения: 50
Зарегистрирован: Чт окт 27, 2016 11:48 am
Благодарил (а): 13 раз
Поблагодарили: 3 раза

Re: mqtt нужна помощь

Сообщение gorobey » Чт дек 01, 2016 8:04 pm

Всем привет. Что б не создавать новую тему присоединяюсь со своей проблемой :)

При добавлении нового элемента в модуле MQTT получаю ошибку

http://192.168.99.хх/admin.php?pd=cGFuZWw6e2FjdGlvbj1tcXR0fQ%3D%3Dpz_&md=mqtt&inst=adm&
Error:
1364: Field 'VALUE' doesn't have a default value
INSERT INTO `pvalues`(`PROPERTY_ID`, `OBJECT_ID`, `PROPERTY_NAME`) VALUES('51', '76', 'MotionMQTT.status')

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

П.С. Такую же похожую ошибку получал и при добавлении элемента в модуле ModBus.

Спасибо !
artemon25
Сообщения: 112
Зарегистрирован: Чт авг 25, 2016 10:33 pm
Благодарил (а): 15 раз
Поблагодарили: 6 раз

Re: mqtt нужна помощь

Сообщение artemon25 » Вт дек 06, 2016 8:32 pm

проблему решил помогли конечно добрые люди . в скетче прописаны DHT ,DS18B20, MQ9, фоторезистор, управление сервоприводом и 2 управлямых пина. скетч состоит из двух частей основной и функционал
основной
СпойлерПоказать
#include <SPI.h> // Ethernet shield
#include <Ethernet.h> // Ethernet shield
#include <PubSubClient.h> // MQTT
#include <Servo.h>
#include <dht.h>
#include <OneWire.h>
#include <DallasTemperature.h>
Servo servo;

// Задаём mac и ip адреса в Локальной сети
byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
IPAddress ip{192, 168, 1, 74}; //ip Адрес Ethernet Shild'a Arduino
IPAddress server{192, 168, 1, 3}; //ip Адрес для MQTT Брокера

// Шапка Функции Callback (обратный вызов)
void callback(char* topic, byte* payload, unsigned int length);


EthernetClient ethClient;
PubSubClient client(server, 1883, callback, ethClient);

// Функция Callback
void callback(char* topic, byte* payload, unsigned int length)
{
// Выделяем необходимое кол-во памяти для копии payload
byte* p = (byte*)malloc(length);
// Копирование payload в новый буфер
memcpy(p, payload, length);
client.publish("home/data/status/sensor", p, length);
// Освобождаем память
free(p);
}

#define id_connect "myhome-kitchen"
#define Prefix_subscribe "myhome/Kitchen/"

///////////////Объявляем порты ввода-вывода
#define ServoPin 3 //Порт к которому подключен сервопривод

const int start_DI_pin []= {2, 4, 5}; // Порты Ввода
int n_DI_pin = sizeof(start_DI_pin) / sizeof(start_DI_pin[0])-1; //Вычисляем длинну массива

const int start_DO_pin []= {6, 7}; //Порты Вывода
int n_DO_pin = sizeof(start_DO_pin) / sizeof(start_DO_pin[0])-1; //Вычисляем длинну массива

int DI[] = {0, 0, 0};
int old_DI[] = {0, 0};

///////////////////////////Переменные для работы с освещением//////////////////////////////////////
int ServoAngle = 100; //Угол сервопривода при включении
int flag = 0;
int flag2 = 0;
int pause = 0;

//------------------------------------------- Sensors -------------------------------------------//
const int MQ7_Pin = A0; // Куда подключили MQ7
//int MQ7Value = 0;
int MQ7Value = analogRead(MQ7_Pin);


const int foto_Pin = A1; // устанавливаем входную ногу для Фоторезистора
//unsigned int fotoValue = 0; // цифровое значение фоторезистора
unsigned int fotoValue = analogRead(foto_Pin);

#define ONE_WIRE_BUS 8
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS_sensors(&oneWire);
// 28 FF F2 5C 53 15 2 97
DeviceAddress addr_T1 = { 0x28, 0xFF, 0xC8, 0x30, 0xA1, 0x15, 0x03, 0xB0 };

float T1 = 0;

dht DHT;
#define DHT22_PIN 2
float Hout = 0;
float Tout = 0;


////////////////////////////////////////////////////////////////////////////
void setup() {
//Serial.begin(57600);
// Serial.println("start");
//Объявляем порты Digital inputs/outputs
for(int i=0 ;i<=n_DI_pin; i++) { pinMode (start_DI_pin , INPUT); }
digitalWrite(5, HIGH); //Окно
digitalWrite(4, HIGH); //Объемник
for(int i=0 ;i<=n_DO_pin; i++) { pinMode (start_DO_pin , OUTPUT); }

Ethernet.begin(mac, ip);
if (client.connect(id_connect)) {
getSensors();
control();
// client.publish("myhome/Kitchen/Change_Counter", "0");
// client.publish("myhome/Kitchen/Temp_room", "0");
// client.publish("myhome/Kitchen/Humidity_room", "0");
// client.publish("myhome/Kitchen/Temp_radiator", "0");
// client.publish("myhome/Kitchen/Temp_in", "0");
// client.publish("myhome/Kitchen/Lux", "0");
// client.publish("myhome/Kitchen/Servo", "0");
// client.publish("myhome/Kitchen/MQ7", "0");

client.subscribe("myhome/Kitchen/#");
}
}
/////////////////////////////////////////////////////////////////////////
void loop() {
client.loop();
control();
getSensors();
if (!client.connected()) {
if (client.connect(id_connect)) {
control();
getSensors();
client.subscribe("myhome/Kitchen/#");
}
}
}
и функционал
СпойлерПоказать
//--------------------------------- Functions ---------------------------------//
/////////////////////////////////От Брокера//////////////////////////////////////////////
void callback_iobroker(String strTopic, String strPayload){
if (strTopic == "myhome/Kitchen/Servo"){
ServoAngle=strPayload.toInt();
if (ServoAngle >= 0 && ServoAngle <= 255){
servo.attach(ServoPin);
//delay(200); //ждем 2 секунды
servo.write(ServoAngle); //ставим вал под 0
delay(1000); //ждем 2 секунды
//client.publish("myhome/Kitchen/Servo", b);
servo.detach();
}
}
}

////////////////////////////////////Брокеру/////////////////////////////////////
void control(){

if(digitalRead(5)==HIGH && flag==0) { //если окно открыто
client.publish("myhome/Kitchen/Window", "1");
flag=1;
}
if(digitalRead(5)==LOW && flag==1){//если окно закрыто
client.publish("myhome/Kitchen/Window", "0");
flag=0;//обнуляем переменную flag
}

if(digitalRead(4)==HIGH && flag2==0) { // Если есть движение
client.publish("myhome/Kitchen/Motion", "1");
flag2=1;
}
if(digitalRead(4)==LOW && flag2==1){// Если нет движения
client.publish("myhome/Kitchen/Motion", "0");
flag2=0;//обнуляем переменную flag
}
}
///////////////////////////////Данные сенсоров////////////////////////////////////

void getSensors () {

MQ7Value = analogRead(MQ7_Pin);
fotoValue = analogRead(foto_Pin); // считываем значение с фоторезистора
// ServoAngle = analogRead(2);

//Обработка данных датчика DHT22. Подключение к порту цифровому P9 Arduino
//Глобальные переменные Hout и Tout типа флоат - влажность (%) и температура (град. С)
if (DHT.read22(DHT22_PIN)== DHTLIB_OK) {
Hout = DHT.humidity;
Tout = DHT.temperature;
}
if (Hout == 0 || Tout == 0){
delay (1000);
if (DHT.read22(DHT22_PIN)== DHTLIB_OK) {
Hout = DHT.humidity;
Tout = DHT.temperature;
}
}
//Обработка данных цифровых датчиков температуры типа DS18B20.
//Шина 1-Wire на цифровой пин P8 Arduino.
//Подключено 2 датчика температуры, адреса задаются в секции глобальных констант "Sensors"
//Три значение температуры T1, T2, типа float (град. С).
DS_sensors.requestTemperatures();
T1 = DS_sensors.getTempC(addr_T1);

///////////////////////Паблик данных сенсоров////////////////////////
if (pause == 50 || pause == 0){

char b[5];
String char_Hout = String(Hout);
char_Hout.toCharArray(b,5);
client.publish("myhome/Kitchen/Humidity_room", b);

String char_Tout = String(Tout);
char_Tout.toCharArray(b,5);
client.publish("myhome/Kitchen/Temp_room", b);

String char_T1 = String(T1);
char_T1.toCharArray(b,5);
client.publish("myhome/Kitchen/Temp_radiator", b);

String char_fotoValue = String(fotoValue);
char_fotoValue.toCharArray(b,4);
client.publish("myhome/Kitchen/Lux", b);

String char_ServoAngle = String(ServoAngle);
char_ServoAngle.toCharArray(b,4);
client.publish("myhome/Kitchen/Servo", b);

String char_MQ7Value = String(MQ7Value);
char_MQ7Value.toCharArray(b,4);
client.publish("myhome/Kitchen/MQ7", b);

pause = 1;
}
else pause++;
}

а так же может быть понадобится библиотека для dht

у меня полностью рабочий скетч кроме myhome/Kitchen/Motion почему то не выводится по MQTT если кто то поймёт почему сообщите пожайлуста.
Всем спасибо
Вложения
dht.zip
(2.84 КБ) 226 скачиваний
ZyaK
Сообщения: 417
Зарегистрирован: Вт окт 24, 2017 2:01 pm
Откуда: Ижевск
Благодарил (а): 45 раз
Поблагодарили: 71 раз

Re: mqtt нужна помощь

Сообщение ZyaK » Пт ноя 24, 2017 11:31 am

Помогите разобраться с проблемой, пытаюсь управлять 8-ю релюхами, соответственно 8 топиков,
все работает идеально до 5 топиков, как только вписываю 6-й он не может подключиться к Mqtt

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

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
const char* ssid = "MikroTik"; //Название сети
const char* password = "csn941601";           //пароль
const char* mqtt_server = "192.168.1.216";    //ip брокера mqtt
char msg[50];

#define RELAY_1 2                            //Выход на реле или светодиод
#define BUTTON_1 5                           //Кнопка
#define relays_topic1 "ESP01/r_1"
#define relays_topic2 "ESP01/r_2"
#define relays_topic3 "ESP01/r_3"
#define relays_topic4 "ESP01/r_4"
#define relays_topic5 "ESP01/r_5"
#define relays_topic6 "ESP01/r_6"

WiFiClient espClient;                        //инициализация WiFi клиента
PubSubClient client(espClient);              //инициализация MQTT клиента

long last_mls = millis();                    //функция времени в милисекундах
long last_mls2 = millis();

boolean Status1 = true;                       //объявляем статус реле в 0
boolean btnPress1 = false;                    //объявляем что кнопка не нажата 0
boolean lastbtnStat1 = false;                 //временная переменная для хранения статуса
boolean Status2 = true;
boolean Status3 = true;
boolean Status4 = true;
boolean Status5 = true;
boolean Status6 = true;

int regim1 = 0;                               //режим по умолчанию при включении
int regim2 = 0; 
int regim3 = 0; 
int regim4 = 0; 
int regim5 = 0;
int regim6 = 0;

void setup(){
  pinMode(RELAY_1, OUTPUT);                  //Выход на реле или светодиод
  pinMode(BUTTON_1, INPUT);                  //Кнопка
  digitalWrite(RELAY_1, Status1);             //устанавливаем на выходе статус реле

  Serial.begin(115200);
  client.setServer(mqtt_server, 1883);       //подключаемся к MQTT
  client.setCallback(callback);              //функция получения топиков с брокера
  delay(100);
  WiFi.begin(ssid, password);                //подключаемся к WiFi
  delay(5000);
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP()); 

  client.connect("ESP01Client");             //конектимся с брокером как клиент
  delay(100);
  client.subscribe(relays_topic1);            //подписываемся на топик
  client.subscribe(relays_topic2);            //подписываемся на топик
  client.subscribe(relays_topic3);            //подписываемся на топик
  client.subscribe(relays_topic4);            //подписываемся на топик
  client.subscribe(relays_topic5);            //подписываемся на топик
  client.subscribe(relays_topic6);
   
}

void callback(char* topic, uint8_t* payload, unsigned int length){
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("  ");
  String strTopic = String(topic);
  String strPayload = String((char*)payload);
  for (int i = 0; i < length; i++) {
  Serial.print((char)payload[i]);
  }
  Serial.println();
  if (strTopic == "ESP01/r_1") {
    if ((char)payload[0] == '0') {
      Status1 = true;
      regim1 = 0;
    }
    else if ((char)payload[0] == '1') {
      Status1 = false;
      regim1 = 1;
    }
  
  if (strTopic == "ESP01/r_2") {
    if ((char)payload[0] == '0') {
      Status2 = false;
      regim2 = 0;
    }
    else if ((char)payload[0] == '1') {
      Status2 = true;
      regim2 = 1;
    } 
  }
  if (strTopic == "ESP01/r_3") {
    if ((char)payload[0] == '0') {
      Status3 = false;
      regim1 = 0;
    }
    else if ((char)payload[0] == '1') {
      Status3 = true;
      regim1 = 1;
    }
  }
  if (strTopic == "ESP01/r_4") {
    if ((char)payload[0] == '0') {
      Status4 = false;
      regim1 = 0;
    }
    else if ((char)payload[0] == '1') {
      Status4 = true;
      regim1 = 1;
    }
  }
  if (strTopic == "ESP01/r_5") {
    if ((char)payload[0] == '0') {
      Status5 = false;
      regim1 = 0;
    }
    else if ((char)payload[0] == '1') {
      Status5 = true;
      regim1 = 1;
    }
  }
  if (strTopic == "ESP01/r_6") {
    if ((char)payload[0] == '0') {
      Status6 = false;
      regim1 = 0;
    }
    else if ((char)payload[0] == '1') {
      Status6 = true;
      regim1 = 1;
    }
  }
 }
}

void button1() 
{
  btnPress1 = digitalRead(BUTTON_1);
  Status1 = digitalRead(RELAY_1);
  if (btnPress1 == LOW && lastbtnStat1 == false) 
  {
    delay(5); // защита от дребезга
    regim1++;
    lastbtnStat1 = true;
    if (regim1 > 1) 
    {
      regim1 = 0;
    }
  }
  if (btnPress1 == HIGH && lastbtnStat1 == true) 
  {
    lastbtnStat1 = false;
  }

  if (regim1 == 0) 
  {
    Status1 = true;
    digitalWrite(RELAY_1, Status1);
  }
  if (regim1 == 1) 
  {
    Status1 = false;
    digitalWrite(RELAY_1, Status1);
  }
}

void MQTT()                                   //публикуем топик с состоянием режима
{
  if (millis() - last_mls2 > 3000)            //периодичность публикации топика
  { last_mls2 = millis();
    client.publish(relays_topic1, String(regim1).c_str());
    client.publish(relays_topic2, String(regim2).c_str());
    client.publish(relays_topic3, String(regim1).c_str());
    client.publish(relays_topic4, String(regim1).c_str());
    client.publish(relays_topic5, String(regim1).c_str());
    client.publish(relays_topic6, String(regim1).c_str());
    Serial.println("Отправка данных MQTT");
   }
}
void reconnect_server()                      //функция проверки подключения
{
  if (WiFi.status() != WL_CONNECTED)         //если нет подключения с сети
  {
    WiFi.begin(ssid, password);
    Serial.println("");
    Serial.println("WiFi попытка подключения reconnect");       //выводим в монитор порта что пытаемся подключиться
  } else {
    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
  }
  if (!client.connected() &&  WiFi.status() == WL_CONNECTED  ) { //если к сети подключились но к MQTT нет
     client.connect("ESP01Client");             //конектимся с брокером как клиент
     delay(100);
     client.subscribe(relays_topic1);            //подписываемся на топик
     client.subscribe(relays_topic2);            //подписываемся на топик
     client.subscribe(relays_topic3);            //подписываемся на топик
     client.subscribe(relays_topic4);
     client.subscribe(relays_topic5);
     client.subscribe(relays_topic6);
     Serial.println("Mosquitto попытка подключения"); //выводим в монитор порта что пытаемся подключиться
  }
}
void loop()
{
  client.loop();
  MQTT();
  button1();
  //button2();
  //button3();
  //delay(200);
  if (millis() - last_mls > 15000)     //проверка подключений раз в 60 сек
  {
   last_mls = millis();
   reconnect_server();
    
  }
  
}
неделю уже мучаюсь, хер его знает чо не так
в идеале хочу поставить 74hc595 дергать релюхи, а остальные выводы задействовать под пару датчиков и выключатели...
но отправка посылок по mqtt тормозит весь процесс...
режимы пока подставляю в остальные статусы из первого, чтоб контролировать изменение.
он пытается подключиться но не пойму то ли он от сервера топики не принимает то ли чего, на кнопку ЕСПха реагирует
PI2 + MQTT + 5 ESP8266 + Atmega16
Logrus
Сообщения: 2113
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 317 раз
Поблагодарили: 466 раз

Re: mqtt нужна помощь

Сообщение Logrus » Сб ноя 25, 2017 7:32 am

esp держит до 5 tcp соединений, не с этим ли проблема?
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Аватара пользователя
Vlado
Сообщения: 24
Зарегистрирован: Чт окт 19, 2017 2:24 pm
Благодарил (а): 3 раза
Поблагодарили: 0

Re: mqtt нужна помощь

Сообщение Vlado » Сб ноя 25, 2017 8:31 am

Рабочий код для mega 2560, работает и на esp и на stm32 с небольшими изминениями
если интересно выложу версии под конкретные ардуинки

Код брал с примеров немного модернизировал
реализовано:
ide -1.6.5( вроде бы особых глюков и на свежей не заметил)
несколько датчиков движения
dht11-22 библиотека 1.2.1
ds18b20
включение реле со стороны мд
измерение расстояния в бочке
измерение давления воды

в mqtt со стороны мд настройка :
MajorDoMo Client: mqtt
Hostname: (*) 192.168.1.10
Port: (*) 1883
Subscription path: (*) #
логин mqtt
пароль paradox

СпойлерПоказать
по крайней мере можно дальше прикрутить что угодно и переделать под себя
работает с год без нареканий
ZyaK
Сообщения: 417
Зарегистрирован: Вт окт 24, 2017 2:01 pm
Откуда: Ижевск
Благодарил (а): 45 раз
Поблагодарили: 71 раз

Re: mqtt нужна помощь

Сообщение ZyaK » Сб ноя 25, 2017 10:34 am

Logrus писал(а):esp держит до 5 tcp соединений, не с этим ли проблема?
что то нигде не натыкался на такую информацию
не получится в одном топике передавать состояние 8 реле?
например топик ESP01_Relay и в него запихать состояние для каждого реле?
Последний раз редактировалось ZyaK Сб ноя 25, 2017 10:58 am, всего редактировалось 1 раз.
PI2 + MQTT + 5 ESP8266 + Atmega16
Logrus
Сообщения: 2113
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 317 раз
Поблагодарили: 466 раз

Re: mqtt нужна помощь

Сообщение Logrus » Сб ноя 25, 2017 10:48 am

https://it4it.club/topic/55-meteostanci ... it4itclub/
первый пост, первый абзац (под фото)
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Ответить