#1 2020-02-15 13:01:43

Иван1988
Учасник
Зареєстрований: 2020-02-09
Повідомлень: 2

Подскажите новичку

Добры день! Есть скетч для устройства защиты от протечек. Кран хочу подключить через 4-Канальный Релейный Модуль. Но дело в том, что по скетчу при срабатывании на нужный пин (3-открытие и 12-закрытие) подается HIGH, а 4-Канальный Релейный Модуль работает наоборот - для его включения нужно подать LOW. Пробовал в счетче менять местами HIGH и LOW (при срабатывании подается LOW, в противном случае HIGH). Но не могу решить проблему - при первом включении одновременно срабатывает реле на открытие и закрытие. Я так понимаю, что при первом включении на оба пина подается LOW. Как сделать, чтобы при первом включении на оба пина (3 и 12) подавалось HIGH? Спасибо.

#define alarmLed 6 // индикатор "протечка/уборка"
#define openLed 4 // индикатор состояния "открыто"
#define closeLed 5 // индикатор состояния "закрыто"
#define openRele 3 // реле закрытия крана
#define closeRele 12 // реле открытия крана
#define openButton 10 // кнопка "Открыть" кран
#define closeButton 11 // кнопка "Закрыть" кран
#define resetButton 2 //  кнопка "Сброс/Уборка" 
#define leaksensor 8  // датчик протечки,при срабатывание на входе LOW

bool leakState = 0;  
bool lastleakState = 0;
bool openState=0;
bool lastopenState=0;
bool closeState=0;
bool lastcloseState=0;
bool resetState=0;
bool lastresetState=0;

boolean opS = 0;
boolean clS =0;
boolean leak=0;
boolean wait=0;

int ledStateLeak = LOW;
int ledStateWait = LOW;

boolean new_button_state1 = false;
boolean new_button_state2 = false;
boolean new_button_state3 = false;
boolean old_button_state1 = false;
boolean old_button_state2 = false;
boolean old_button_state3 = false;

unsigned long previousMillis = 0;
unsigned long previousMillisOpen = 0; 
unsigned long previousMillisClose = 0; 
unsigned long previousMillisWait = 0;
unsigned long previousMillisWaitLed = 0;
unsigned long intervalLeak =500;
unsigned long intervalWaitLed =3000; 
unsigned long intervalRele =4000;
unsigned long intervalWait=3600000;

void setup() {
  pinMode(alarmLed,OUTPUT);
  pinMode(openLed,OUTPUT);
  pinMode(closeLed,OUTPUT);
  pinMode(openRele,OUTPUT);
  pinMode(closeRele,OUTPUT);
  pinMode(openButton, INPUT);
  pinMode(closeButton, INPUT);
  pinMode(resetButton, INPUT);
  pinMode(leaksensor, INPUT);
  Serial.begin(9600);
}

