При подключенном замке гардиан, посылаются лишние сигналы.

axelive
Offline
Зарегистрирован: 02.07.2019

Здравствуйте, недавно понадобилось подключить єм замок гардиан к системе ajax, и так как мои знания заканчиваются на лабораторных института 10 летней давности, то сам проект может выглядеть довольно странно, не правильно итд. Так как замок и целую коробку всякой всячины я уже купил ) то придется делать до конца и понимать по ходу. Проблема заключается в следующем:

У меня есть nodemcu v3 он собирает сигналы с ajax реле путем разрыва GND и контакта D1 через транзистор и на основе этого открывает или закрывает замок сменой полярности на проводах, через два пятиконтактных реле которые включаются через транзисторы, тк своего питания не хватит чтобы реле открылось. Вот все бы хорошо, и все вроде работает, но прочитав что для корректной работы замок должен посылать сигнал от 0,3-1с я понял что отправлял всего 50мс, и хотелось чтобы по правильному все было. Увеличив время до 300мс, замок стал открыватся и закрыватся пока не выключишь с ajax, а в логах я увидел что отрабатывает все тот же D1 вход с ajax, но сигнал никто не посылал... если отключить замок, а релюшки оставить то в логах все нормально.

Замок немного модернизировал добавил геркон, чтобы знать состояния и просто так сигналы не слать.

Вот схема(надеюсь я правильно ее составил с макета), а так же фото самого макета, ну и код.

Надеюсь на вашу помощ, тк сам я уже не понимаю... 

#include <stdio.h>
#include "lockFunctions.h"

//https://randomnerdtutorials.com/esp8266-pinout-reference-gpios/

int InputAjaxPin = D1;
int InputLockPin = D2;
int InputButtonPin = D4;

int OutputLockLedPin = D6;
int OutputCtrlLedPin = D3;
int OutputCtrlPinBlue = D7;
int OutputCtrlPinGreen = D8;

int InputAjaxDigitalValue;
int InputLockDigitalValue;
int InputButtonDigitalValue;

bool SignalAjaxDuplicatePreventFlag = true;
bool SignalButtonDuplicatePreventFlag = true;

bool ButtonToggle = false;
int FirstTimeFlag = true;

bool time_stop = false;
unsigned long time_cycle, time_temp = 0;

void setup() {
  // Initializing serial port for debugging purposes
  Serial.begin(115200);

  pinMode(OutputCtrlLedPin, OUTPUT); 
  pinMode(OutputCtrlPinBlue, OUTPUT); 
  pinMode(OutputCtrlPinGreen, OUTPUT);
  pinMode(OutputLockLedPin, OUTPUT);
  pinMode(InputAjaxPin, INPUT_PULLUP); 
  pinMode(InputLockPin, INPUT_PULLUP);  
  pinMode(InputButtonPin, INPUT_PULLUP); 
  Serial.println();
 
}

