#26 Re: Апаратні питання » Датчик DS18B20 » 2018-08-10 12:30:11

Вячеслав Азаров пише:

Вы и роутер собрались сами делать, на ESP8266? Wi-Fi технология содержит все необходимые вам функции и обеспечивает уверенную радиосвязь до 200 м, поизучайте её.

Тока беспроводные датчики)) у меня с ESP очень плохой опыт, не могу победить её и заставить стабильно работать как MQTT client, да и wifi-канал в наше время сильно перегружен и как следствие очень много помех и уменьшение радиуса действия

#27 Re: Апаратні питання » Датчик DS18B20 » 2018-08-10 12:24:35

Green пише:

Передатчик на 433, тини13, CR2032. Простенько, экономичненько и бюджетненько.)

Если я Вас правильно понял, то нужно соединить ATTiny c Радио удлинителем 433Мгц

#28 Re: Апаратні питання » Датчик DS18B20 » 2018-08-10 12:16:59

Вячеслав Азаров пише:

20 ESP8266, они ж не дорогие.  smile

А какая ESP сможет удерживать соединение с 20 другими ESP? ))

#29 Re: Програмування Arduino » MQTT_client » 2018-08-10 11:49:10

Переделал код по примеру Nick O’Leary (автор данной библиотеки), что позволило отлавливать состояние клиента

void reconnect() {
  //Переподключение
  while (!mqtt_client.connected()) {
    Serial.print(F("ReConnected..."));
    // Попытка подключения
    if (mqtt_client.connect("ESP8266_test", "", "")) {
      Serial.println(F("Connected"));
      //
      mqtt_client.publish("/logs", "Connected");
      mqtt_client.subscribe("/logs");
    }
    else {
      Serial.print(F("failed, rc="));
      Serial.print(mqtt_client.state());
      Serial.println(F(" try again in 5 seconds"));
      //
      delay(5000);
    }
  }
}

переделал файл PubSubClient.h

#define MQTT_VERSION_3_1      3
//#define MQTT_VERSION_3_1_1    4

// MQTT_VERSION : Pick the version
//#define MQTT_VERSION MQTT_VERSION_3_1_1
#ifndef MQTT_VERSION
#define MQTT_VERSION MQTT_VERSION_3_1
#endif

Полный код

/*
    Name:       MQTT_new.ino
    Created:  10.08.2018
    Author:     DARK\Admin
*/

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <DNSServer.h>
#include <WiFiManager.h>
#include <PubSubClient.h>

WiFiClient wifi_client;
PubSubClient mqtt_client(wifi_client);

byte server[] = { 192, 168, 0, 1 };
unsigned long lastMqtt = 0;

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print(F("Message arrived ["));
  Serial.print(topic);
  Serial.print(F("] "));
  for (int i = 0; i<length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

void setup()
{
  Serial.begin(115200);
  Serial.println(F("start"));
  //
  wifi();
  //
  mqtt_client.setServer(server, 1883);
  mqtt_client.setCallback(callback);
  //
  delay(1500);
}

void loop()
{
  if (!mqtt_client.connected()) {
    reconnect();
  }
  mqtt_client.loop();
}

void wifi()
{
  WiFiManager wifiManager;
  //
  IPAddress _ip = IPAddress(192, 168, 0, 1);
  IPAddress _gw = IPAddress(192, 168, 0, 1);
  IPAddress _sn = IPAddress(255, 255, 255, 0);
  //
  wifiManager.setAPStaticIPConfig(_ip, _gw, _sn);
  //
  if (!wifiManager.autoConnect("ESP8266", "1234567890")) {
    Serial.println(F("Error"));
    delay(3000);
    ESP.reset();
    delay(5000);
  }
  //
  Serial.println(F("Connected"));
  Serial.print(F("local ip: "));
  Serial.println(WiFi.localIP());
}

void reconnect() {
  //Переподключение
  while (!mqtt_client.connected()) {
    Serial.print(F("ReConnected..."));
    // Попытка подключения
    if (mqtt_client.connect("ESP8266_test", "", "")) {
      Serial.println(F("Connected"));
      //
      mqtt_client.publish("/logs", "Connected");
      mqtt_client.subscribe("/logs");
    }
    else {
      Serial.print(F("failed, rc="));
      Serial.print(mqtt_client.state());
      Serial.println(F(" try again in 5 seconds"));
      //
      delay(5000);
    }
  }
}

Получаю в Monitor Port

ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-4 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...Connected
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...Connected
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...Connected
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...Connected
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...

#30 Re: Програмування Arduino » MQTT_client » 2018-08-10 09:32:55

Добавил комментарии))

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <DNSServer.h>
#include <WiFiManager.h>
#include <PubSubClient.h>
 
