espMQTT вопрос по работе
- Войдите на сайт для отправки комментариев
Имею два устройства на ESP-12 и Андроид-телефон. Работа по протоклу MQTT была испытана между телефоном и одним ESP. Все хорошо- отрабатывае быстро . Принимает данные(Subscribe) и отправляют(Publish). Связь - моментальная. Добавляю исчо одного клиента -ESP 12.Подписываю его на ту же рассылку , что и первого ESP. И тут затыки - или первый принимает и отрабатывает , или второй . Или с огромной задержкой - оба.
Брокер - Cloudmqqtt.com,план -бесплатный.
Скетч на ЕСП(2) с топиками
#include <ESP8266WiFi.h> #include <PubSubClient.h> const char *ssid = "SKYNET"; // Имя вайфай точки доступа const char *pass = "PIZDEC"; // Пароль от точки доступа const char *mqtt_server = "m29.cloudmqtt.com"; // Имя сервера MQTT const int mqtt_port = ****; // Порт для подключения к серверу MQTT const char *mqtt_user = "*****"; // Логи от сервер const char *mqtt_pass = "******"; // Пароль от сервера #define BUFFER_SIZE 100 int tm=300; // Функция получения данных от сервера 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/vroot") // проверяем из нужного ли нам топика пришли данные { int stled = payload.toInt(); // преобразуем полученные данные в тип integer digitalWrite(LED_BUILTIN,stled); // включаем или выключаем светодиод в зависимоти от полученных значений данных } } WiFiClient wclient; PubSubClient client(wclient, mqtt_server, mqtt_port); void setup() { sensors.begin(); Serial.begin(115200); delay(10); Serial.println(); Serial.println(); pinMode(LED_BUILTIN, OUTPUT); } void loop() { // подключаемся к wi-fi if (WiFi.status() != WL_CONNECTED) { Serial.print("Connecting to "); Serial.print(ssid); Serial.println("..."); WiFi.begin(ssid, pass); 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/vroot"); // подписывааемся по топик с данными для светодиода } else { Serial.println("Could not connect to MQTT server"); } } if (client.connected()){ client.loop(); TempSend(); } } } // конец основного цикла // void TempSend(){ if (tm==0) { int anal=analogRead(A0); client.publish("test/anal",String(anal)); // Serial.println(anal); tm = 300; // } tm--; delay(10); }
скетч переделанный с просторов сети.
Насолько я понял-подписчиков может быть на один и тот-же топик много. У мня - два (публикатор во втором шлет температуру с DS18B20 каждые 3 сек -как и в этой скетчи).И от количества подписчиков (Subscriber)скорость не зависит?. Или я чот не допонял. Или в настройках брокера надо что-то менять?
Вопрос: почему тормозим?(Лимит в п5ять подключений не превышен, через WEBsocet- тоже тормоза)
Строка 62 (arduinoClient2) должна быть различная для каждого устройства.
Спасибо большое, добрый человек.
А одновременно,к примеру ,просматривать показания датчика на веб странице ,принятые от брокера MQTT,можно?(показать температуру на ,компе соседа ,к примеру,который о MQTTничего не ведает)Или заводить веб-сервер на ESP модуле датчика паралельно MQTT только?
Web сервер на esp самое простое
http://arduino.ru/forum/proekty/ethernet-vyklyuchatel-nagruzki-v-lokalno...
Опять появились вопросы к знатокам. (Сам не могу понять). Подключил к ESP -12 DS18B20.В скетче заменил функцию
Добавил библиотеки
#include <OneWire.h>
#include <DallasTemperature.h>
и объявил переменную флоат темр как глобальную.
Залил в ESP-12. Тестировал дня два. Все нормально .
Температура всегда отображалась корректно.
Залил этот-же скетч в ESP-32 и подключил датчик . Все заработало . Собрался усложнять скетч , но заметил , что хаотично (несколько раз в минуту -две)проскакивают значения температуры -127. Грешил на питание дачтика - поменял с 3.3 на 5.0 вольт. То-же самое. Блок питания - стабильный и держит до 3 Амп(регулируемый).
Поменял ЕСП32 на другую ЕСП 32 - результат тот-же.
Перебросил датчик опять на ЕСП-12- ВСЕ ОК. Показания стабильные.
Кто нить сталкивался с такими проблемами на ЕСП32 ?
Хотелось задействовать с ЕСП32 4 аналоговых входа и подключить карту SD и еще кое-что . Выводов у нее поболее и т.д.
Попробуй уменьшить резистор для ds18b20 до 2К.
А еще можно в код добавить игнорирование -127
А еще можно в код добавить игнорирование -127
Чет мне кажется, это слишком жестко.))))
То ТС, еще раз, вдумчиво, проверьте цепи питания датчика, в т.ч. на подозрительной плате. Какая длина линии, как подключен?
А еще можно в код добавить игнорирование -127
Чет мне кажется, это слишком жестко.))))
Встречался с такими датчиками кривыми, так что вполне рабочий костыль, только вместо игнорирования значения, повторить запрос температуры.
На другой плате, ведь без косяков работает, походу не датчик. ИМХО.
На другой плате, ведь без косяков работает, походу не датчик. ИМХО.
Логично, не прав.
Опять появились вопросы к знатокам. (Сам не могу понять). Подключил к ESP -12 DS18B20.В скетче заменил функцию
Добавил библиотеки
#include <OneWire.h>
#include <DallasTemperature.h>
и объявил переменную флоат темр как глобальную.
Залил в ESP-12. Тестировал дня два. Все нормально .
Температура всегда отображалась корректно.
Вы понимаете, что ESP32 быстрее 12 ? Вы понимаете, что измерение температуры длится некоторое время ? И еще вопрос - Где тут пауза на время измерения ?
Поэтому попробуйте между 4 и 5 строкой вставить задержку для начала 1 миллисекунду и проверьте есть ошибки или нет.
Еще, сталкивался с датчиками, для которых ресет из стандартной библиотеки был короток. приходилось руками править библиотеку.
Вы понимаете, что ESP32 быстрее 12 ? Вы понимаете, что измерение температуры длится некоторое время ? И еще вопрос - Где тут пауза на время измерения ?
Поэтому попробуйте между 4 и 5 строкой вставить задержку для начала 1 миллисекунду и проверьте есть ошибки или нет.
Еще, сталкивался с датчиками, для которых ресет из стандартной библиотеки был короток. приходилось руками править библиотеку.
Спасибо за помощь.Попробовал вставить задержку между 4 и 5ой строками.Результат тот-же - проскакивает в хаотичном порядке значение -127.Задержку менял от 1мс до многу
И сразу вопрос:Правильно ли я понимаю , что в данной функции опрос датчика производится каждые 3 сек? Т.е и на измерение времени достаточно? Или все-таки лучше убрать счетчик и поставить после запроса температуры с датчика delay(3000);?
Или это одно и то-же?
По-моему, в скетче выше счетчик обнулится через 3 сек.
Датчик питал и от 3.3 и от 5.0. Резистор - 4к7. Уменьшал до 2к2. Провода припаяны , длина до 10 см.
Собирал на той-же макетке , что и ЕСП 12. Добавил конденсаторы по 3.3 В - (1000х16 и керамику на 0.1)
Утром попробую без библиотеки DallasTemperature- из примеров OneWire. Посмотрю как будет работать датчик без WiFi . без MQTTи прочего-только один датчик.А сегодня уже все - мамка у люлю гонит.
Спасибо всем за помощь.
Всем привет.
Сделал на OneWire, без DallasTemperature.
Код из темы Dimaxa . Значения публикую в лупе каждые н-сек.Полет нормальный . С утра никаких аномалий по температуре клиентами получено не было.Оставлю еще на день посмотреть.А там можно и дальше усложнять код.