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

artemon25
Offline
Зарегистрирован: 25.12.2015

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

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 [i], INPUT);
}
digitalWrite(5, HIGH); //Окно
digitalWrite(4, HIGH); //Объемник
for (int i = 0 ; i <= n_DO_pin; i++) {
pinMode (start_DO_pin [i], 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++;
}

 

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

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

Заранее всем спасибо за ответы жду ответов

 

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Ну, Вам же компилятор прямо говорит, что у класса DHT нет конструктора без параметров, а Вы в 56 строке именно его и спользуете. Там параметр должен быть (кажется, номер пина). Поставьте же его, наконец.

artemon25 пишет:
Можете подсказать отчего у меня всё так получается.
Оттого, что Вы взяли чужой скетч и пытаетесь запустить, не понимая, что в нём написано. Программирование - это профессиональная деятельность и заявления типа "в ардуино всё так просто, что программировать уметь не надо" - не более, чем рекламный трюк. Почитайте что-нибудь о программировании, напишите несколько более простых программ, глядишь и прояснится маленько.

ZhenyaRUS39
Offline
Зарегистрирован: 08.10.2015

Можете подсказать, как значения типа float передать по MQTT?

В serial выводятся,а на сервер нет. Как их надо правильно преобразовывать в string?

Oleg_I
Offline
Зарегистрирован: 04.04.2016

Здравствуйте, всем кто обратил внимание на этот запрос 

Имеется ESP 8266 - 07 

Есть необходимость клацать реле через MQTT смотреть влажность DHT11 и температуру 

Все казалось бы стандартно 

Но т.к. мои познания не очень глубоки я взял за  основу готовый код на одно реле и датчик температуры, дополнил его куском для обновления ОТА еще двумя реле, а вот DHT11 не могу 

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

Прошу ткнуть носом где у меня ошибка по возможности, буду благодарен за любые комментари/подсказки по сути  

Я так подозреваю ошибка в преобразовании данных и функции отправки 


// Датчик температуры ds18b20 к 2 пину
// Светодиод подлкючен к 4 пину
// Светодиод подлкючен к 5 пину
// Светодиод подлкючен к 12 пину
// dht 14 pins
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include "DHT.h"
///////////////////////////////////udp//////////
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
///////////////////////////////////////////////

// DHT
#define DHTPIN 14
#define DHTTYPE DHT11
// Initialize DHT sensor.
DHT dht(DHTPIN, DHTTYPE);

#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

////////////////////////////
#ifndef STASSID

#define STASSID "Aффф"
#define STAPSK  "8888"
#endif

const char* host = "esp8266-webupdate";
const char* ssid = STASSID;
const char* password = STAPSK;

ESP8266WebServer server(80);
const char* serverIndex = "<form method='POST' action='/update' enctype='multipart/form-data'><input type='file' name='update'><input type='submit' value='Update'></form>";
/////////////////////////////////
//const char *ssid =  "Aффф";  // Имя вайфай точки доступа
//const char *pass =  "8888";

const char *mqtt_server = "чччччччччч"; // Имя сервера MQTT
const int mqtt_port = яяяяяяя; // Порт для подключения к серверу MQTT
const char *mqtt_user = "ччччччччч"; // Логи от сервер
const char *mqtt_pass = "ччччччччч"; // Пароль от сервера

#define BUFFER_SIZE 100

bool LedState = false;
bool LedState2 = false;
bool LedState3 = false;
int tm = 300;
float temp = 0;

// Функция получения данных от сервера

void callback(const MQTT::Publish& pub)
{
  Serial.print(pub.topic());   // выводим в сериал порт название топика
  Serial.print(" => ");
  Serial.print(pub.payload_string()); // выводим в сериал порт значение полученных данных

  String payload = pub.payload_string();

  if (String(pub.topic()) == "test/led") // проверяем из нужного ли нам топика пришли данные
  {
    int stled = payload.toInt(); // преобразуем полученные данные в тип integer
    digitalWrite(5, stled); //  включаем или выключаем светодиод в зависимоти от полученных значений данных
  }
  if (String(pub.topic()) == "test/led2") // проверяем из нужного ли нам топика пришли данные
  {
    int stled2 = payload.toInt(); // преобразуем полученные данные в тип integer
    digitalWrite(4, stled2); //  включаем или выключаем светодиод в зависимоти от полученных значений данных
  }
  if (String(pub.topic()) == "test/led3") // проверяем из нужного ли нам топика пришли данные
  {
    int stled3 = payload.toInt(); // преобразуем полученные данные в тип integer
    digitalWrite(12, stled3); //  включаем или выключаем светодиод в зависимоти от полученных значений данных
  }
}



WiFiClient wclient;
PubSubClient client(wclient, mqtt_server, mqtt_port);
unsigned long lastSend;

void setup() {
  dht.begin();
  delay(10);
  lastSend = 0;
  sensors.begin();
  Serial.begin(115200);
  delay(10);
  Serial.println();
  Serial.println();
  pinMode(4, OUTPUT);  // к реле2
  pinMode(5, OUTPUT);   // к реле1
  pinMode(12, OUTPUT);   // к реле3

  //////////////////////////////////////////////UDP/////////
  Serial.begin(115200);
  Serial.println();
  Serial.println("Booting Sketch...");
  WiFi.mode(WIFI_AP_STA);
  WiFi.begin(ssid, password);
  if (WiFi.waitForConnectResult() == WL_CONNECTED) {
    MDNS.begin(host);
    server.on("/", HTTP_GET, []() {
      server.sendHeader("Connection", "close");
      server.send(200, "text/html", serverIndex);
    });
    server.on("/update", HTTP_POST, []() {
      server.sendHeader("Connection", "close");
      server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK");
      ESP.restart();
    }, []() {
      HTTPUpload& upload = server.upload();
      if (upload.status == UPLOAD_FILE_START) {
        Serial.setDebugOutput(true);
        WiFiUDP::stopAll();
        Serial.printf("Update: %s\n", upload.filename.c_str());
        uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000;
        if (!Update.begin(maxSketchSpace)) { //start with max available size
          Update.printError(Serial);
        }
      } else if (upload.status == UPLOAD_FILE_WRITE) {
        if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
          Update.printError(Serial);
        }
      } else if (upload.status == UPLOAD_FILE_END) {
        if (Update.end(true)) { //true to set the size to the current progress
          Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize);
        } else {
          Update.printError(Serial);
        }
        Serial.setDebugOutput(false);
      }
      yield();
    });
    server.begin();
    MDNS.addService("http", "tcp", 80);

    Serial.printf("Ready! Open http://%s.local in your browser\n", host);
  } else {
    Serial.println("WiFi Failed");
  }
  //////////////////////////////////////////////////udp end//////////
}

