Automatizar porta(dois módulos) e iluminação

Bom dia!
Estou precisando automatizar a iluminação e a porta do galinheiro.
Gostaria que funcionasse, sendo que a porta abre às 12hs e fecha às 19hs.
A luz ligaria às 18hs e desligaria às 22hs.
Essa programação(sketch) eu já tenho e funciona perfeitamente.
Ocorre que preciso incluir na automação da porta, um controle remoto para adentrar ao galinheiro em casos de emergência. Já tenho esse código também(separado), mas quando vou juntar os dois, nada funciona.
Vocês podem ajudar-me??
Fico agradecido

Eis o código para a porta e iluminação que tenho, funcionando

#include <DS3231.h>


const int HoraAbre    = 12;
const int MinutoAbre  = 0;
const int HoraFecha   = 19;
const int MinutoFecha = 0;
const int PinoRele      = 2;
const int HoraLiga      = 18;
const int MinutoLiga    = 0;
const int HoraDesliga   = 22;
const int MinutoDesliga = 0;

#define Motor1 9
#define Motor2 10
#define cimaFC 7
#define baixoFC 6
#define min min

RTClib myRTC;
DateTime now;

bool toldo = false;
byte hora = 0;          // Hora atual
byte minuto = 0;        // Minuto atual

void setup() {
  Serial.begin(115200);
  pinMode(Motor1, OUTPUT);
  pinMode(Motor2, OUTPUT);
  pinMode(cimaFC, INPUT_PULLUP);
  pinMode(baixoFC, INPUT_PULLUP);
  pinMode(PinoRele, OUTPUT);
  digitalWrite(PinoRele,HIGH);
  //myTimeSet();
  //myTimeNow();

}

void loop() {
 now = myRTC.now();
  hora = now.hour();
  minuto = now.minute();
  // Imprime somente para debug
  Serial.print(hora); 
  Serial.print(" : "); 
  Serial.print(minuto);
  Serial.println(" : ");
  
  if (hora == HoraFecha && minuto == MinutoFecha) {   // Fecha toldo
    toldo = false;                          // Fecha toldo
  }
  if (hora == HoraAbre && minuto == MinutoAbre) {    // Abre toldo
    (toldo = true);
    }
  if (hora == HoraLiga && minuto == MinutoLiga) {   // Liga luz
    digitalWrite(PinoRele, LOW);          
  }
  if (hora == HoraDesliga && minuto == MinutoDesliga) {  // Desliga Luz
    digitalWrite(PinoRele, HIGH);
   }
  
  
  if (toldo == false) {                     // Fecha toldo
    if (digitalRead(cimaFC) == HIGH) {      // Motor n fechou
      digitalWrite(Motor1, HIGH);           // fechando
      digitalWrite(Motor2, LOW);            // fechando
    }
    else {
      digitalWrite(Motor1, LOW);            // parado
      digitalWrite(Motor2, LOW);            // parado
    }
  }

  if (toldo == true) {                      // Abre toldo
    if (digitalRead(baixoFC) == HIGH) {     // Motor n abriu
      digitalWrite(Motor1, LOW);            // abrindo
      digitalWrite(Motor2, HIGH);           // abrindo
    }
    else {
      digitalWrite(Motor1, LOW);            // parado
      digitalWrite(Motor2, LOW);            // parado
    }
  }
  delay(500);

}
//-----------------------------------------------------------------------------
void myTimeSet() {
  DS3231 myRTC;
  myRTC.setClockMode(false);  // set to 24h
  myRTC.setYear(23);
  myRTC.setMonth(12);
  myRTC.setDate(3);
  myRTC.setHour(7);
  myRTC.setMinute(20);
  myRTC.setSecond(28);
}
//-----------------------------------------------------------------------------
void myTimeNow() {
  now = myRTC.now();
  Serial.print(now.year(), DEC);    Serial.print('/');
  Serial.print(now.month(), DEC);   Serial.print('/');
  Serial.print(now.day(), DEC);     Serial.print(' ');
  Serial.print(now.hour(), DEC);    Serial.print(':');
  Serial.print(now.minute(), DEC);  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();
}