WiFiClient wifi_client;
PubSubClient mqtt_client(wifi_client);
 
byte server[] = { 192, 168, 0, 1 };
unsigned long lastMqtt = 0;
 
//callback для получения сообщений от MQTT брокера
void callback(char* topic, byte* payload, unsigned int length) {
    payload[length] = '\0';
    //
    String strTopic = String(topic);
    String strPayload = String((char*)payload);
    //
    Serial.print(F("topic: "));
    Serial.println(strTopic);
    Serial.print(F("message: "));
    Serial.println(strPayload);
}
 
void setup()
{
    Serial.begin(115200);
    Serial.println(F("start"));
    //
    wifi();
    //
	mqtt_client.setServer(server, 1883);
    mqtt_client.setCallback(callback);
	//
    //первичное подключение к MQTT брокеру
    if (mqtt_client.connect("ESP8266_test", "user", "pass")) {
		//подписка на нужную тему
        mqtt_client.subscribe("/logs");
		//публикациясообщения об успешном соединении
        mqtt_client.publish("/logs", "Connect");
    }
}
 
void loop()
{
    if (lastMqtt > millis()) {
        lastMqtt = 0;
    }
    //
	//нужно постоянно вызывать так как асинхронности нет
    mqtt_client.loop();
    //
	//таймер на 5сек.
    if (millis() > (lastMqtt + 5000)) {
		//если mqtt_client.connected == false, значит соединение разорвано
        if (!mqtt_client.connected()) {
			//повторное подключение
            if (mqtt_client.connect("ESP8266_test", "user", "pass")) {
				//повторная подписка, так как повторное подключение к MQTT ьрокеру
                mqtt_client.subscribe("/logs");
				//публикация сообщения о повторном подключении
                mqtt_client.publish("/logs", "ReConnect");
            }
        }
        //
        lastMqtt = millis();
    }
}
 
void wifi()
{
    WiFiManager wifiManager;
    //
    IPAddress _ip = IPAddress(192, 168, 1, 0);
    IPAddress _gw = IPAddress(192, 168, 1, 0);
    IPAddress _sn = IPAddress(255, 255, 255, 0);
    //
    wifiManager.setAPStaticIPConfig(_ip, _gw, _sn);
    //
    if (!wifiManager.autoConnect("ESP8266", "1234567890")) {
        Serial.println(F("Error"));
        delay(3000);
        ESP.reset();
        delay(5000);
    }
    //
    Serial.println(F("Connected"));
    Serial.print(F("local ip: "));
    Serial.println(WiFi.localIP());
}

повторное соединение при достижении таймера в 5 сек. при условии что соединение разорвано

if (millis() > (lastMqtt + 5000)) {
		//если mqtt_client.connected == false, значит соединение разорвано
        if (!mqtt_client.connected()) {
			//повторное подключение
            if (mqtt_client.connect("ESP8266_test", "user", "pass")) {
				//повторная подписка, так как повторное подключение к MQTT ьрокеру
                mqtt_client.subscribe("/logs");
				//публикация сообщения о повторном подключении
                mqtt_client.publish("/logs", "ReConnect");
            }
        }
        //
        lastMqtt = millis();
    }

