• Welcome to LusoRobótica - Robótica em Português.
 

Controlando relay com RTC

Started by matheus.mattia, 23 de August de 2012, 07:03

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

matheus.mattia

E ai galera, estou fazendo um sistema para automatização de um grow para pequenas plantas. Estou usando um DS1307, 3 relays para controle de luz, irrigação e ventilação, dois LM35 para controle de temperatura dentro e fora do grow e também duas pontas de prova para controle de umidade do solo.

Tenho algumas duvidas e gostaria da ajuda de vocês.

-Como faço para ativar o relay 18hrs por dia, começando um horário programado? (preciso de ajuda com o código)

-Para ligar a ventilação, estou fazendo a seguinte lógica:

void ligarVent(){
  val = digitalRead(relay1);
  if(tempInt >= 30.00){
      if((tempInt - tempExt) >= 3.00){if(val == HIGH){}
          else{digitalWrite(relay1, HIGH);}
                else{digitalWrite(relay1, LOW);}}
                      else{digitalWrite(relay1, LOW);}}


Ele está lendo ambas as temperaturas, dentro e fora, caso a temperatura interna esteja muito alta, ele calcula se a externa está mais baixa (mais de 3ºC de diferença), caso esteja, liga a ventilação... O problema que estou tendo é que ao ativar o relay, os valores das temperaturas sobem. A duvida é: Isso está sendo causado por estar alimentando o relay e os sensores com o arduino? Por enquanto estou usando a corrente da entrada USB, mas pretendo usar uma fonte 12V 1A.


Por enquanto são essas as minhas dúvidas, agradeço toda e qualquer ajuda.



rglove


matheus.mattia

Quote from: rglove on 23 de August de 2012, 09:13
Olá, tens aqui este tutorial sobre o RTC ds1307:
http://lusorobotica.com/index.php?topic=681.0

Primeiramente obrigado pela resposta, mas já estou com ele montado e funcionando, a dúvida era no código mesmo...

matheus.mattia

#3
Consegui fazer por conta o código para ligar e desligar o relay, alguém poderia dar uma conferida se não irá dar nenhum bug com o tempo?

Ficou o seguinte:

Digamos que eu queira ativar o relay as 13:00 e desativar as 15:00

hora = now.hour();
 
  if(hora == 13){if(timer == 0){timer = 1;
                  digitalWrite(relay2, HIGH);}else{}}else{};
                 
  if(hora == 15){if(timer == 1){timer = 0;digitalWrite(relay2, LOW);}else{}}else{}
 


o timer é para que ele não fique definindo o relay2 como HIGH toda vez que ele roda a função

Desde já, obrigado.

Pedrock

#4
Queres que esteja ligado entre as 13 e as 15 e o resto do tempo desligado?
Então é isto:

hora = now.hour();
if (hora >= 13 && hora <= 15) digitalWrite(relay2, HIGH);
else digitalWrite(relay2, LOW);


EDIT: Desta forma vai ligar das 13:00h até às 15:59h.
Para ser das 13:00h às 14:59 é:

hora = now.hour();
if (hora >= 13 && hora < 15) digitalWrite(relay2, HIGH);
else digitalWrite(relay2, LOW);

rglove

Desculpa, tinha lido à pressa  :-[ Mas já te responderam.

senso

Tens mais elses que if's, assim nunca funciona.
Avr fanboy

matheus.mattia

Quote from: senso on 23 de August de 2012, 21:50
Tens mais elses que if's, assim nunca funciona.

acho que você não contou direito...

E quanto ao problema da alteração da leitura com o ativamento dos relay, alguém??

Pedrock

#8
Quote from: matheus.mattia on 24 de August de 2012, 03:33
Quote from: senso on 23 de August de 2012, 21:50
Tens mais elses que if's, assim nunca funciona.

acho que você não contou direito...

E quanto ao problema da alteração da leitura com o ativamento dos relay, alguém??
Acho que ele está a falar disto:
void ligarVent(){
  val = digitalRead(relay1);
  if(tempInt >= 30.00){
      if((tempInt - tempExt) >= 3.00){if(val == HIGH){}
          else{digitalWrite(relay1, HIGH);}
                else{digitalWrite(relay1, LOW);}}
                      else{digitalWrite(relay1, LOW);}}

EDIT:
Por acaso tem 3 if e 3 else, mas está de uma forma muito estranha.

Por exemplo:
Isto:
          if(val == HIGH){}
          else{digitalWrite(relay1, HIGH);
Devia estar:
if(val == LOW) digitalWrite(relay1, HIGH);

EDIT2:
E isto:
val = digitalRead(relay1);
Está mal. Não podes ler um output...

rsoares

Não podes ter condições no else.

Pedrock


rsoares

Não podes não...
Apenas no else if.

Pedrock

Quote from: rsoares on 24 de August de 2012, 13:43
Não podes não...
Apenas no else if.
Podes ter um if dentro de outro ou um if dentro de um else.

rsoares

...

Não se pode ter condições no else..

ex.:
else(a == b)
{}


PS: No entanto após reler o código, esse erro não foi feito, o layout não ajudou na leitura de qualquer forma fica a info. para os mais novatos ^^

Pedrock

Desculpa, pensava que estavas a dizer que não podias ter um if dentro de um else.