всем привет, есть задача, по датчику HC-SR04 включать и выключать свет в туалете, и хочется оставить функцию кнопки при этом, иресть если кто то сидит в туалете то свет горит, и если нажать на кнопку то свет выключится, если еще нажать то включится, в общем обе функции чтоб инвертировали состояние света и при этом не мешали друг другу, я застрял на том что когда я использую датчик HC-SR04 то он если кто то есть на его пути свет держит включенным а если нет то выключеным, он постоянно выполняет условие и делает посстоянно так как прописано при соблюдении или не соблюдении условия, а при нажатии на кнопку при этом отрабатывается код кнопки свет моргает на долю секунды и возвращается в состоянии которое диктует датчик HC-SR04
в общем вот скетч, функция датчика это void ultrasonic1() а кнопки void button() помогите подружить их или объединить, заранее спасибо
PS Скетч комментировал для себя чтоб не забыть что для чего, это вообще мой первый опять со скетчами)))
в общем вот скетч, функция датчика это void ultrasonic1() а кнопки void button() помогите подружить их или объединить, заранее спасибо
Код:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Ultrasonic.h>
Ultrasonic ultrasonic(13,12);
const char* ssid = "Rostelecom_Inactivated"; //Название сети
const char* password = "*********"; //пароль
const char* mqtt_server = "192.168.1.10"; //ip брокера mqtt
#define RELAY_1 2 //Выход на реле или светодиод
#define BUTTON_1 4 //Кнопка
#define relays_topic "relay/relay_1" //публикуемый топик
WiFiClient espClient; //инициализация WiFi клиента
PubSubClient client(espClient); //инициализация MQTT клиента
long last_mls = millis(); //функция времени в милисекундах
long last_mls2 = millis();
boolean Status = false; //объявляем статус реле в 0
boolean btnPress = false; //объявляем что кнопка не нажата 0
boolean lastbtnStat = false; //объявляем что статус кнопки 0
char msg[50];
void setup() //Выполняется при запуске 1 раз
{
pinMode(RELAY_1, OUTPUT); //Выход на реле или светодиод
pinMode(BUTTON_1, INPUT); //Кнопка
digitalWrite(RELAY_1, Status); //устанавливаем на выходе статус реле
Serial.begin(115200); //инициализация монитора порта
client.setServer(mqtt_server, 1883); //подключаемся к MQTT
client.setCallback(callback); //нужно для вывода в монитор порта что произожло переключение
delay(100); //ждем 100 милисекунд
WiFi.begin(ssid, password); //подключаемся к WiFi
delay(6000); //ждем 6 секунд
client.connect("ESP8266Client"); //конектимся с брокером
client.subscribe(relays_topic); //подписываемся на топик
}
void reconnect_server() //Выполняется каждые 5 секунд
{
if (WiFi.status() != WL_CONNECTED) //если нет подключения с сети
{
WiFi.begin(ssid, password);
Serial.println("");
Serial.println("WiFi connect..."); //выводим в монитор порта что пытаемся подключиться
} else //если есть подключение
{
Serial.println("");
Serial.println("WiFi connected"); //выводим в монитор порта что подключились
Serial.println("IP address: "); //выводим в монитор порта наш IP
Serial.println(WiFi.localIP()); //выводим в монитор порта наш IP
Serial.println(WiFi.RSSI()); //выводим в монитор порта уровень сети
}
if (!client.connected() && WiFi.status() == WL_CONNECTED) //если к сети подключились но к MQTT нет
{
if (client.connect("ESP8266Client")) //если с брокером уже конектились
{
Serial.println("Mosquitto connect...");//выводим в монитор порта что пытаемся подключиться
client.subscribe(relays_topic); //подписываемся на топик
} else //если не получилось
{
Serial.print("failed connect Mosquitto, rc="); //пишем ошибку
Serial.print(client.state());
Serial.println("");
}
}
}
void callback(char* topic, byte* payload, unsigned int length) //функция вывода в монитор порта что произощло переключение
{
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++)
{
Serial.print((char)payload[i]);
}
Serial.println();
if ((char)payload[0] == '1')
{
Status = true;
digitalWrite(RELAY_1, Status);
} else {
Status = false;
digitalWrite(RELAY_1, Status);
}
}
void button() //функция кнопки
{
btnPress = digitalRead(BUTTON_1);
if (btnPress && !lastbtnStat)
{
delay(30);
btnPress = digitalRead(BUTTON_1);
if (btnPress)
{
Status = !Status;
digitalWrite(RELAY_1, Status);
client.publish(relays_topic, String(Status).c_str()); // публикуем изменение
}
}
lastbtnStat = btnPress;
}
void ultrasonic1() //функция датчика
{
float dist_cm = ultrasonic.Ranging(CM);
Serial.print(ultrasonic.Ranging(CM));
Serial.println("cm");
if (dist_cm < 110)
{
Status = true;
digitalWrite(RELAY_1, Status);
client.publish(relays_topic, String(Status).c_str());
} else
{
Status = false;
digitalWrite(RELAY_1, Status);
client.publish(relays_topic, String(Status).c_str());
}
}
void loop() //основной цикл, выполняется посстоянно
{
client.loop();
if (millis() - last_mls > 5000) //периодичность проверки переподключения
{
last_mls = millis();
reconnect_server();
}
if (millis() - last_mls2 > 500) //расстояние
{
last_mls2 = millis();
ultrasonic1();
}
button(); //функция кнопки и публикации на брокер состояния
}
PS Скетч комментировал для себя чтоб не забыть что для чего, это вообще мой первый опять со скетчами)))