void loop(){
  //**************Анализ состояния входов ***************************
  leakState=digitalRead(leaksensor);
  leakState=!leakState;
  if (leakState != lastleakState) {
    if ((leakState == HIGH)&&(wait==0)) {
      leak=1;                              // если сработал датчик протечки устанавливаем статус "протечка"
      Serial.println("LEAK");
    }
    lastleakState = leakState;
  }
  if  (leak==1){
    clS=1;
    opS=0;
  } 
  openState = digitalRead(openButton);
  if (openState != lastopenState) {
    if ((openState == HIGH)&&(leak==0)) {
      opS=1;                              // если нажата кнопка "открыть" устанавливаем статус "открыто"
      clS=0;
      Serial.println("OPEN");
    }
    lastopenState = openState; 
  }
  closeState = digitalRead(closeButton);
  if (closeState != lastcloseState) {
    if ((closeState == HIGH) ||(leak==1)) {
      opS=0;
      clS=1;                              // если нажата кнопка "закрыть" или статус "протечка" устанавливаем статус "закрыть"
      Serial.println("CLOSE");
    }
    lastcloseState = closeState; 
  }
  resetState = digitalRead(resetButton);
  if (resetState != lastresetState) {
    if (resetState == HIGH) {
      leak=0;                              // если нажата кнопка "сброс/уборка" сбрасываем статус "протечка" и  устанавливаем статус "уборка" и блокируем датчик протечки 
      wait=1;
      previousMillisWait = millis();
      Serial.println("RESET");
      Serial.println("WAIT");
    }
    lastresetState = resetState;
  }
  if((previousMillisWait>0) && (millis()-previousMillisWait >= intervalWait)) 
  {

    wait=0;                                // если прошло 60 минут убираем статус "уборка" и разблокируем датчик протечки
    previousMillisWait = 0;
    Serial.println("END WAIT");

  }
  //*************** Управление реле закрытия кранов**************************

  new_button_state1 = opS;
  if ( (new_button_state1 != old_button_state1) && new_button_state1 ) 
  {
    digitalWrite(openRele, HIGH);           //  если установлен статус "открыто" включаем реле открытия кранов на 4 секунды
    previousMillisOpen = millis();
  }
  old_button_state1 = new_button_state1; // сохраняем изменения
  if((previousMillisOpen>0) && (millis()-previousMillisOpen >= intervalRele)) 
  {
    digitalWrite(openRele, LOW);
    previousMillisOpen = 0;
  }
  new_button_state2 = clS;
  if ( (new_button_state2 != old_button_state2) && new_button_state2 ) 
  {
    digitalWrite(closeRele, HIGH);           //  если установлен статус "закрыто" включаем реле закрытия кранов на 4 секунды
    previousMillisClose = millis();
  }
  old_button_state2 = new_button_state2; // сохраняем изменения
  if((previousMillisClose>0) && (millis()-previousMillisClose >= intervalRele)) 
  {
    digitalWrite(closeRele, LOW);
    previousMillisClose = 0;
  }
  //*************** управление светодиодами индикации состояния ***************** 
  if (opS==1){
    digitalWrite(openLed, HIGH);     // если установлен статус "открыто" включаем индикатор состояния "открыто" 
  }
  else {
    digitalWrite(openLed, LOW);     //иначе выключаем
  }
  if (clS==1){
    digitalWrite(closeLed, HIGH);     // если установлен статус "закрыто" включаем индикатор состояния "закрыто" 
  }
  else {
    digitalWrite(closeLed, LOW);     //иначе выключаем
  }

  if ((leak==1)&&(wait==0)){         
    digitalWrite(alarmLed, ledStateLeak); // если "протечка" ,то моргаем индикатор "протечка/уборка" с интервалом  равным  intervalLeak
  }
  if ((leak==0)&&(wait==1)){
    digitalWrite(alarmLed, ledStateWait); // если "уборка" ,то моргаем индикатор "протечка/уборка" с интервалом  равным  intervalWaitLed
  }
   if ((leak==0)&&(wait==0)){
    digitalWrite(alarmLed, LOW);   // иначе выключаем
  }  
  //********** управление бузером ********
  if ( leak==1)  // если "протечка" включаем бузер
  { 
    tone(9, 600, 150);
    delay(300);
  }  
  //********* задание частоты мигания светодиода *******
  unsigned long currentMillis = millis();              // частота моргания для режима "протечка"
  if(currentMillis - previousMillis > intervalLeak) {
    previousMillis = currentMillis;   
    if (ledStateLeak == LOW)
      ledStateLeak = HIGH;
    else
      ledStateLeak = LOW;
  }
  unsigned long  currentMillisWaitLed = millis();      // частота моргания для режима "уборка"
  if(currentMillisWaitLed - previousMillisWaitLed> intervalWaitLed) {
    previousMillisWaitLed = currentMillisWaitLed;   
    if (ledStateWait == LOW)
      ledStateWait = HIGH;
    else
      ledStateWait = LOW;
  }
}

Неактивний

#2 2020-02-15 13:13:12

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 411

Re: Подскажите новичку

1. Пины притянуть резисторами "куда надо".
2. Перед тем, как переключать пин в OUTUP, записать в него то, что в нём должно быть (HIGH, например).

Неактивний

#3 2020-02-15 13:36:45

Иван1988
Учасник
Зареєстрований: 2020-02-09
Повідомлень: 2

Re: Подскажите новичку

Kaka пише:

1. Пины притянуть резисторами "куда надо".
2. Перед тем, как переключать пин в OUTUP, записать в него то, что в нём должно быть (HIGH, например).

Не совсем понял по второму пункту. Скажите конкретнее, куда и что вписать.

Неактивний

#4 2020-02-15 19:26:49

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 411

Re: Подскажите новичку

Вы в сетапе переводите пин в UOTPUT? Вот перед этим действием, пропишите туда HIGH, если Вам там HIGH нужен.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму