Как страшно жить! Но уж если на то пошло я ж могу из сырцов сгенерить то что нужно мне. Не вижу никаких препятствий сделать только тот функционал который буду пользовать. При этом буду совместим со всем наработанным ПО по MQTT.
А зачем клиенту на смартфоне что то синхронизировать? Он выдаёт два числа - значение параметра и время отправки, которые я сформировал в пакет. Я на смартфоне глазами вижу сколько и когда. Это входит в определение мониторить?
Потенциально приходящие вразнобой метрики из среза не считаю надёжным методом мониторинга.
Я понимаю, что можно сразу их все запихать в один пакет, но в стоке MQTT используется для несинхронной передачи метрик с допущением, что внутри оно там само-собой работает “по-взрослому”, что не так.
Мне безмерно льстит, что этот пост привлёк внимание столь опытных кодеров. Но, мужики, лучше б подсказали код, в котором сообщение отсылалось в топик один раз по событию : нажатию или отпусканию кнопки. И чтоб это можно было применить для трёх кнопок, чтоб кнопки не зависели друг от друга. Курю интернет и в голове уже каша. И некоторые, казалось бы верные решения не работают как надо. nik 182 любезно подсказал, но столь высокая грамота для моего уровня слишком непосильна.
А ни как. Это не возможно. Только узнаем когда сработает. Это же террористические методы. Как бы там не было, я полностью согласен с Акуниным
Никогда не пугай себя тем, что еще не случилось, а лишь может случиться, ибо воображаемые ужасы отравляют кровь и ослабляют душу. — Борис Акунин, «Ореховый Будда»
Вот попытался сделать как надо. ввёл булевы переменные состояние кнопки и отправляю сообщения только когда статус изменился. От дребезга надеюсь делей защитит. Не проверял в железе.
Спойлер
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
const int button1 = 14; // указываем пин D5 для первой кнопки
const int button2 = 12; // указываем пин D6 для второй кнопки
const int button3 = 13; // указываем пин D7 для третьей кнопки
const char* ssid = "Rostelecom"; // Имя вайфай точки доступа
const char* password = "SJRJCJEJ"; // Пароль от точки доступа
const char* mqtt_server = "m5.wqtt.ru"; // Имя сервера MQTT Cluster
const int mqtt_port = 12346; // Порт для подключения к серверу MQTT
const char* mqtt_clientId = "Distterm"; // определяем ID
const char* mqtt_user = "u_WZIJ1V"; // Логин от сервер
const char* mqtt_pass = "FzoLDUAp"; // Пароль от сервера
#define BUFFER_SIZE 100
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
#define MSG_BUFFER_SIZE (50)
char msg[MSG_BUFFER_SIZE];
int value = 0;
bool flb1,flb2,flb3,flb4;
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
if (!client.connected()) {
Serial.print("MQTT connection...");
client.setServer(mqtt_server, mqtt_port); // Подключение к MQTT клиенту
if (client.connect(mqtt_clientId, mqtt_user, mqtt_pass)) {
Serial.println("connected");
client.subscribe("BTN1"); // подписывааемся на топик с данными для 1-ой кнопки btn1
client.subscribe("BTN2"); // подписывааемся на топик с данными для 2-ой кнопки btn2
client.subscribe("BTN3"); // подписывааемся на топик с данными для 3-ой кнопки btn3
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
if (client.connected()){
client.loop();
}
}
}
void setup() {
pinMode(LED_BUILTIN, OUTPUT); // Инициализация светодиода
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
}
void loop() {
if (digitalRead(button1) == LOW && flb1) {
client.publish("BTN1", "0");
flb1=false;
}
if (digitalRead(button1) == HIGH && !flb1) {
client.publish("BTN1", "1");
flb1=true;
}
if (digitalRead(button2) == LOW && flb2) {
client.publish("BTN2", "0");
flb2=false;
}
if (digitalRead(button2) == HIGH && !flb2) {
client.publish("BTN1", "1");
flb2=true;
} if (digitalRead(button3) == LOW && flb3) {
client.publish("BTN3", "0");
flb3=false;
}
if (digitalRead(button3) == HIGH && !flb3) {
client.publish("BTN3", "1");
flb3=true;
}
delay(50);
if (!client.connected()) {
reconnect();
}
client.loop();
}
Извините, если кого то напугал. Просто некоторые люди в неведение, что такой сценарий в принципе возможен. Как говорится предупреждён - вооружён. В вопросах программирования, лучше как можно больше узнать о возможных ситуациях, чем потом стоять перед заказчиком и что то ему рассказывать об искусственных форс мажорах не предпологаемых заранее тобой. После написания кода, всегда желательно проверить его на устойчивость. По этому каждый придумывает как можно больше ситуаций, что может произойти. Вот и в данном случае, лучше сразу решить, чем потом подкидываться. Ведь у кого то (конкурента) будет работать, а у тебя нет. IMHO.
Просто некоторые люди не понимают зачем менять шило на мыло.
Понятное дело, что хочется железнобетонной надежности. Что раз сделал и навсегда.
Но непонятное дело в попытке замены одного неконтролируемого компонента на другой такой же под предлогом увеличения количества девяток.
Работает. Да ещё уведомление можно запустить про успешное выполнение задачи. Что бы при очень удалённом управлении быть уверенным что всё прошло как надо.