Помогите понять как включать реле
- Войдите на сайт для отправки комментариев
Ср, 13/03/2019 - 22:25
Здравствуйте, хочу чтоб датчик Ultrasonic включал и выключал реле( ну и отправлял состояние на брокер) только тогда когда на реле высокий уровень напряжения( реле инвертирована и высокий уровень, это выкл).
Вот такой код написал, но мне нужен чтоб он запускался только когда реле переключено на разомкнутое состояние.
float dist_cm = ultrasonic.Ranging(CM);
Serial.print(ultrasonic.Ranging(CM));
Serial.println("cm");
if (dist_cm < lastdist_cm) //якщо відстань менша за вказану (40 см)
{ //то включаємо світло
Status = false;
digitalWrite(RELAY_1, Status);
} else //якщо ні, то виключаємо
{
Status = true;
digitalWrite(RELAY_1, Status);
}
long now1 = millis(); // кожні 3 секунди
if (now1 - lastTop1 > 3000) {
lastTop1 = now1;
client.publish(relays_topic, String(Status).c_str()); // конвертую в рядковий тип і передаю на брокер значення стану реле
}
}
Пока не прочитаете вот эту тему и не вставите код как положено, никто его (код) смотреть не будет (ну, разве что, Вам сильно повезёт)
float dist_cm = ultrasonic.Ranging(CM); Serial.print(ultrasonic.Ranging(CM)); Serial.println("cm"); if (dist_cm < lastdist_cm) //якщо відстань менша за вказану (40 см) { //то включаємо світло Status = false; digitalWrite(RELAY_1, Status); } else //якщо ні, то виключаємо { Status = true; digitalWrite(RELAY_1, Status); } long now1 = millis(); // кожні 3 секунди if (now1 - lastTop1 > 3000) { lastTop1 = now1; client.publish(relays_topic, String(Status).c_str()); // конвертую в рядковий тип і передаю на брокер значення стану реле }Извиняюсь, пока неразобрался, что тут и как)
Дайте код целиком. Здесь куча переменных, которые неизвестно как описаны - очень трудно смотреть.
#include <ESP8266WiFi.h> #include <PubSubClient.h> #include <Wire.h> #include <SPI.h> #include <Ultrasonic.h> #include <Adafruit_BMP280.h> #include "Mail.h" #define BME_SCK SCK #define BME_MISO MISO #define BME_MOSI MOSI #define BME_CS D0 //SS #define BME_SCK 13 #define BME_MISO 12 #define BME_MOSI 11 #define BME_CS 10 #define RELAY_1 D5 //пін на реле #define relays_topic "ESP12/relay_1" //публікуєм топік #define relays_topic1 "ESP8266/ESP12/relay_1" int lastdist_cm = 40; //відстань до об'єкта long lastTop = 0; // початкове значення часу для відправки топіків на брокер long lastTop1 = 0; // початкове значення часу для відправки топіків на брокер boolean Status = true; // статус реле в 0 Ultrasonic ultrasonic(D7,D8); //піни дальнометра 12,echo 13,trig int rainPin = A0; // ініціалірогове значезація аналогового піна (для модуля затоплюваності) int thresholdValue = 500; // порогове значення затоплюваності String T1; //рядковий тип змінній Т1(передача по юарт з ардуіно) Adafruit_BMP280 bmp; // I2C const char* ssid = ""; const char* password = ""; const char* mqttServer = ""; const int mqttPort = ; const char* mqttUser = ""; const char* mqttPassword = ""; const char* const smtpHost[] = { "smtp.gmail.com" }; const uint16_t smtpPort = 465; const char* const smtpUser[] = { "" }; const char* const smtpPass[] = { "" }; const char* const mailTo = ""; const char* const mailSubject = "ТЕРМІНОВЕ ПОВІДОМЛЕННЯ"; WiFiClient espClient; PubSubClient client(espClient); inline void halt() { while (true) delay(1); } void setup() { pinMode(rainPin, INPUT); //ініціалізація аналогового піна на вхід pinMode(D3, OUTPUT); //ініціалізація 18го піна,тобто, D3 як вихід(буззер) pinMode(RELAY_1, OUTPUT); //Вихід на реле digitalWrite(RELAY_1, Status); //встановлюємо на виході статус реле Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.println("Connecting to WiFi.."); } Serial.println("Connected to the WiFi network"); client.setServer(mqttServer, mqttPort); client.setCallback(callback); while (!client.connected()) { Serial.println("Connecting to MQTT..."); if (client.connect("ESP8266Client", mqttUser, mqttPassword )) { Serial.println("connected"); } else { Serial.println("failed with state "); Serial.print(client.state()); delay(2000); } } client.subscribe(relays_topic); client.subscribe(relays_topic1); //перевірка роботи модуля температури та тиску Serial.println(); Serial.println(F("BMP280 test")); if (!bmp.begin()) { Serial.println("Could not find a valid BMP280 sensor, check wiring!"); while (true) delay(1); } } // зворотній звязок з брокером void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived in topic: "); Serial.println(topic); Serial.print("Message:"); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); //Serial.println("-----------------------"); // работаем с реле if (payload[0] == '0') digitalWrite(RELAY_1, LOW); else if (payload[0] == '1') digitalWrite(RELAY_1, HIGH); else if (payload[0] == '2') digitalWrite(RELAY_1, !digitalRead(RELAY_1)); } void loop() { client.loop(); // цикл підключення клієнта //блок роботи модуля виміру температури та тиску float Temperature = bmp.readTemperature(); // присвоєння змінній "Temperature" значення температури з модуля //client.publish("esp/Temperature", String(Temperature).c_str()); //конвертую в рядковий тип і відправляю топік з значенням температури на брокер Serial.print("Температура = "); Serial.print(bmp.readTemperature()); Serial.println(" *C"); float Pressure = bmp.readPressure()/ 133.33; //присвоєння змінній "Pressure" значення тиску з модуля //client.publish("esp/Pressure", String(Pressure).c_str()); //конвертую в рядковий тип і відправляю топік з значенням тиску на брокер Serial.print("Тиск = "); Serial.print(bmp.readPressure()/ 133.33); Serial.println(" nmHg"); //Serial.print("Approx altitude = "); //Serial.print(bme.readAltitude(1013.25)); //Serial.println(" m"); Serial.println(); delay(500); //блок роботи модуля рівня води та буззера int sensorValue = analogRead(rainPin); // зчитуємо вхідні данні з аналогового контакта А0 Serial.print(sensorValue); //client.publish("esp/sensorValue", String(sensorValue).c_str()); // конвертую в рядковий тип і передаю на брокер значення опору при затоплюваності модуля digitalWrite(D3,HIGH); // ініціалізація буззера на високий рівень напруги (інвертований вхід, буззер виключений) if(sensorValue < thresholdValue){ Serial.println(" - Мокро"); // " - Мокро" digitalWrite(D3,LOW); //якщо значення з А0 менше 500, то подаєм на пін 18(D3) високий рівень напруги і тим самим включаємо буззер(сигнал) delay(15); // затримка по часу. Задаєм частоту пищалки в мілісекундах. Чим більше число, тим нижче частота, а чим менше число, тим вище частота for (int8_t i = 0; i < 3; ++i) { Serial.println(); if (sendMail(smtpHost[i], smtpPort, smtpUser[i], smtpPass[i], mailTo, mailSubject, F("Тривога\r\nСталось протікання води\r\nТривога"))) { Serial.print(F("Mail sended through ")); Serial.println(smtpHost[i]); } else { Serial.print(F("Error sending mail through ")); Serial.print(smtpHost[i]); Serial.println('!'); } } } else { Serial.println(" - Сухо"); // " - Сухо" digitalWrite(D3,HIGH); //якщо значення з А0 ,більше 500, то подаєм на пін 18(D3) низький рівень напруги і тим самим виключаємо буззер(сигнал) } delay(500); // отримання даних по UART з ардуіно на esp8266 (передача значення рівня загазованості) if(Serial.available()){ String Var=""; while (!Serial.available()) delay(20); delay(1000); while (Serial.available()) Var = Var + (char)(Serial.read()); T1=Var.substring(Var.indexOf("T1")+2,Var.indexOf("1T")); //Serial.print(T1); Serial.print("Рівень загазованості "); } String gas = T1; // присвоюєм змінній "gas" значення яке прийшло нам з ардуіно, тобто "Т1" int gas1; // змінна для правильного порівняння в подальшому if gas1 = atoi(gas.c_str()); // переводимо значення String "gas" в значення int "gas1" // при заданих параметрах перевіряємо рівень загазованості та виводимо згідно умови оповіщення з звуковим сигналом if (gas1 > 70) { Serial.println(" - Тривога"); digitalWrite(D3,LOW); for (int8_t i = 0; i < 3; ++i) { Serial.println(); if (sendMail(smtpHost[i], smtpPort, smtpUser[i], smtpPass[i], mailTo, mailSubject, F("Тривога\r\nСтався витік газу\r\nТривога"))) { Serial.print(F("Mail sended through ")); Serial.println(smtpHost[i]); } else { Serial.print(F("Error sending mail through ")); Serial.print(smtpHost[i]); Serial.println('!'); } } } else { Serial.println(" - В межах норми "); digitalWrite(D3,HIGH); } //client.publish("esp/gas", String(gas1).c_str()); // конвертую в рядковий тип і передаю на брокер значення рівня загазованості //датчик відстані float dist_cm = ultrasonic.Ranging(CM); Serial.print(ultrasonic.Ranging(CM)); Serial.println("cm"); if (dist_cm < lastdist_cm) //якщо відстань менша за вказану (40 см) { //то включаємо світло Status = false; digitalWrite(RELAY_1, Status); } else //якщо ні, то виключаємо { Status = true; digitalWrite(RELAY_1, Status); } long now1 = millis(); // кожні 3 секунди if (now1 - lastTop1 > 3000) { lastTop1 = now1; client.publish(relays_topic, String(Status).c_str()); // конвертую в рядковий тип і передаю на брокер значення стану реле } } long now = millis(); // кожні 10 секунд if (now - lastTop > 10000) { lastTop = now; client.publish("esp/Temperature", String(Temperature).c_str()); //конвертую в рядковий тип і відправляю топік з значенням температури на брокер client.publish("esp/Pressure", String(Pressure).c_str()); //конвертую в рядковий тип і відправляю топік з значенням тиску на брокер client.publish("esp/sensorValue", String(sensorValue).c_str()); //конвертую в рядковий тип і передаю на брокер значення опору при затоплюваності модуля client.publish("esp/gas", String(gas1).c_str()); // конвертую в рядковий тип і передаю на брокер значення рівня загазованості } }Я только учуть) Потому неругайте за такой плохой код. Суть проблемы в чем. Я с клиента на телефоне выключаю и включаю реле. Мне надо чтоб когда реле выключено работал ультрасоник и включал релюху. Сейчас работает и вкл/выкл с телефона и одновременно ультрасоник. Тоесть я с телефона реле включил, а он как только пройдет цыкл выполнения программы выключаеться(так как работает условие, что если ультрасоник невидит препятствий, то выключает реле).
пароли уберите со скетча
Спасибо, убрал