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

Спойлер
Спойлер
Код: Выделить всё
#include <stdio.h>
#include "lockFunctions.h"
//<a href="https://randomnerdtutorials.com/esp8266-pinout-reference-gpios/" rel="nofollow">https://randomnerdtutorials.com/esp8266-pinout-reference-gpios/</a>
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);
}


