/*
https://github.com/sui77/rc-switch/
Lógica Portão Automático
Programa por Alfredo Soares Out 2022
RF de botões do comando
Botão A = 5338371
Botão B = 5338380
Botão C = 5338416
Botão D = 5338560
Botão A abre ou fecha as duas abas
Botão B abre ou fecha as duas abas com mais tempo
Botão C abre ou fecha aba da direita (visto de fora virado para o portão)
Botão D abre ou fecha aba da esquerda (visto de fora virado para o portão)
Variável estado (Aba Dir vista por fora virado para o portão)
A false; B false = estado 1 - Aba fechada e vai começar a abrir
A true; B false = estado 2 - Aba a abrir e vai parar
A false; B true= estado 3 - Aba a meio e vai começar a fechar
A true; B true = estado 4 - Aba a fechar e vai parar
Variável estado (Aba Esq vista por fora virado para o portão)
C false; D false = estado 1 - Aba fechada e vai começar a abrir
C true; D false = estado 2 - Aba a abrir e vai parar
C false; D true= estado 3 - Aba a meio e vai começar a fechar
C true; D true = estado 4 - Aba a fechar e vai parar
Pins input
3- input botão na caixa 1 = ao botão A
4- input botão na caixa 2= ao botão C
5- input botão na caixa 3= ao botão D
A0- input módulo novo Botão A
A1- input módulo novo Botão B
A2- input módulo novo Botão C
A5- input módulo novo Botão D
A3- input analogRead sensor Esq
A4- input analogRead sensor Dir
PINS OUTPUT
8- lâmpada acesa ou apagada
9-High abre aba dir(C) (10 tem de estar em Low)
10-High fecha aba dir(C) (9 tem de estar em Low)
11-High abre aba esq(D) (12 tem de estar em Low)
12-High fecha aba esq(D) (11 tem de estar em Low)
*/
//#include <RCSwitch.h> // Modulo RF Antigo
//RCSwitch mySwitch = RCSwitch();
bool estadoA = false;
bool estadoB = false;
bool estadoC = false;
bool estadoD = false;
bool FlagUpDir = 0;
bool FlagUpEsq = 0;
// variaveis para as duas abas ao mm tempo
unsigned long TimerAbaDir = 0; // (botão "C" 1ª aba a abrir)
unsigned long TimerAbaEsq = 0; // (botão "D" 2ª aba a abrir)
unsigned long TimerAbaDirFechar = 0;
unsigned long TimerAbaEsqFechar = 0;
unsigned long FlagDir = 0;
unsigned long FlagEsq = 0;
unsigned long FlagDirFechar = 0;
unsigned long FlagEsqFechar = 0;
int TempoAbaDirAbrir = 16000; // (tempo da 1ª aba a abrir ou aba do botão "C")botão A
int TempoAbaEsqAbrir = 15000; // (tempo da 2ª aba a abrir ou aba do botão "D") botão A
int TempoAbaEsqFechar = 10500; // botão A
int TempoAbaDirFechar = 14000; // botão A
int TempoAbaDirAbrirB = 19000; // (tempo da 1ª aba a abrir ou aba do botão "C")botão B
int TempoAbaEsqAbrirB = 18000; // (tempo da 2ª aba a abrir ou aba do botão "D")botão B
int TempoAbaEsqFecharB = 14000; // botão B
int TempoAbaDirFecharB = 17000; // botão B
// ============================
int ValSensorAbrirDir = 512; // valor medio do sensor
int ValSensorAbrirEsq = 512;
int ValSensorFecharDir = 512;
int ValSensorFecharEsq = 512;
// ============================
int n = 500; // delay para proteger o input de sinais repetidos
unsigned long TempoAnterior1 = 0; // variavel que actualiza no millis
void setup()
{
Serial.begin(9600);
Serial.println("Ready...");
// mySwitch.enableReceive(0); // Receiver on interrupt 0 => that is pin #2 MODULO ANTIGO
pinMode(3, INPUT_PULLUP); // Botão Manual A
pinMode(4, INPUT_PULLUP); // Botão Manual C
pinMode(5, INPUT_PULLUP); // Botão Manual D
//Modulo RF novo
pinMode(A0, INPUT); // Modulo Novo Botão A
pinMode(A1, INPUT); // Modulo Novo Botão B
pinMode(A2, INPUT); // Modulo Novo Botão C
pinMode(A5, INPUT); // Modulo Novo Botão D
//==========================================================
pinMode(A3, INPUT); // Sensor de Corrente Portao Dir (C)
pinMode(A4, INPUT); // Sensor de Corrente Portao Esq (D)
//==========================================================
pinMode(6, OUTPUT); // Fonte de Alimentação dos Portões (Reley Invertido)
pinMode(8, OUTPUT); // Lampada Sinalizadora
pinMode(9, OUTPUT); // Aba Dir (A para Abrir)
pinMode(10, OUTPUT); // Aba Dir (B para Fechar)
pinMode(11, OUTPUT); // Aba Esq (C para Abrir)
pinMode(12, OUTPUT); // Aba Esq (D para Fechar)
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH); // Reley invertido (em HIGH desliga)
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
delay (2000); // esperar 2seg com tudo desligado para dar tempo aos sensores de "resetarem"
}
void loop() {
//======================================= BOTÕES MANUAIS E MODULO NOVO ================================================================
// BOTÃO DO COMANDO "A" E 1º BOTAO MANUAL DA CAIXA
int sensorValA = digitalRead(A0); // BOTÃO DO COMANDO A
int sensorMValA = digitalRead(3); // 1º BOTAO MANUAL DA CAIXA
if ((sensorValA == HIGH) || (sensorMValA == LOW))
{
//============================================================================== 1 - PORTÃO FECHADO E VAI ABRIR ======================================================================================
FlagUpDir = 0;
FlagUpEsq = 0;
if ((estadoA == false) && (estadoB == false) && (estadoC == false) && (estadoD == false)) // 1 - PORTÃO FECHADO E VAI ABRIR
{
digitalWrite(9, HIGH);
digitalWrite(10, LOW);
Serial.println("ABA DIR FECHADA E VAI ABRIR");
check_lampada(); // liga
fonte_alimentacao(); // liga
delay(3000);
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
Serial.println("ABA ESQ FECHADA E VAI ABRIR");
estadoA = !estadoA;
estadoC = !estadoC;
TimerAbaDir = (millis() + TempoAbaDirAbrir);
TimerAbaEsq = (millis() + TempoAbaEsqAbrir);
FlagDir = 1;
FlagEsq = 1;
}
//============================================================================== 2 - PORTÃO ABERTO E VAI FECHAR ======================================================================================
else if ((estadoA == false) && (estadoB == true) && (estadoC == false) && (estadoD == true)) // 2 - PORTÃO ABERTO E VAI FECHAR
{
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
Serial.println("ABA ESQ ABERTA E VAI FECHAR");
check_lampada(); // liga
fonte_alimentacao(); // liga
delay(2000);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
Serial.println("ABA DIR ABERTA E VAI FECHAR");
TimerAbaEsqFechar = (millis() + TempoAbaEsqFechar);
TimerAbaDirFechar = (millis() + TempoAbaDirFechar);
FlagDirFechar = 1;
FlagEsqFechar = 1;
estadoC = !estadoC;
estadoA = !estadoA;
}
delay (n); // para receber só um input dos comandos
}
// ================================================================ BOTÃO DO COMANDO "B" ===========================================================================================
// BOTÃO DO COMANDO "B" (input A1)
int sensorValB = digitalRead(A1); // BOTÃO DO COMANDO "B"
if (sensorValB == HIGH)
{
//==================================================== 1 - PORTÃO FECHADO E VAI ABRIR (BOTÃO DO COMANDO "B") ==========================================================
FlagUpDir = 0;
FlagUpEsq = 0;
if ((estadoA == false) && (estadoB == false) && (estadoC == false) && (estadoD == false)) // 1 - PORTÃO FECHADO E VAI ABRIR
{
digitalWrite(9, HIGH);
digitalWrite(10, LOW);
Serial.println("ABA DIR FECHADA E VAI ABRIR");
check_lampada(); // liga
fonte_alimentacao(); // liga
delay(3000);
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
Serial.println("ABA ESQ FECHADA E VAI ABRIR");
estadoA = !estadoA;
estadoC = !estadoC;
TimerAbaDir = (millis() + TempoAbaDirAbrirB);
TimerAbaEsq = (millis() + TempoAbaEsqAbrirB);
FlagDir = 1;
FlagEsq = 1;
}
// ======================================================== 2 - PORTÃO ABERTO E VAI FECHAR (BOTÃO DO COMANDO "B")================================================================================
else if ((estadoA == false) && (estadoB == true) && (estadoC == false) && (estadoD == true)) // 2 - PORTÃO ABERTO E VAI FECHAR
{
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
Serial.println("ABA ESQ ABERTA E VAI FECHAR");
check_lampada(); // liga
fonte_alimentacao(); // liga
delay(2000);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
Serial.println("ABA DIR ABERTA E VAI FECHAR");
TimerAbaEsqFechar = (millis() + TempoAbaEsqFecharB);
TimerAbaDirFechar = (millis() + TempoAbaDirFecharB);
FlagDirFechar = 1;
FlagEsqFechar = 1;
estadoC = !estadoC;
estadoA = !estadoA;
}
delay (n); // para receber só um input dos comandos
}
// ===================================================== BOTÃO DO COMANDO "C" E 2ºBOTAO MANUAL DA CAIXA (ABA DIR) =======================================================================================
// BOTÃO DO COMANDO "C" E 2ºBOTAO MANUAL DA CAIXA
int sensorValC = digitalRead(A2); // BOTÃO DO COMANDO C
int sensorMValC = digitalRead(4); // 2ºBOTAO MANUAL DA CAIXA
if ((sensorValC == HIGH) || (sensorMValC == LOW))
{
//=========================================== 1 - ABA DIR FECHADA E VAI ABRIR (BOTÃO DO COMANDO "C" E 2ºBOTAO MANUAL DA CAIXA) ===========================================
TempoAnterior1 = millis();
// Serial.println(TempoAnterior1);
//========================================
if ((estadoA == false) && (estadoB == false)) // 1 - ABA DIR FECHADA E VAI ABRIR
{
digitalWrite(9, HIGH);
digitalWrite(10, LOW);
check_lampada();
fonte_alimentacao();
Serial.println("ABA DIR FECHADA E VAI ABRIR - 1");
delay(500);
estadoA = !estadoA;
FlagUpDir = 1 ;
}
//========================================
else if ((estadoA == true) && (estadoB == false)) // 2 - ABA DIR A ABRIR E VAI PARAR
{
digitalWrite(9, LOW);
digitalWrite(10, LOW);
Serial.println("ABA DIR A ABRIR E VAI PARAR - 2");
check_lampada();
fonte_alimentacao();
delay(500);
estadoA = !estadoA;
estadoB = !estadoB;
}
//========================================
else if ((estadoA == false) && (estadoB == true)) // 3 - ABA DIR A MEIO E VAI FECHAR
{
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
check_lampada();
fonte_alimentacao();
Serial.println("ABA DIR A MEIO E VAI FECHAR - 3");
delay(500);
estadoA = !estadoA;
FlagUpDir = 1 ;
}
//========================================
else if ((estadoA == true) && (estadoB == true)) // 4 - ABA DIR A FECHAR E VAI PARAR
{
digitalWrite(9, LOW);
digitalWrite(10, LOW);
Serial.println("ABA DIR A FECHAR E VAI PARAR - 4");
check_lampada();
fonte_alimentacao();
delay(500);
estadoA = !estadoA;
estadoB = !estadoB;
}
delay (n); // para receber só um input dos comandos
}
// ===================================================BOTÃO DO COMANDO "D" E 3ºBOTAO MANUAL DA CAIXA (ABA ESQ)=========================================================================================================
int sensorValD = digitalRead(A5); // BOTÃO DO COMANDO D
int sensorMValD = digitalRead(5); // 3º BOTAO MANUAL DA CAIXA
if ((sensorValD == HIGH) || (sensorMValD == LOW))
{
//========================================
TempoAnterior1 = millis();
// Serial.println(TempoAnterior1);
//========================================
if ((estadoC == false) && (estadoD == false)) // 1 - ABA ESQ FECHADA E VAI ABRIR
{
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
check_lampada();
fonte_alimentacao();
Serial.println("ABA ESQ FECHADA E VAI ABRIR - 1 ");
delay(500);
estadoC = !estadoC;
FlagUpEsq = 1 ;
}
//========================================
else if ((estadoC == true) && (estadoD == false)) // 2 - ABA ESQ A ABRIR E VAI PARAR
{
digitalWrite(11, LOW);
digitalWrite(12, LOW);
check_lampada();
fonte_alimentacao();
Serial.println("ABA ESQ A ABRIR E VAI PARAR - 2");
delay(500);
estadoC = !estadoC;
estadoD = !estadoD;
}
//========================================
else if ((estadoC == false) && (estadoD == true)) // 3 - ABA ESQ A MEIO E VAI FECHAR
{
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
check_lampada();
fonte_alimentacao();
Serial.println("ABA ESQ A MEIO E VAI FECHAR - 3 ");
delay(500);
estadoC = !estadoC;
FlagUpEsq = 1 ;
}
//========================================
else if ((estadoC == true) && (estadoD == true)) // 4 - ABA ESQ A FECHAR E VAI PARAR
{
digitalWrite(11, LOW);
digitalWrite(12, LOW);
check_lampada();
fonte_alimentacao();
Serial.println("ABA ESQ A FECHAR E VAI PARAR - 4");
delay(500);
estadoC = !estadoC;
estadoD = !estadoD;
}
delay (n); // para receber só um input dos comandos
}
// =================================== Check Contadores duas abas que estava a abrir e vai parar automatico ======================================================
if ((estadoA == true) && (estadoB == false) && (TimerAbaDir <= millis()) && (FlagDir == 1)) // 1 - CONTADOR PARA PARAR PORTÃO QUE ESTAVA FECHADO E ESTAVA A ABRIR
{
digitalWrite(9, LOW);
digitalWrite(10, LOW);
FlagDir = 0;
TimerAbaDir = 0;
estadoA = !estadoA;
estadoB = !estadoB;
}
if ((estadoC == true) && (estadoD == false) && (TimerAbaEsq <= millis()) && (FlagEsq == 1))
{ digitalWrite(11, LOW);
digitalWrite(12, LOW);
FlagEsq = 0;
TimerAbaEsq = 0;
estadoC = !estadoC;
estadoD = !estadoD;
check_lampada(); // neste caso apaga
}
// ============================================= Check Contadores duas abas que estava a fechar e vai parar automatico ==================================================
if ((estadoA == true) && (estadoB == true) && (TimerAbaDirFechar <= millis()) && (FlagDirFechar == 1)) // 2 - CONTADOR PARA PARAR PORTÃO QUE ESTAVA A FECHAR
{
digitalWrite(9, LOW);
digitalWrite(10, LOW);
FlagDirFechar = 0;
TimerAbaDirFechar = 0;
estadoA = !estadoA;
estadoB = !estadoB;
}
if ((estadoC == true) && (estadoD == true) && (TimerAbaEsqFechar <= millis()) && (FlagEsqFechar == 1))
{ digitalWrite(11, LOW);
digitalWrite(12, LOW);
FlagEsqFechar = 0;
TimerAbaEsqFechar = 0;
estadoC = !estadoC;
estadoD = !estadoD;
check_lampada();
}
check_lampada();
// ===================================================== FIM CHECK AOS CONTADORES DAS DUAS ABAS ===================================================================
// ===================================================== INICIO CHECK AOS CONTADORES ABAS INDIVIDUAS ================================================================
// Check lampada acessa + de 16 seg
if (digitalRead(8) == (HIGH) && (FlagUpDir == 1 || (FlagUpEsq == 1)))
{
if (millis() - TempoAnterior1 >= 16000) // 16000 É O TEMPO MAX QUE O PORTÃO VAI ESTAR A TRABALHAR
{
FlagUpDir = 0;
FlagUpEsq = 0;
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(8, LOW);
// digitalWrite(6, HIGH);
// ======== Inversores de estado para quando o timer desligar automatico no botao "C" e "D" ============
if ((estadoA == true) && (estadoB == false)) // 2 - ABA DIR A ABRIR E VAI PARAR
{
estadoA = !estadoA;
estadoB = !estadoB;
}
// ===========================
if ((estadoA == true) && (estadoB == true)) // 4 - ABA DIR A FECHAR E VAI PARAR
{
estadoA = !estadoA;
estadoB = !estadoB;
}
// ============================
if ((estadoC == true) && (estadoD == false)) // 2 - ABA ESQ A ABRIR E VAI PARAR
{
estadoC = !estadoC;
estadoD = !estadoD;
}
// ============================
if ((estadoC == true) && (estadoD == true)) // 4 - ABA ESQ A FECHAR E VAI PARAR
{
estadoC = !estadoC;
estadoD = !estadoD;
}
// ===================================================== FIM CHECK AOS CONTADORES ABAS INDIVIDUAS ================================================================
}
}
fonte_alimentacao(); // Confirma fonte liga ou desliga ou desliga
//========================= SENSORES DE EXCESSO DE FORÇA ===================================
if (((ValSensorAbrirDir >= 700) || (ValSensorAbrirDir <= 400)) && ((FlagDir ==1) || (FlagUpDir==1)))
{
Serial.println("Entrou ValSensorAbrirDir");
parar_aba_dir_c();
FlagDir = 0;
FlagUpDir = 0;
}
//================
if (((ValSensorAbrirEsq >= 700) || (ValSensorAbrirEsq <= 400)) && ((FlagEsq ==1) || (FlagUpEsq==1)))
{
Serial.println("Entrou ValSensorAbrirEsq ");
parar_aba_esq_d();
FlagEsq = 0;
FlagUpEsq = 0;
}
//=================
if (((ValSensorFecharDir >= 700) || (ValSensorFecharDir <= 400)) && ((FlagDirFechar ==1) || (FlagUpDir==1)))
{
Serial.println("Entrou ValSensorFecharDir ");
parar_aba_dir_c();
FlagDirFechar = 0;
FlagUpDir = 0;
}
//=================
if (((ValSensorFecharEsq >= 700) || (ValSensorFecharEsq <= 400)) && ((FlagEsqFechar ==1) || (FlagUpEsq==1)))
{
Serial.println("Entrou ValSensorFecharEsq ");
parar_aba_esq_d();
FlagEsqFechar = 0;
FlagUpEsq = 0;
}
//=======================================FIM SENSORES===========================
ValSensorAbrirEsq= analogRead (A3); // actualizar valores dos sensores
ValSensorAbrirDir= analogRead (A4);
ValSensorFecharEsq= analogRead (A3);
ValSensorFecharDir= analogRead (A4);
// Serial.println(ValSensorAbrirDir);
// Serial.println(ValSensorAbrirEsq);
} // void loop »»»»»»»»»»»»»»»»»»»»»»»»»»»»» FIM DO VOID LOOP ««««««««««««««««««««««««««««««««««««««
//**********************************Rotinas Criadas e Repetidas*******************************************
void check_lampada()
{
if ((digitalRead(9) == (HIGH)) || (digitalRead(10) == (HIGH)) || (digitalRead(11) == (HIGH)) || (digitalRead(12) == (HIGH)))
{
digitalWrite(8, HIGH);
// Serial.println("Lampada Acesa");
}
else
{
digitalWrite(8, LOW);
}
}
// *********************************************************************
void fonte_alimentacao()
{
if (digitalRead(8) == (HIGH)) // Ligar fonte de alimentação que alimenta os Portões
{
digitalWrite(6, LOW); // Liga a Fonte (Reley Invertido)
}
else
{
digitalWrite(6, HIGH); // Desliga a Fonte (Reley Invertido)
delay(200);
}
}
// *********************************************************************
void parar_aba_dir_c() // parar estado 2 ou 4
{
digitalWrite(9, LOW);
digitalWrite(10, LOW);
Serial.println("ABA DIR VAI PARAR - 2 ou 4");
check_lampada();
fonte_alimentacao();
delay(500);
estadoA = !estadoA;
estadoB = !estadoB;
}
// *********************************************************************
void parar_aba_esq_d() // parar estado 2 ou 4
{
digitalWrite(11, LOW);
digitalWrite(12, LOW);
Serial.println("ABA ESQ VAI PARAR - 2 ou 4");
check_lampada();
fonte_alimentacao();
delay(500);
estadoC = !estadoC;
estadoD = !estadoD;
}
// ********************************************************************