E esse é o código do controle remoto, que separadamente também funciona

#include <IRremote.h>
#include <IRremoteInt.h>
#include <boarddefs.h>
#include <ir_Lego_PF_BitStreamEncoder.h>


int pinoReceptorIR = 11;
int valorRecebido;
int pinMotor3 = 9;
int pinMotor4 = 10;

// Definindo o código de cada ação que deverá ser realizada
int cima = 0xFF18E7;
int baixo = 0xFF4AB5;
int ok = 0xFF38C7;


IRrecv irrecv(pinoReceptorIR);
decode_results results;

void setup()
{
pinMode(pinMotor3, OUTPUT); // Definindo os pinos do motor como saida
pinMode(pinMotor4, OUTPUT);

Serial.begin(9600); // Iniciando o Monitor Serial da IDE
irrecv.enableIRIn(); // Inicializa o receptor IR do controle remoto
}

void loop()
{
if (irrecv.decode(&results)) // Executa caso receba algum códico
{
Serial.print("Valor lido : ");
Serial.println(results.value, HEX);
valorRecebido = (results.value);

if (valorRecebido == cima) //Verifica se a tecla cima foi acionada
{
digitalWrite(pinMotor3, HIGH); //
digitalWrite(pinMotor4, LOW);
}
if (valorRecebido == baixo) //Verifica se a tecla baixo foi acionada
{
digitalWrite(pinMotor3, LOW); //
digitalWrite(pinMotor4, HIGH);
}
if (valorRecebido == ok) //Verifica se a tecla ok foi acionada
{
digitalWrite(pinMotor3, LOW); //
digitalWrite(pinMotor4, LOW);
}

irrecv.resume(); //Le o valor da próxima tecla pressionada
}
}

Olá!

Mostre sua versão combinada dos códigos para podermos avaliar se existem erros.

Att.

Olá @dhun, alguns comentários:
No código da porta vejo que você definiu uma função para definir o tempo RTC chamando-a do setup:

 //myTimeSet();

Suponho que alterar os valores da função e comentar ou descomentar a linha é a forma como se define a hora do DS3231. Altere-o para:

// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

Funciona da mesma forma, mas utiliza os valores de data e hora no momento da compilação, o que é mais fácil.

Quanto ao código do controle remoto, você está carregando bibliotecas desnecessárias, basta apenas o "IRremote.h", elimine os demais.
Você diz que funciona, mas comigo não funciona, só retorna o código de repetição, (0xFFFFFFFF).​
Isso porque você tem uma biblioteca obsoleta que não receberá manutenção e um dia vai te dar problemas com uma biblioteca dependente que está atualizada.​
Recomendo que, com o gestor de bibliotecas do IDE, actualize para a versão mais recente e veja os novos exemplos, porque já não é utilizado dessa forma.
Com a biblioteca actualizada, o seu código não terá problemas, verifiquei-o e funciona:

#include <IRremote.h>

int pinoReceptorIR = 11;
int valorRecebido;
int pinMotor3 = 9;
int pinMotor4 = 10;

// Definindo o código de cada ação que deverá ser realizado
// Acho que concordamos com o controle remoto, senão o monitor serial lhe dará os corretos.
int cima = 70;
int baixo = 21;
int ok = 64;

void setup()
{
  pinMode(pinMotor3, OUTPUT); // Definindo os pinos do motor como saida
  pinMode(pinMotor4, OUTPUT);

  Serial.begin(9600); // Iniciando o Monitor Serial da IDE
  IrReceiver.begin(pinoReceptorIR, ENABLE_LED_FEEDBACK);
}