void loop() {
  // подключаемся к wi-fi
  if (WiFi.status() != WL_CONNECTED) {
    Serial.print("Connecting to ");
    Serial.print(ssid);
    Serial.println("...");
    WiFi.begin(ssid, password);

    if (WiFi.waitForConnectResult() != WL_CONNECTED)
      return;
    Serial.println("WiFi connected");
  }

  // подключаемся к MQTT серверу
  if (WiFi.status() == WL_CONNECTED) {
    if (!client.connected()) {
      Serial.println("Connecting to MQTT server");
      if (client.connect(MQTT::Connect("arduinoClient2")
                         .set_auth(mqtt_user, mqtt_pass))) {
        Serial.println("Connected to MQTT server");
        client.set_callback(callback);
        client.subscribe("test/led"); // подписывааемся на топик с данными для светодиода
        client.subscribe("test/led2"); // подписывааемся на топик с данными для светодиода
        client.subscribe("test/led3"); // подписывааемся на топик с данными для светодиода
      } else {
        Serial.println("Could not connect to MQTT server");
      }
    }

    if (client.connected()) {
      client.loop();
      TempSend();
      getAndSendTemperatureAndHumidityData();
       //{
     // if ( millis() - lastSend > 1000 ) { // Update and send only after 1 seconds
   // getAndSendTemperatureAndHumidityData();
   // lastSend = millis();
  //}
    }
  }
  server.handleClient();
  MDNS.update();
} // конец основного цикла


// Функция отправки показаний с термодатчика
void TempSend() {
  if (tm == 0)
  {
    sensors.requestTemperatures();   // от датчика получаем значение температуры
    float temp = sensors.getTempCByIndex(0);
    client.publish("test/temp", String(temp)); // отправляем в топик для термодатчика значение температуры
      Serial.println(temp);
    tm = 300;  // пауза меду отправками значений температуры  коло 3 секунд
  }
  tm--;
  delay(10);
}
//////////////////////////////////dht//////////////////////////

 void getAndSendTemperatureAndHumidityData()
 {
  if (tm == 0)
  {
   float humidity = dht.readHumidity();
  // Read temperature as Celsius (the default)
   float temperature = dht.readTemperature();
 // if (isnan(humidity) || isnan(temperature)) {
  //  Serial.println("Failed to read from DHT sensor!");
 //   return;
 // }

  Serial.println("Sending data to ThingsBoard:");
  Serial.print("Humidity: ");
  Serial.print(humidity);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(temperature);
  Serial.println(" *C ");

  client.publish("humidity", String(humidity)); 
 Serial.println(humidity);
 tm = 300;  // пауза меду отправками
}
 tm--;
  delay(10);
}