Управление Реле по MQTT на Arduino

b707
Offline
Зарегистрирован: 26.05.2017

alexeko пишет:

PS - хотя по ДАТАШИТ написано, что БОЛЕЕ "More than 100,000 erase/program cycles"

Ну да, это нижний порог, ГАРАНТИРУЕМЫЙ ПРОИЗВОДИТЕЛЕМ.  На практике число циклов записи сильно зависит от частоты обращения и температуры чипа. В интернете можно найти тесты, где люди ставили ардуиновский ЕПРОМ на запись в цикле и получали 5-10 млн и более беспроблемных проходов при обещанном ресурсе 100 000.

alexeko
Offline
Зарегистрирован: 03.01.2014

Ушли от темы обсуждения.

Я как программист по работе, всегда исхожу из надежности железо/код программы. Ну а для дома, данные, приведенного выше кода, можно и на брокере хранить :-) , как пример.

Давайте оставим соревнование в знаниях ......

Charly_big
Offline
Зарегистрирован: 03.12.2017

Друзья, помогите разобраться с кодом? У меня на одной ардуинке висят датчики давления, температуры, влажности и т.п. Крутится MQTT брокер на большой машине. Теперь захотел на отдельной  ESPишке повесить маленький (дюймовый) OLED дисплей. Чтобы переносить по всему дому в виде дистанционного градусника забортной температуры. Набросал скетч, залил. Каждые три секунды, прилетает значение температуры. В мониторе порта вижу. Температура каждые три секунды разная. А вот на подключенном дисплее, выводит температуру только из первого сообщения. Потом это значение горит неизменно. Хотя в порт отправляет разные значения. Куда копать? мож забыл какую нить команду по очистке/инициализации  экрана? 


#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
float temp;

#define OLED_RESET D4
Adafruit_SSD1306 display(OLED_RESET);
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2

const char *ssid =  "ssssssssss";  // Имя вайфай точки доступа
const char *pass =  "zzzzzzzzzzz"; // Пароль от точки доступа

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

#define BUFFER_SIZE 100

bool LedState = false;
int tm=300;
//float temp=0;

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

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

  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(4);
  display.setCursor(0,30);
  display.println(pub.payload_string());
  display.display();






  
  String payload = pub.payload_string();
  
  if(String(pub.topic()) == "home/data/sensor/temp_in") // проверяем из нужного ли нам топика пришли данные 
  {
  int stled = payload.toInt(); // преобразуем полученные данные в тип integer
  digitalWrite(5,stled);  //  включаем или выключаем светодиод в зависимоти от полученных значений данных
  }
}



WiFiClient wclient;      
PubSubClient client(wclient, mqtt_server, mqtt_port);

void setup() {
  
  
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3D (for the 128x64)

  Serial.begin(115200);
  delay(10);
  Serial.println();
  Serial.println();
}

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("home/data/sensor/temp_in"); // подписывааемся по топик с данными для светодиода
      } else {
        Serial.println("Could not connect to MQTT server");   
      }

      
    }

    if (client.connected()){
      client.loop();
 
  }
  
}
} // конец основного 

 

alexeko
Offline
Зарегистрирован: 03.01.2014

Странно. Попробуй записать данные в переменную, а потом на вывод ее. А не просто pub.payload_string()

Charly_big
Offline
Зарегистрирован: 03.12.2017

Понял. Спасибо. Попробую завтра.

Serega66
Offline
Зарегистрирован: 23.03.2018

Здравствуйте. Подскажите неграмотному как правильно в коде вставить MQTT функцию retain? и где надо её добавлять я сделал это только в отправке строки брокеру, ни в калбек ни в подписках я ничего не добавил. наверное это неправильно? 

client.publish("home/data/status/relay1", String(lamp1).c_str(), true);