void loop()
{
  if (IrReceiver.decode()) // Executa caso receba algum códico
  {
    valorRecebido = (IrReceiver.decodedIRData.command);
    Serial.print("Valor lido : ");
    Serial.println(valorRecebido);


    if (valorRecebido == cima) //Verifica se a tecla cima foi acionada
    {
      digitalWrite(pinMotor3, HIGH); //
      digitalWrite(pinMotor4, LOW);
      Serial.println("cima");
    }

    if (valorRecebido == baixo) //Verifica se a tecla baixo foi acionada
    {
      digitalWrite(pinMotor3, LOW); //
      digitalWrite(pinMotor4, HIGH);
      Serial.println("baixo");
    }

    if (valorRecebido == ok) //Verifica se a tecla ok foi acionada
    {
      digitalWrite(pinMotor3, LOW); //
      digitalWrite(pinMotor4, LOW);
      Serial.println("OK");
    }

    IrReceiver.resume(); //Le o valor da próxima tecla pressionada
  }
}

Agora tente juntar os dois códigos e conte-nos.

Bom dia...

#include <DS3231.h>

#include <IRremote.h>


const int HoraAbre    = 9; //horário definido aqui somente para teste
const int MinutoAbre  = 46; //horário definido aqui somente para teste
const int HoraFecha   = 9; //horário definido aqui somente para teste
const int MinutoFecha = 48; //horário definido aqui somente para teste
const int PinoRele      = 2;
const int HoraLiga      = 9; //horário definido aqui somente para teste
const int MinutoLiga    = 47; //horário definido aqui somente para teste
const int HoraDesliga   = 9; //horário definido aqui somente para teste
const int MinutoDesliga = 49; //horário definido aqui somente para teste
int pinoReceptorIR = 11;
int valorRecebido;
#define pinMotor1 9
#define pinMotor2 10
#define cimaFC 7
#define baixoFC 6
#define min min

// Definindo o código de cada ação que deverá ser realizada
int cima = 0xFF18E7;
int baixo = 0xFF4AB5;
int ok = 0xFF38C7;


IRrecv irrecv(pinoReceptorIR);
decode_results results;

RTClib myRTC;
DateTime now;

bool toldo = false;
byte hora = 0;          // Hora atual
byte minuto = 0; 

void setup()
{
pinMode(pinMotor1, OUTPUT); // Definindo os pinos do motor como saida
pinMode(pinMotor2, OUTPUT);
pinMode(cimaFC, INPUT_PULLUP);
pinMode(baixoFC, INPUT_PULLUP);
pinMode(PinoRele, OUTPUT);
digitalWrite(PinoRele,HIGH);

Serial.begin(115200); // Iniciando o Monitor Serial da IDE
irrecv.enableIRIn(); // Inicializa o receptor IR do controle remoto
}

void loop(){



now = myRTC.now();
hora = now.hour();
minuto = now.minute();
if (irrecv.decode(&results)) // Executa caso receba algum códico
{
  // Imprime somente para debug
Serial.print(hora); 
Serial.print(" : "); 
Serial.print(minuto);
Serial.print(" : ");
Serial.print("Valor lido : ");
Serial.println(results.value, HEX);
valorRecebido = (results.value);

if (hora == HoraFecha && minuto == MinutoFecha)
   if (valorRecebido == cima)
 {   
    toldo = false;   // Fecha toldo
  }
  if (hora == HoraAbre && minuto == MinutoAbre) 
    if (valorRecebido == baixo)
  {   
    (toldo = true);   // Abre toldo           
  }
  if (hora == HoraLiga && minuto == MinutoLiga) {   // Liga luz
    digitalWrite(PinoRele, LOW);          
  }
  if (hora == HoraDesliga && minuto == MinutoDesliga) {  // Desliga Luz
    digitalWrite(PinoRele, HIGH);
   }
  


irrecv.resume(); //Le o valor da próxima tecla pressionada
}
  
  if (toldo == false) {                     // Fecha toldo
    if (digitalRead(cimaFC) == HIGH) {      // Motor n fechou
      digitalWrite(pinMotor1, HIGH);           // fechando
      digitalWrite(pinMotor2, LOW);            // fechando
    }
    else {
      digitalWrite(pinMotor1, LOW);            // parado
      digitalWrite(pinMotor2, LOW);            // parado
    }
  }

  if (toldo == true) {                      // Abre toldo
    if (digitalRead(baixoFC) == HIGH) {     // Motor n abriu
      digitalWrite(pinMotor1, LOW);            // abrindo
      digitalWrite(pinMotor2, HIGH);           // abrindo
    }
    else {
      digitalWrite(pinMotor1, LOW);            // parado
      digitalWrite(pinMotor2, LOW);            // parado
    }
  }
  delay(500);
}




