espMQTT вопрос по работе

Пионер
Offline
Зарегистрирован: 04.02.2019

Имею два устройства на 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- тоже тормоза)

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Строка 62 (arduinoClient2) должна быть различная для каждого устройства.

Пионер
Offline
Зарегистрирован: 04.02.2019

Спасибо большое, добрый человек.

Салабон
Offline
Зарегистрирован: 17.03.2019

А одновременно,к примеру ,просматривать показания датчика на веб странице ,принятые от брокера MQTT,можно?(показать температуру  на ,компе соседа ,к примеру,который о MQTTничего не ведает)Или заводить веб-сервер на ESP модуле датчика паралельно MQTT только?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Web сервер на esp самое простое
http://arduino.ru/forum/proekty/ethernet-vyklyuchatel-nagruzki-v-lokalno...

Пионер
Offline
Зарегистрирован: 04.02.2019

Опять появились вопросы к знатокам. (Сам не могу понять). Подключил к ESP -12 DS18B20.В скетче заменил функцию

void TempSend() {
  if (tm == 0)
  {
    sensors.requestTemperatures();
  temp = sensors.getTempCByIndex(0);
    client.publish("test/temp", String(temp)); 
    Serial.println(temp);
    tm = 300; 
  }
  tm--;
  delay(10);
}

Добавил библиотеки

#include <OneWire.h>
#include <DallasTemperature.h>

  и объявил переменную флоат темр как глобальную.

Залил в  ESP-12. Тестировал дня два. Все нормально .

Температура всегда отображалась корректно.

Залил этот-же скетч в ESP-32 и подключил датчик . Все заработало . Собрался усложнять скетч , но заметил , что хаотично (несколько раз в минуту  -две)проскакивают значения температуры -127. Грешил на питание дачтика - поменял с 3.3 на 5.0 вольт. То-же самое. Блок питания - стабильный и держит до 3 Амп(регулируемый).

Поменял ЕСП32 на другую ЕСП 32 - результат тот-же.

Перебросил датчик опять на ЕСП-12- ВСЕ ОК. Показания стабильные.

Кто нить сталкивался с такими проблемами на ЕСП32 ?

Хотелось задействовать с ЕСП32  4 аналоговых входа и подключить карту SD и еще кое-что . Выводов у нее поболее и т.д.

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Попробуй уменьшить резистор для ds18b20 до 2К.

А еще можно в код добавить игнорирование -127

 

bwn
Offline
Зарегистрирован: 25.08.2014

asam пишет:

А еще можно в код добавить игнорирование -127

Чет мне кажется, это слишком жестко.)))) 
То ТС, еще раз, вдумчиво, проверьте цепи питания датчика, в т.ч. на подозрительной плате. Какая длина линии, как подключен?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

bwn пишет:

asam пишет:

А еще можно в код добавить игнорирование -127

Чет мне кажется, это слишком жестко.)))) 

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

bwn
Offline
Зарегистрирован: 25.08.2014

На другой плате, ведь без косяков работает, походу не  датчик. ИМХО.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

bwn пишет:

На другой плате, ведь без косяков работает, походу не  датчик. ИМХО.

Логично, не прав.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Пионер пишет:

Опять появились вопросы к знатокам. (Сам не могу понять). Подключил к ESP -12 DS18B20.В скетче заменил функцию

void TempSend() {
  if (tm == 0)
  {
    sensors.requestTemperatures();
  temp = sensors.getTempCByIndex(0);
    client.publish("test/temp", String(temp)); 
    Serial.println(temp);
    tm = 300; 
  }
  tm--;
  delay(10);
}

Добавил библиотеки

#include <OneWire.h>
#include <DallasTemperature.h>

  и объявил переменную флоат темр как глобальную.

Залил в  ESP-12. Тестировал дня два. Все нормально .

Температура всегда отображалась корректно.

Вы понимаете, что ESP32 быстрее 12 ? Вы понимаете, что измерение температуры длится некоторое время ? И еще вопрос - Где тут пауза на время измерения ?

Поэтому попробуйте между 4 и 5 строкой вставить задержку для начала 1 миллисекунду и проверьте есть ошибки или нет.

Еще, сталкивался с датчиками, для которых ресет из стандартной библиотеки был короток. приходилось руками править библиотеку.

Пионер
Offline
Зарегистрирован: 04.02.2019

 

brokly пишет:

Вы понимаете, что 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и прочего-только один датчик.А сегодня уже все - мамка у люлю гонит.

Спасибо всем за помощь.

 

Пионер
Offline
Зарегистрирован: 04.02.2019

Всем привет.

Сделал на OneWire,  без DallasTemperature.

// Функция отправки показаний с термодатчика
void TempSend(int interval) {
  static unsigned long sensingTempTime;
  if (millis() - sensingTempTime > interval) {
    sensingTempTime = millis();
    int temp = 0;
    temp = tempProcess(READ_TEMP); //читаем Т
    tempProcess(START_CONVERT);
    temperature = temp;
    temperature = temperature / 10;
    //    client.publish("test/temp", String(temperature));
  }

}
//==============================
int tempProcess(boolean ch) {
  int t = 0;
  if (!ch) {
    ds.reset();
    ds.write(0xCC);
    ds.write(0x44);
  }
  else {
    ds.reset();
    ds.write(0xCC);
    ds.write(0xBE);
    t = ds.read();
    t = t | (ds.read() << 8);
    return  (t * 10) >> 4; //целое в десятых *C (214=>21,4*C)
  }
}

Код из темы Dimaxa . Значения публикую в лупе каждые н-сек.Полет нормальный . С утра никаких аномалий по температуре клиентами получено не было.Оставлю еще на день посмотреть.А там можно и дальше усложнять код.