Accionando um rele a uma determinada hora pela leitura de RTC DS1307

Pll
Como já mencionei em outro tópico o meu “hardware” é:

  • Arduino Mega;
  • Teclado matricial 4x4
  • 8 reles
  • LCD (ainda não montado porque aguardo pelo potênciometro)
  • Relogio RTC DS1307

O código por defeito “apresenta” as horas no serial monitor, e com a introdução da password interrompe, e ao pressionar uma tecla altera o estado do respectivo rele e escreve que relé está a ligar/desligar, (tipo relé 1 On).

Resumidamente:
1 - Apresenta as horas;
2 - Para ao introduzir a password
3 - Ao introduzir um numero, altera o estado do respectivo relé e escreve no serial monitor o estado
4 - Ao bloquear o teclado volta ao ponto 1

Até aqui tudo bem, (com algumas ajudas e tal…).

Agora estou a passar para uma nova fase, que é:
A - Mantendo o que já existe (pontos 1 a 4), ligar um relé a uma determinada hora e desligar a outra determinada hora.

Tenho estado a experimentar com os minutos e no serial monitor.
O código nesta parte é:

void loop()
{ 
  if(minuto>=13 && minuto<14 && estado==false)
 {(Serial.println("   "));}
  char Key = keypad.getKey();
    if (estado == false)
    if (millis() - tempo > 1000)
      {imprimeDadosModulo();
       tempo = millis();}   
  if (estado == false && Key != NO_KEY)                                                                    //verifica o estado do teclado
    {switch (Key)
      {case '*':
        if (password.evaluate())                                                                                          // verifica se password introduzida é correcta
           {MostraInfo(TARGET, 0, 0, "Desbloqueado");                                                
            estado = true; }                                                                                                       // e activa o teclado
        break;
        case '#': password.reset(); break;                                                                             // se precionado # reseta password
        default: password.append(Key);
                                                                                                          //chamando a função para imprimir na tela os dados gravados no módulo.
       }
     }
  else if (estado == true && Key != NO_KEY)                                                                                                       // se o teclado está activado, e foi precionada uma tecla
          //Serial.println(Key);
        {if (Key >= '0' && Key <= '9')
            {value = value * 10 + Key - '0';}
            if (Key == '*')
                //Serial.println(value);                                                                                                              //mostra valor total (actual) == se isto tivesse estado aqui o problema tinha sido descoberto antes
                {switch (value)
                    {case 1 :
                         if (digitalRead(releHQI) == LOW)                                           // verifica se as Lâmpadas HQI estão desligadas
                            {digitalWrite(releHQI, HIGH);                                                  // se verdadeiro liga as Lâmpadas HQI
                             MostraInfo(TARGET, 0, 0, "HQI Off");}
                         else
                            {digitalWrite(releHQI, LOW);                                                   // se falso desliga Lâmpadas HQI
                             MostraInfo(TARGET, 0, 0, "HQI On");}
                         break;
                     case 2 :
                          if (digitalRead(releT8) == LOW)                                               
                             {digitalWrite(releT8, HIGH);                                                     
                              MostraInfo(TARGET, 0, 0, "T8 Off");}
                          else
                             {digitalWrite(releT8, LOW);                                                       
                              MostraInfo(TARGET, 0, 0, "T8 On");}
                          break;
                     default:
                     estado = false;
                     password.reset();                                                                                        // vai ler novamente a password, por isso elimina os valores anteriores
                     MostraInfo(TARGET, 0, 0,indisponibilidade);
                     delay(500);
                     MostraInfo(TARGET, 0, 0,"Bloqueado");
                    }
                  value = 0;                                                                                                                         // elimina as teclas anteriores (nova leitura)
                }
                                                              
if (Key >= 'A' && Key <= 'D')
       {switch (Key)
                    {case 'A' :
                              if ((digitalRead(releHQI) == HIGH) ||                                                   
                                 (digitalRead(releT8) == HIGH) ||                                                           
                                 (digitalRead(releMoonlight) == HIGH))                                               
                                 { digitalWrite(releHQI, LOW);                                                                  
                                   digitalWrite(releT8, LOW) ;                                                                       
                                   digitalWrite(releMoonlight, LOW);                                                      
                              else
                                 {digitalWrite(releHQI, HIGH);                                                                 
                                   digitalWrite(releT8, HIGH);                                                                     
                                   digitalWrite(releMoonlight, HIGH);                                                      
                                   MostraInfo(TARGET, 0, 0, "Calha Desligada");}
                              break;
                       default:
                       estado = false;
                       password.reset();                                                      // vai ler novamente a password, por isso elimina os valores anteriores
                      MostraInfo(TARGET, 0, 0,indisponibilidade);
                      delay(500);
                      MostraInfo(TARGET, 0, 0,"Bloqueado");
                    }
               value = 0;
        }
   }
}

Agora, no principio do código quando substituo:

if(minuto>=13 && minuto<14 && estado==false)
{(Serial.println(" "));}
Testado e qd a condição é verdadeira ele imprime no serial monitor " ", passando para o ponto 1 quando a condição passa a falsa

Por:
if(minuto>=13 && minuto<14 && estado==false)
{digitalWrite(releHQI, HIGH);}

O relé mesmo quando a condição é verdadeira não liga???
Resta-me dizer que ligando o relé via terclado ele liga, (o que exclui erros de “harware”).

Se funciona com a função Serial.println, porque não funciona com a função digitalWrite???

Importas-te de testar isso com texto em vez de 3 espacos… e ja que vais testar, activar estes Serial.print

  else if (estado == true && Key != NO_KEY) // se o teclado está activado, e foi precionada uma tecla
          Serial.println(Key);
        {if (Key >= '0' && Key <= '9')
            {value = value * 10 + Key - '0';}
            if (Key == '*')
                Serial.println(value); //mostra valor total (actual) == 
                {switch (value)

Que e que tens ligado no rele para saber que o mesmo ligou?

bubulindo:
Importas-te de testar isso com texto em vez de 3 espacos…

Que e que tens ligado no rele para saber que o mesmo ligou?

Boas,
Estava a testar com " " porque as horas estavam a passar no serial monitor e assim era mais facil de ver se a função estava a funcionar ou não. No caso “desapareciam” as horas durante o minuto 13.

O relé que tenho é igual a este:
http://www.ebay.es/itm/190889792778?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1439.l2649

Ele incorpora um pequeno LED que liga quando o relé está ligado.

Já descobri onde estava o erro :slight_smile: maçariquice minha, (só podia ser).
O problema foi que eu tinha isto:
if(minuto>=13 && minuto<14 && estado==false)
{digitalWrite(releHQI, HIGH);}

e estes relés, (não sei porque carga de água), “acendem” com a instrução LOW :astonished:
claro, eu estava a “desligar” uma coisa que já estava “desligada”…assim tornava-se dificil :drooling_face:

Eu reparei nisso... mas imaginei que soubesses ligar um rele. Pelos vistos enganei-me...

Ola pll,
Dando continuação a este tópico venho mais uma vez a este forum, (que já muito me ajudou), pedir novamente ajuda.

Começo por actualizar a lista do meu "hardware":

  • Arduino Mega;
  • Teclado matricial 4x4
  • 8 reles
  • LCD 16x2 (finalmente a 100%)
  • Relogio RTC DS1307
  • Sensor de Temperatura DS18B20 WP

Conforme também já dito O código por defeito "apresenta" as horas e a Temperatura no LCD, sendo que com a introdução da password interrompe, e apresenta a mensagem:
Desbloqueado
Introduza Função
ao pressionar-se uma tecla (até agora de 1 a 8 ),altera o estado do respectivo rele e escreve que relé está a ligar/desligar, (tipo relé 1 On), pressionando qualquer outro numero apresenta a mensagem:
Função indisponível
Bloqueado

RESUMIDAMENTE
1 - Apresenta as horas e Temperatura;
2 - Para ao introduzir a password
3 - Ao introduzir um numero, altera o estado do respectivo relé e escreve no serial monitor o estado
4 - Ao bloquear o teclado volta ao ponto 1

Uma parte importante do que pretendo fazer é, mantendo o que já existe (pontos 1 a 4), ligar um relé a uma determinada hora e desligar a outra determinada hora.

Também aqui já consegui escrever o código, o que agora não estou a conseguir é introduzir esta parte de modo a:
A- por defeito o "Modo Temporizador" deverá estar a correr (Temporizador ligado);
B - com a introdução da password "entrar no modo "manual", (controlo por teclado matricial), MAS SEM DESLIGAR OS RELÉS QUE ESTIVEREM LIGADOS NO MODO TEMPORIZADOR

Adicionalmente gostaria também de introduzir no código uma função que fizesse:
Teclado activo (com password activada), e nenhuma tecla pressionada nos ultimos 10 minutos>>>>>então>>>> volta ao ponto 1.

Julgo que isto deva ser feito pela função millis, mas já tentei de mil e uma maneiras e nada :0

Em suma, pretendo:
B - com a introdução da password "entrar no modo "manual", (controlo por teclado matricial), MAS SEM DESLIGAR OS RELÉS QUE ESTIVEREM LIGADOS NO MODO TEMPORIZADOR
Teclado activo (com password activada), e nenhuma tecla pressionada nos ultimos 10 minutos>>>>>então>>>> volta ao ponto 1.

Termino este "testamento" apelando à vossa ajuda e que tenham paciência com quem ainda está a dar os 1ºs passos neste mundo dos arduinos :roll_eyes:

Anexo código.
Para uma percepção mais fácil do código devidi-lo em 4 partes:
PARTE 0 - CÓDIGO PRINCIPAL PROGRAMA A CORRER
PARTE 1 - DEFINIÇÃO DE HORÁRIO DE FUNCIONAMENTO DAS LÂMPADAS
PARTE 2 - CÓDIGO PARA RELOGIO RTC DS1307
PARTE 3 - CÓDIGO PARA SENSOR DE TEMPRATURA
https://googledrive.com/host/0B-Pv876wR5B1OVFDdF9rYjZ6UFk

Pois é pll, já só falta mesmo a parte:

NJPinheiro:
B - com a introdução da password "entrar no modo “manual”, (controlo por teclado matricial), MAS SEM DESLIGAR OS RELÉS QUE ESTIVEREM LIGADOS NO MODO TEMPORIZADOR

E está mesmo difícil, estou farto de partir a cabeça e nada :sweat_smile:

A questão é que o “temporizador” está “ligado” e a funcionar, mas quando meto a password corta os relés, e eu queria que a introdução da password não afeeta-se o temporizador…mas não consigo :cold_sweat: :cold_sweat: :cold_sweat:

Àlguém pode ajudar?
Deixo novamente código actualizado. https://googledrive.com/host/0B-Pv876wR5B1OVFDdF9rYjZ6UFk

Olá!

Pelo que percebi o problema está nesta parte do código

 if(hora==1 && minuto>=35 && hora==1 && minuto<36 && estado==false)
  {
    digitalWrite(releHQI, LOW);
  }
  else
  {
    digitalWrite(releHQI, HIGH);
  }        

  if(hora==1 && minuto>=36 && hora==1 && minuto<37 && estado==false)
  {
    digitalWrite(releT8, LOW);
  }
  else
  {
    digitalWrite(releT8, HIGH);
  } 

  if(hora==1 && minuto>=37 && hora==1 && minuto<38 && estado==false)
  {
    digitalWrite(releMoonlight, LOW);
  }
  else
  {
    digitalWrite(releMoonlight, HIGH);
  }
      if (password.evaluate())          // verifica se password introduzida � correcta
      {
        digitalWrite(buzzer, LOW);
        delay(150);
        digitalWrite(buzzer, HIGH);
        lcd.clear();
        MostraInfo(TARGET, 2, 0, "Desbloqueado");           // se sim imprime Teclado desbloqueado no serial monitor
        lcd.setCursor(2,0);
        lcd.print("Desbloqueado");
        Serial.print ("Introduzir funcao");
        lcd.setCursor (1,1);
        lcd.print("Precione tecla");
        estado = true;            				// e activa o teclado
      }

Quando a senha é inserida corretamente a variável “estado” muda para “true” logo, as condições da primeira parte não são completamente atendidas.

Uma das opções é criar outra variável e manipulá-la separadamente.

BTW. http://www.priberam.pt/dlpo/pressione

Abraço.
Fernando Garcia

FernandoGarcia:
Quando a senha é inserida corretamente a variável "estado" muda para "true" logo, as condições da primeira parte não são completamente atendidas.

Uma das opções é criar outra variável e manipulá-la separadamente.

Olá Sr.Fernando Garcia,
a intenção é por defeito ter o temporizador a funcionar, e mesmo após introdução de password não interromper o ciclo do temporizador, mas com a introdução da password "dar prioridade" ás instruções dadas pelo teclado.

É conjugação destas condições que eu "ando a ver navios".

A condição que eu tenho permite-me ter o temporizador a funcionar quando o estado=false, e comandar "manualmente" os reles com a Introdução da Password (estado=true).....mas quando os reles estão "activos" via temporizador e eu introduzo password, ELES MUDAM DE ESTADO :0

caso não tenha a condição de "estado=false", perco o "controlo manual" dos reles via introdução de password :0

A solução pode ser a sua segunda afirmação, pode exemplificar por favor?

Abraço
NJPinheiro