void myTimeSet() {
  DS3231 myRTC;
  myRTC.setClockMode(false);  // set to 24h
  myRTC.setYear(23);
  myRTC.setMonth(12);
  myRTC.setDate(3);
  myRTC.setHour(7);
  myRTC.setMinute(20);
  myRTC.setSecond(28);
}
//-----------------------------------------------------------------------------
void myTimeNow() {
  now = myRTC.now();
  Serial.print(now.year(), DEC);    Serial.print('/');
  Serial.print(now.month(), DEC);   Serial.print('/');
  Serial.print(now.day(), DEC);     Serial.print(' ');
  Serial.print(now.hour(), DEC);    Serial.print(':');
  Serial.print(now.minute(), DEC);  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();
}

Opa
Bom dia
Obrigado pela atenção...
Vou tentar juntar os dois aqui

Grato

Eu de novo...tentei juntar os dois códigos aqui, com as alterações sugeridas, mas ainda não funcionou...os códigos separados funcionam perfeitamente, mas quando junto os dois , apenas alguns comandos funcionam, ou nenhum deles...
Vou continuar tentando aqui...

Vejo pela tentativa de ligação acima que o tempo prevalece sobre a leitura do controlo remoto.

 if (hora == HoraFecha && minuto == MinutoFecha)
      if (valorRecebido == cima)
      {
        toldo = false;   // Fecha toldo
      }

Desta forma, só se lê o telecomando quando o tempo de abertura é atingido, quando se deveria ler sempre. Algo do género:

 if ( (hora == HoraFecha && minuto == MinutoFecha) || (valorRecebido == cima))      
        toldo = false;   // Fecha toldo
      }

Teste-o.

Bom dia
Testei aqui, mas ainda não funcionou...observo que no monitor serial só imprime quando alguma tecla do comando é acionada(obedecendo a IRremote(mesmo assim com falhas)), o que penso que deveria imprimir o horário a cada segundo(obedecendo também a DS3231)...
...vamos continuar tentando...
Grato

Carregue o código que você possui.

Boa tarde...

#include <IRremote.hpp>

#include <DS3231.h>


const int HoraAbre    = 17; //horário definido aqui somente para teste
const int MinutoAbre  = 13; //horário definido aqui somente para teste
const int HoraFecha   = 17; //horário definido aqui somente para teste
const int MinutoFecha = 15; //horário definido aqui somente para teste
const int PinoRele      = 2;
const int HoraLiga      = 17; //horário definido aqui somente para teste
const int MinutoLiga    = 15; //horário definido aqui somente para teste
const int HoraDesliga   = 17; //horário definido aqui somente para teste
const int MinutoDesliga = 17; //horário definido aqui somente para teste
int pinoReceptorIR = 11;
int valorRecebido;

#define pinMotor1 9
#define pinMotor2 10
#define cimaFC 7
#define baixoFC 6
#define min min

// Definindo o código de cada ação que deverá ser realizada
int cima = 24;
int baixo = 82;

IRrecv irrecv(pinoReceptorIR);
//decode_results results;

RTClib myRTC;
DateTime now;