Ужасное отображение кода при использовании тега <code> и нет нумерации строк((

API документацию брал с офф.сайта проекта pubsubclient.knolleary.net
Библиотека установлена через менеджер библиотек Arduino IDE, версия библиотеки 2.6.0.
Пробовал устанавливать и другие библиотеки и использовал их примеры, но ничего не изменяется.
Если у кого-то есть ESP8266 и MQTT брокер или время на его установку, то залейте пожалуйста мой код и протестируйте, а то складывается впечатление, что проблема в ESP8266, а не в коде((

#31 Re: Апаратні питання » Датчик DS18B20 » 2018-08-09 23:50:30

Об ESP я думал, но в будущем датчиков будет ~20 и нужно что-то на радиочастоте, вот тока до этого с такими девайсами не имел дел и не хочется покупать разных чтоб методом тыка найти оптимальный, по этой причине и создал данную тему, мож кто-то имеет опыт в данном направлении и сможет направить и ещё хотелось, чтоб передача данных была с шифрованием, а то доброжелателей хватает))

#32 Re: Програмування Arduino » MQTT_client » 2018-08-09 23:29:27

Сервер у меня Mosquitto 3.1 и с моим андроид клиентом идеально держит постоянную связь, в этом и суть данного протокола: один раз соединился, подписался на нужную тему и как тока появилось новое сообщение сразу получил его, а на стороне MEGA из-за постоянных переподключений сообщения попросту в этот период не доходят.
У меня есть проверка в loop() состояния клиента и если клиент по какой-то причине разорвал соединение, значит он не сможет получат сообщения по подписке и не будет работать callback, то идёт повторное соединение и повторная подписка. После этого, сообщения снова приходят пару минут, а потом снова разрыв и через 3-5 попыток получаеться снова соединиться, но сообщения в этот период будут потеряны, а значит контроллер не выполнит команды от андроид-клиента

#33 Програмування Arduino » MQTT_client » 2018-08-08 11:21:33

Alex777Dark
відповідей: 30

Здравствуйте,
у меня контроллер MEGA2560 + WiFi R3 запитан через блок питания 9В/1А, написал простой скетч для отображения в Monitor Port входящих сообщений от локального MQTT брокера. Работает все хорошо, но не долго, очень часто происходит переподключение к MQTT брокеру => mqtt_client.publish("/logs", "ReConnect");.
Вопрос: в чем можеть быть проблема?

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <DNSServer.h>
#include <WiFiManager.h>
#include <PubSubClient.h>

WiFiClient wifi_client;
PubSubClient mqtt_client(wifi_client);

byte server[] = { 192, 168, 0, 1 };
unsigned long lastMqtt = 0;

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

void setup()
{
	Serial.begin(115200);
	Serial.println(F("start"));
	//
	wifi();
	//
	mqtt_client.setServer(server, 1883);
	mqtt_client.setCallback(callback);
	//
	if (mqtt_client.connect("ESP8266_test", "user", "pass")) {
		mqtt_client.subscribe("/logs");
		mqtt_client.publish("/logs", "Connect");
	}
}

void loop()
{
	if (lastMqtt > millis()) {
		lastMqtt = 0;
	}
	//
	mqtt_client.loop();
	//
	if (millis() > (lastMqtt + 5000)) {
		if (!mqtt_client.connected()) {
			if (mqtt_client.connect("ESP8266_test", "user", "pass")) {
				mqtt_client.subscribe("/logs");
				mqtt_client.publish("/logs", "ReConnect");
			}
		}
		// 
		lastMqtt = millis();
	}
}

void wifi()
{
	WiFiManager wifiManager;
	//
	IPAddress _ip = IPAddress(192, 168, 1, 0);
	IPAddress _gw = IPAddress(192, 168, 1, 0);
	IPAddress _sn = IPAddress(255, 255, 255, 0);
	//
	wifiManager.setAPStaticIPConfig(_ip, _gw, _sn);
	//
	if (!wifiManager.autoConnect("ESP8266", "1234567890")) {
		Serial.println(F("Error"));
		delay(3000);
		ESP.reset();
		delay(5000);
	}
	//
	Serial.println(F("Connected"));
	Serial.print(F("local ip: "));
	Serial.println(WiFi.localIP());
}

#34 Апаратні питання » Датчик DS18B20 » 2018-08-08 10:08:55

Alex777Dark
відповідей: 19

Здравствуйте,
Хочу купить датчик температуры DS18B20 для установки на улице.
Вопрос: что еще нужно приобрести для передачи данных на контроллер MEGA2560 "по воздуху", желательно небольшого габарита, расстояние ~10м + стена (~30см).

Підвал форуму