MQTT нужна помощь
- Войдите на сайт для отправки комментариев
добрый вечер всем нашёл этот скетч и обрадовался потому что это то что я и хотел но не тут было ни как не могу скомпилировать этот скетч , постоянно какие то ошибки сначала с библиотеками были вроде решил потом со строками
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
Можете подсказать отчего у меня всё так получается.
Заранее всем спасибо за ответы жду ответов
Ну, Вам же компилятор прямо говорит, что у класса DHT нет конструктора без параметров, а Вы в 56 строке именно его и спользуете. Там параметр должен быть (кажется, номер пина). Поставьте же его, наконец.
Можете подсказать, как значения типа float передать по MQTT?
В serial выводятся,а на сервер нет. Как их надо правильно преобразовывать в string?
Здравствуйте, всем кто обратил внимание на этот запрос
Имеется 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); }