bool toldo = false;
byte hora = 0;          // Hora atual
byte minuto = 0; 

void setup()
{
pinMode(pinMotor1, OUTPUT); // Definindo os pinos do motor como saida
pinMode(pinMotor2, OUTPUT);
pinMode(cimaFC, INPUT_PULLUP);
pinMode(baixoFC, INPUT_PULLUP);
pinMode(PinoRele, OUTPUT);
digitalWrite(PinoRele,HIGH);


Serial.begin(115200); // Iniciando o Monitor Serial da IDE
IrReceiver.begin(pinoReceptorIR, ENABLE_LED_FEEDBACK); // Inicializa o receptor IR do controle remoto
}

void loop(){

now = myRTC.now();
hora = now.hour();
minuto = now.minute();
if (IrReceiver.decode()) // Executa caso receba algum códico
{
  // Imprime somente para debug
Serial.print(hora); 
Serial.print(" : "); 
Serial.print(minuto);
Serial.print(" : ");
Serial.print("Valor lido : ");
Serial.println(valorRecebido);
valorRecebido = (IrReceiver.decodedIRData.command);


if ( (hora == HoraFecha && minuto == MinutoFecha) || (valorRecebido == cima)) {     
 (toldo = false);   // Fecha toldo
}

if ( (hora == HoraAbre && minuto == MinutoAbre) || (valorRecebido == baixo)) {     
 (toldo = true);   // Abre toldo
}

if (hora == HoraLiga && minuto == MinutoLiga) {   // Liga luz
    digitalWrite(PinoRele, LOW);          
  }
if (hora == HoraDesliga && minuto == MinutoDesliga) {  // Desliga Luz
    digitalWrite(PinoRele, HIGH);
   }

irrecv.resume(); //Le o valor da próxima tecla pressionada

}
  
if (toldo == false) {                     // Fecha toldo
  if(digitalRead(cimaFC) == HIGH) {      // Motor n fechou
    digitalWrite(pinMotor1, HIGH);           // fechando
    digitalWrite(pinMotor2, LOW);            // fechando
    }
    else {
      digitalWrite(pinMotor1, LOW);            // parado
      digitalWrite(pinMotor2, LOW);            // parado
    }
  }

if (toldo == true) {                      // Abre toldo
  if (digitalRead(baixoFC) == HIGH) {     // Motor n abriu
    digitalWrite(pinMotor1, LOW);            // abrindo
    digitalWrite(pinMotor2, HIGH);           // abrindo
    }
    else {
      digitalWrite(pinMotor1, LOW);            // parado
      digitalWrite(pinMotor2, LOW);            // parado
    }
  }
  delay(500);
}


void myTimeSet() {
  DS3231 myRTC;
 myRTC.setClockMode(false);  // set to 24h
  myRTC.setYear(23);
  myRTC.setMonth(12);
  myRTC.setDate(3);
  myRTC.setHour(7);
  myRTC.setMinute(20);
  myRTC.setSecond(28);
}
//-----------------------------------------------------------------------------
void myTimeNow() {
  now = myRTC.now();
  Serial.print(now.year(), DEC);    Serial.print('/');
  Serial.print(now.month(), DEC);   Serial.print('/');
  Serial.print(now.day(), DEC);     Serial.print(' ');
  Serial.print(now.hour(), DEC);    Serial.print(':');
  Serial.print(now.minute(), DEC);  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();
}


Experimente estas correções:

#include <IRremote.hpp>

#include <DS3231.h>


const int HoraAbre    = 17; //horário definido aqui somente para teste
const int MinutoAbre  = 13; //horário definido aqui somente para teste
const int HoraFecha   = 17; //horário definido aqui somente para teste
const int MinutoFecha = 15; //horário definido aqui somente para teste
const int PinoRele      = 2;
const int HoraLiga      = 17; //horário definido aqui somente para teste
const int MinutoLiga    = 15; //horário definido aqui somente para teste
const int HoraDesliga   = 17; //horário definido aqui somente para teste
const int MinutoDesliga = 17; //horário definido aqui somente para teste
int pinoReceptorIR = 2; //tenia el 11
int valorRecebido;

