Прошу помочь со скетчем для ESP8266.
Есть ESP8266 (nodemcu v.1).
К пину А0 через резисторный делитель подключены две кнопки и дачик открытия двери.
Руководствуясь примерами я написал скетч который обрабатывает полученные с АЦП значения и передает их по MQTT в Majordomo. Все работает. НО!
Никак не получается прикрутить обработку длительного нажатия кнопки которая управляет реле. По задумке одно -короткое нажатие включение/выключение реле №1. Длительное нажатие этой кнопки включение/выключение реле №2.
КОД:
СпойлерПоказать
Код: Выделить всё
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
// Update these with values suitable for your network.
const char* ssid = "Agata";
const char* password = "Ilikechuckchuk";
const char* mqtt_server = "192.168.1.666";
#define relay1_mqtt "Agata01ard/relay_1" //публикуемый топик
#define relay2_mqtt "Agata01ard/relay_2" //публикуемый топик
#define doorstat_mqtt "Agata01ard/DoorStatus" //публикуемый топик
#define doorbell_mqtt "Agata01ard/DoorBell" //публикуемый топик
#define DHT_temp_mqtt "Agata01ard/temp" //публикуемый топик
#define DHT_hum_mqtt "Agata01ard/hum" //публикуемый топик
#define ir_mqtt "Agata01ard/ir" //публикуемый топик
#define RELAY_1 5 //Выход на реле #1
#define RELAY_2 14 //Выход на реле #2
#define DHTPIN 4 //Номер пина, к которому подсоединен датчик
#define DHTTYPE DHT22 // Задаём тип DHT датчика
int relay1_status = 0;
int relay2_status = 0;
int door_bell = 0;
int door_status = 0;
static char char_temp[10]; // Переменная для перевода из int в char
static char char_hum[10];
long last_relays = millis(); //функция времени в милисекундах
long last_DHT = millis(); //функция времени в милисекундах
long longpress = millis(); //функция времени в милисекундах
int button = 0;
int pressed_button = 0;
int old_button = 0;
DHT dht(DHTPIN, DHTTYPE);
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
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 callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
String strTopic = String(topic);
String strPayload = String((char*)payload);
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
if (strTopic == "Agata01ard/relay_1") {
if ((char)payload[0] == '1') {
digitalWrite(RELAY_1, false);
relay1_status = 1;
} else {
digitalWrite(RELAY_1, true);
relay1_status = 0;
}
}
if (strTopic == "Agata01ard/relay_2") {
if ((char)payload[0] == '1') {
digitalWrite(RELAY_2, false);
relay2_status = 1;
} else {
digitalWrite(RELAY_2, true);
relay2_status = 0;
}
}
if (strTopic == "Agata01ard/ir") {
if ((char)payload[0] == '000') {
Serial.println("IR command recived");
}
}
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Create a random client ID
String clientId = "Agata01ard";
clientId += String(random(0xffff), HEX);
// Attempt to connect
if (client.connect(clientId.c_str())) {
Serial.println("connected");
// Once connected, publish an announcement...
client.publish(relay1_mqtt, String(relay1_status).c_str());
client.publish(relay2_mqtt, String(relay2_status).c_str());
client.publish(DHT_temp_mqtt, char_temp); //отправляем в Брокер значения
client.publish(DHT_hum_mqtt, char_hum);
client.publish(ir_mqtt, "0");
// ... and resubscribe
client.subscribe(relay1_mqtt);
client.subscribe(relay2_mqtt);
client.subscribe(ir_mqtt);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void setup() {
dht.begin();
pinMode(RELAY_1, OUTPUT); //Выход на реле 1
digitalWrite(RELAY_1, true);
pinMode(RELAY_2, OUTPUT); //Выход на реле 2
digitalWrite(RELAY_2, true);
pinMode(A0, INPUT);
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
delay(100);
Serial.println(analogRead(A0));
if (millis() - last_relays > 2000) {
last_relays = millis();
Serial.print("Publish message: ");
Serial.println(String(relay1_status).c_str());
Serial.println(String(relay2_status).c_str());
client.publish(relay1_mqtt, String(relay1_status).c_str());
client.publish(relay2_mqtt, String(relay2_status).c_str());
}
if (millis() - last_DHT > 600000) //периодичность публикации топика
{
last_DHT = millis();
Serial.print("DHT data send: ");
client.publish(DHT_temp_mqtt, char_temp); //отправляем в Брокер значения
client.publish(DHT_hum_mqtt, char_hum);
}
readDHT();
processButtons();
}
void readDHT()
{
int h = dht.readHumidity(); // Переменная типа int для Влажности
int t = dht.readTemperature(); // Переменная типа int для Температуры
dtostrf(t, 3, 0, char_temp); // Перевод из int в char
dtostrf(h, 3, 0, char_hum);
if (isnan(t) || isnan(h)) // Проверка удачно ли прошло считывание с DHT22
{
Serial.println("Failed to read from DHT22"); // Не удалось прочитать DHT22
}
}
int readADC(int pin)
{
int i, sum, b, ADCval = 0;
sum = 0;
for (i = 0; i < 3; i++)
{
sum += analogRead(pin);
}
ADCval = sum / 3;
if (ADCval < 830) b = 0;
else if (ADCval > 989 && ADCval < 1000) b = 1; //Кнопка реле
else if (ADCval > 1020 && ADCval < 1030) b = 2; //дверной звонок
else if (ADCval > 900 && ADCval < 920) b = 3; //Дверь открыта
else if (ADCval > 820 && ADCval < 845) b = 4; //Дверь закрыта
else b = 0;
return b;
}
void processButtons() {
button = readADC(0);
if (button == 1) {
longpress = millis();
if (millis() - longpress >= 500)
{
button = 5;
}
}
if (old_button == button) {
old_button = button;
pressed_button = 0;
}
else {
old_button = button;
pressed_button = button;
}
if (pressed_button == 1) {
Serial.println("Button1");
if (relay1_status == 1)
{
digitalWrite(RELAY_1, true);
relay1_status = 0;
client.publish(relay1_mqtt, String(relay1_status).c_str());
} else {
digitalWrite(RELAY_1, false);
relay1_status = 1;
client.publish(relay1_mqtt, String(relay1_status).c_str());
}
}
if (pressed_button == 2)
{
door_bell = 1;
client.publish(doorbell_mqtt, String(door_bell).c_str());
door_bell = 0;
}
if (pressed_button == 3)
{
Serial.println("Door closed");
door_status = 0;
client.publish(doorstat_mqtt, String(door_status).c_str());
}
if (pressed_button == 4)
{
Serial.println("Door opened");
door_status = 1;
client.publish(doorstat_mqtt, String(door_status).c_str());
}
if (pressed_button == 5)
{
Serial.println("Long press button 1");
if (relay2_status == 1)
{
digitalWrite(RELAY_2, true);
relay2_status = 0;
client.publish(relay2_mqtt, String(relay2_status).c_str());
} else {
digitalWrite(RELAY_2, false);
relay2_status = 1;
client.publish(relay2_mqtt, String(relay2_status).c_str());
}
}
}