void loop() {
  InputAjaxDigitalValue = (digitalRead(InputAjaxPin) == 1) ? 0 : 1;
  InputButtonDigitalValue = (digitalRead(InputButtonPin) == 1) ? 0 : 1;
  InputLockDigitalValue = digitalRead(InputLockPin);

  //analogWrite(OutputCtrlPinGreen,0);
  //analogWrite(OutputCtrlPinBlue,0);

  if (FirstTimeFlag == true){
    FirstTimeFlag = false; 

    //if lock locked and ajax is locked
    if (InputLockDigitalValue == 1 && InputAjaxDigitalValue == 1){
      SignalAjaxDuplicatePreventFlag = true;
      analogWrite(OutputCtrlLedPin,1024);
      //DO nothing bc all locked
    }

    //if lock unlocked but ajax is locked 
    if (InputLockDigitalValue == 0 && InputAjaxDigitalValue == 1){
      SignalAjaxDuplicatePreventFlag = true;
      analogWrite(OutputCtrlLedPin,1024);
      //send singnal to lock 
      lock(OutputCtrlPinBlue, OutputCtrlPinGreen, time_cycle, time_stop);
    }

    //if lock unlocked and ajax is unlocked 
    if (InputLockDigitalValue == 0 && InputAjaxDigitalValue == 0){
      SignalAjaxDuplicatePreventFlag = false;
      analogWrite(OutputCtrlLedPin,0);
      //DO nothing bc all unlocked
    }

    //if lock locked and ajax is unlocked 
    if (InputLockDigitalValue == 1 && InputAjaxDigitalValue == 0){
      SignalAjaxDuplicatePreventFlag = false;
      analogWrite(OutputCtrlLedPin,0);
      //send singnal to unlock 
      unlock(OutputCtrlPinBlue, OutputCtrlPinGreen, time_cycle, time_stop);
    }

    Serial.print("FIRST RUN TIME, LOCK INIT STATE : ");
    Serial.print(InputLockDigitalValue);
    Serial.println();
    Serial.println("------------------");
    Serial.println();
  }
  else
  {
    time_temp = millis();

    //instead delay
    
    if (time_stop){
      if ((time_temp-time_cycle) >= 100){
          time_stop = false;
          analogWrite(OutputCtrlPinGreen,0);
          analogWrite(OutputCtrlPinBlue,0);
          Serial.println();
          Serial.print(time_temp-time_cycle);
          Serial.print("====");
          Serial.println(); 
      }  
    }
    
    
    //ON AJAX UNLOCK  
    if (InputAjaxDigitalValue == 0 && SignalAjaxDuplicatePreventFlag == true){
      SignalAjaxDuplicatePreventFlag = false;

      Serial.println();
      Serial.println("---------AJAX UNLOCK:---------");
      Serial.print(InputAjaxDigitalValue);
      Serial.println();
      
      //IF LOCK LOCKED 
      analogWrite(OutputCtrlLedPin,0);
      if (InputLockDigitalValue == 1){
        //send lock singnal to unlock it 
        unlock(OutputCtrlPinBlue, OutputCtrlPinGreen, time_cycle, time_stop);
      }
    }
  
    //ON AJAX LOCK  
    if (InputAjaxDigitalValue == 1 && SignalAjaxDuplicatePreventFlag == false){
      SignalAjaxDuplicatePreventFlag = true;

      Serial.println();
      Serial.println("---------AJAX LOCK:---------");
      Serial.print(InputAjaxDigitalValue);
      Serial.println();

      //IF LOCK UNLOCKED 
      analogWrite(OutputCtrlLedPin,1024);
      if (InputLockDigitalValue == 0){
        //send lock singnal to lock it 
        lock(OutputCtrlPinBlue, OutputCtrlPinGreen, time_cycle, time_stop);
      }
    }

    //ON BUTTON DOWN
    if (InputButtonDigitalValue == 1 && SignalButtonDuplicatePreventFlag == true){
      SignalButtonDuplicatePreventFlag = false;

      Serial.println();
      Serial.println("---------BUT---------");
      Serial.println();

      if (InputLockDigitalValue == 1){
        //send lock singnal to unlock it 
        unlock(OutputCtrlPinBlue, OutputCtrlPinGreen, time_cycle, time_stop);
      }else
      {
        lock(OutputCtrlPinBlue, OutputCtrlPinGreen, time_cycle, time_stop);
      }
    }
  
    //ON BUTTON UP  
    if (InputButtonDigitalValue == 0 && SignalButtonDuplicatePreventFlag == false){
      SignalButtonDuplicatePreventFlag = true;
    }
  }

  //IF LOCK LOCKED
  if (InputLockDigitalValue == 1){
    analogWrite(OutputLockLedPin,1024);
  }
  //IF LOCK UNLOCKED
  else
  { 
    analogWrite(OutputLockLedPin,0);
  }
}   

Функция лок в дргом файле

/*
  To unlock - blue - zero
  To lock - blue - +12v
*/
void lock(int OutputCtrlPinBlue, int OutputCtrlPinGreen, unsigned long &time_cycle, bool &time_stop) {
      
  analogWrite(OutputCtrlPinBlue,1024);
  analogWrite(OutputCtrlPinGreen,0);

  Serial.println();
  Serial.println("---------LOCK---------");
  Serial.println();

  time_cycle = millis();

  time_stop = true;

  //delay(300);

  //default ctrl signal 0 till ajax send signal
  //analogWrite(OutputCtrlPinBlue,0);
  //analogWrite(OutputCtrlPinGreen,0);
}

void unlock(int OutputCtrlPinBlue, int OutputCtrlPinGreen, unsigned long &time_cycle, bool &time_stop) {
  
  analogWrite(OutputCtrlPinBlue,0);
  analogWrite(OutputCtrlPinGreen,1024);

  Serial.println();
  Serial.println("---------UNLOCK---------");
  Serial.println();

  time_cycle = millis();

  time_stop = true;

  //delay(300);

  //default ctrl signal 0 till ajax send signal
  //analogWrite(OutputCtrlPinGreen,0);
  //analogWrite(OutputCtrlPinBlue,0);
}

 

axelive
Offline
Зарегистрирован: 02.07.2019

Поправил транзисторы на схеме

Поправил транзисторы на схеме