#define pinMotor1 9
#define pinMotor2 10
#define cimaFC 7
#define baixoFC 8 // tenia el 6
#define min min

// Definindo o código de cada ação que deverá ser realizada
int cima = 24;
int baixo = 82;


RTClib myRTC;
DateTime now;

bool toldo = false;
byte hora = 0;          // Hora atual
byte minuto = 0;

void setup()
{
  pinMode(pinMotor1, OUTPUT); // Definindo os pinos do motor como saida
  pinMode(pinMotor2, OUTPUT);
  pinMode(cimaFC, INPUT_PULLUP);
  pinMode(baixoFC, INPUT_PULLUP);
  pinMode(PinoRele, OUTPUT);
  digitalWrite(PinoRele, HIGH);


  Serial.begin(115200); // Iniciando o Monitor Serial da IDE
  IrReceiver.begin(pinoReceptorIR, ENABLE_LED_FEEDBACK); // Inicializa o receptor IR do controle remoto
}

void loop() {

  now = myRTC.now();
  hora = now.hour();
  minuto = now.minute();
  if (IrReceiver.decode()) // Executa caso receba algum códico
  {
    // Imprime somente para debug
    Serial.print(hora);
    Serial.print(" : ");
    Serial.print(minuto);
    Serial.print(" : ");
    Serial.print("Valor lido : ");
    valorRecebido = (IrReceiver.decodedIRData.command);
    Serial.println(valorRecebido);

    if ( (hora == HoraFecha && minuto == MinutoFecha) || (valorRecebido == cima)) {
      (toldo = false);   // Fecha toldo
      Serial.println ("cima");
    }

    if ( (hora == HoraAbre && minuto == MinutoAbre) || (valorRecebido == baixo)) {
      (toldo = true);   // Abre toldo
      Serial.println ("baixo");
    }

    if (hora == HoraLiga && minuto == MinutoLiga) {   // Liga luz
      digitalWrite(PinoRele, LOW);
    }
    if (hora == HoraDesliga && minuto == MinutoDesliga) {  // Desliga Luz
      digitalWrite(PinoRele, HIGH);
    }

    IrReceiver.resume(); //Le o valor da próxima tecla pressionada

  }

  if (toldo == false) {                     // Fecha toldo
    if (digitalRead(cimaFC) == HIGH) {     // Motor n fechou
      digitalWrite(pinMotor1, HIGH);           // fechando
      digitalWrite(pinMotor2, LOW);            // fechando
      Serial.println ("fechando");
    }
    else {
      digitalWrite(pinMotor1, LOW);            // parado
      digitalWrite(pinMotor2, LOW);            // parado
    }
  }

  if (toldo == true) {                      // Abre toldo
    if (digitalRead(baixoFC) == HIGH) {     // Motor n abriu
      digitalWrite(pinMotor1, LOW);            // abrindo
      digitalWrite(pinMotor2, HIGH);           // abrindo
      Serial.println ("abrindo");
    }
    else {
      digitalWrite(pinMotor1, LOW);            // parado
      digitalWrite(pinMotor2, LOW);            // parado
    }
  }
  delay(500);
}

Eu testei apenas as comparações do controlador IR, atualmente não tenho nenhum RTC disponível para testar.

Boa tarde...
...demorei mas voltei.
Esse código não funcionou mesmo.

Fiz algumas modificações, pequenas, mas que resolveram.
Como o monitor serial não estava imprimindo nada, a não ser que se acionasse uma tecla do controle remoto, fui no void loop, e coloquei o "IrReceiver.decode" após as impressões de hora e minuto.
agora está funcionando perfeitamente.

Obrigado pela ajuda.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.