Помогите понять как включать реле

Vlad T
Offline
Зарегистрирован: 13.03.2019

Здравствуйте, хочу чтоб датчик 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());                                           // конвертую в рядковий тип і передаю на брокер значення стану реле
    }
      }
ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Пока не прочитаете вот эту тему и не вставите код как положено, никто его (код) смотреть не будет (ну, разве что, Вам сильно повезёт)

Vlad T
Offline
Зарегистрирован: 13.03.2019
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());                                           // конвертую в рядковий тип і передаю на брокер значення стану реле
    }

 

Vlad T
Offline
Зарегистрирован: 13.03.2019

Извиняюсь, пока неразобрался, что тут и как)

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Дайте код целиком. Здесь куча переменных, которые неизвестно как описаны - очень трудно смотреть.

Vlad T
Offline
Зарегистрирован: 13.03.2019
#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());                                                // конвертую в рядковий тип і передаю на брокер значення рівня загазованості
}


}

 

Vlad T
Offline
Зарегистрирован: 13.03.2019

Я только учуть) Потому неругайте за такой плохой код. Суть проблемы в чем. Я с клиента на телефоне выключаю и включаю реле. Мне надо чтоб когда реле выключено работал ультрасоник и включал релюху. Сейчас работает и вкл/выкл с телефона и одновременно ультрасоник. Тоесть я с телефона реле включил, а он как только пройдет цыкл выполнения программы выключаеться(так как работает условие, что если ультрасоник невидит препятствий, то выключает реле).

sadman41
Онлайн
Зарегистрирован: 19.10.2016

пароли уберите со скетча

Vlad T
Offline
Зарегистрирован: 13.03.2019

Спасибо, убрал