Este tópico era para resolver uma dúvida. Como ligar o RELE em determinado horário, procurando na internet eu e meu
professor Luiz Fernando encontramos um código e modificamos ele conforme a minha necessidade. Porém agradeço muito ao Paulo Cesar Antunes, ao
Carlos Kwiek e o Luciano Vieira da Silva Jr.
Segue abaixo o código que foi montado.Detalhe: Nesse código o comando LOW liga e HIGH desliga, não sei o motivo, mas funcionou dessa forma.

Exibições: 1249

Anexos

Responder esta

Respostas a este tópico

Veja se esse código meu não te serve:

http://labdegaragem.com/forum/topics/ajuda-com-c-digo-2

Acredito que ajustando vai te ajudar...

Sou novo nessa área, então pelo que eu entendi não dará certo.

Obs: Necessito gravar a data e a hora no RTC, já que o mesmo não ficará conectado a nenhum computador, e em determinadas horas ( designadas por mim ) ele irá " falar " pro relê mandar energia para a válvula solenoide e a mesma abrir a passagem da água.

Hugo, esse código que te passei serve sim para o que vc diz querer....

Nesse campo será onde vc determinará o horário de ligar (Onde está Bomba 1 e 2 será a tua solenoide) ´que no exemplo irá funcionar das 6 da manha até as 18 horas ( você coloca horário que quiser, basta alterar)

//Bomba 1 e 2 : Ligada entre 06:00 e 18:00 todos os dias
if ((hour >=06 &minute >=00 &second >=01) && (hour <=17 &minute <=59 &second <=53))

Já o tempo que você quer que fique ligada a solenoide irá determina nesse campo que fica logo incio do código...

long interval = 5000; // tempo de transição entre estados (milisegundos)

O tempo está em milésimos de segundo no exemplo ai 5 segundos (5000)

 

Bom você pode não ter entendido o código, mas que ele te serve serve, basta ajustar...

 

Caro Paulo Cesar Antunes, hoje na minha aula de PTCC eu e meu professor analisamos o código e o modificamos como mostra abaixo, porém ele não está ligando o pino 13, fizemos o teste com o exemplo BLINK para ver se o ARDUINO estava com defeito, o teste foi um sucesso(o rele funcionou perfeitamente), ou seja, é alguma coisa a cima do loop que está atrapalhando. Tem como me ajudar nessa parte ?

int bomb4 = 13; // LED conectado ao pino digital 12

int value = LOW; // último valor do LED

long previousMillis = 0; // último momento que o LED foi atualizado

long interval = 5000; // tempo de transição entre estados (milisegundos)

 

#include "Wire.h"

#define DS1307_I2C_ADDRESS 0x68

/

//Converter números decimais normais para binário codificado decimal

byte decToBcd(byte val)

{

return ( (val/10*16) + (val%10) );

}

 

//Converter decimal binário codificado para números decimais normais

byte bcdToDec(byte val)

{

return ( (val/16*10) + (val%16) );

}

 

// 1) Define a data e a hora no ds1307

// 2) Inicia o relógio

// 3) Define o modo de hora a relógio de 24 horas

// Assume que você está passando em números válidos

void setDateDs1307(byte second, // 0-59

byte minute, // 0-59

byte hour, // 1-23

byte dayOfWeek, // 1-7

byte dayOfMonth, // 1-28/29/30/31

byte month, // 1-12

byte year) // 0-99

{

Wire.beginTransmission(DS1307_I2C_ADDRESS);

Wire.write(0);

Wire.write(decToBcd(second)); // 0 a 7 bit no cronômetro

Wire.write(decToBcd(minute));

Wire.write(decToBcd(hour)); // Se você quiser am 12 hora / pm é necessário definir

// 6 bit (também precisa mudar readDateDs1307)

Wire.write(decToBcd(dayOfWeek));

Wire.write(decToBcd(dayOfMonth));

Wire.write(decToBcd(month));

Wire.write(decToBcd(year));

Wire.endTransmission();

}

 

// Obtém a data e hora do ds1307

void getDateDs1307(byte *second,

byte *minute,

byte *hour,

byte *dayOfWeek,

byte *dayOfMonth,

byte *month,

byte *year )

{

// Reset o ponteiro registro

Wire.beginTransmission(DS1307_I2C_ADDRESS);

Wire.write(0);

Wire.endTransmission();

 

Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

// Algumas delas precisam de máscaras porque certos bits são bits de controle

*second = bcdToDec(Wire.read() & 0x7f);

*minute = bcdToDec(Wire.read());

*hour = bcdToDec(Wire.read() & 0x3f); // Necessidade de mudar isso se 12 horas am/pm

*dayOfWeek = bcdToDec(Wire.read());

*dayOfMonth = bcdToDec(Wire.read());

*month = bcdToDec(Wire.read());

*year = bcdToDec(Wire.read());

}

 

void setup()

{

byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

Wire.begin();

Serial.begin(9600);

 

// configura o pino digital como saída

pinMode(bomb4, OUTPUT);

 

// Alterar esses valores para o que você quer definir o seu relógio para.

// Você provavelmente só quer definir o seu relógio uma vez e, em seguida, remover

//the setDateDs1307 call.

second = 00;

minute = 38;

hour = 13;

dayOfWeek = 0;

dayOfMonth = 03;

month = 9;

year = 15;

setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);

}

 

void loop()

{

digitalWrite(bomb4, LOW);

 

AtualizaSaidas();

delay(1000);

digitalWrite(bomb4, HIGH);

delay(1000);

}

 

void AtualizaSaidas()

{

  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

  getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

  //Bomba 1 e 2 : Ligada entre 06:00 e 18:00 todos os dias

  if ((hour ==13 &minute ==45 &second >=01) && (hour ==13 &minute ==45&second <=59))

  //if (millis() - previousMillis > interval)

  {

        digitalWrite(bomb4, HIGH);

  }

  else

  {

        digitalWrite(bomb4, LOW);

  }

}

 

Tenta mudar :

if ((hour ==13 &minute ==45 &second >=01) && (hour ==13 &minute ==45&second <=59))

Para:

if ((hour >=13 &minute >=45 &second >=01) && (hour >=13 &minute >=45 &second <=59) )

Quase certeza problema está ai

Hugo, RTC serve para vc definir a hora real uma única vez, e a partir daí o relógio funciona somando o tempo a partir daquele horário que vc definiu como sendo a hora atual.

Aí vc programa o arduino para perguntar ao RTC que horas são naquele momento. E tendo essa informação em mãos (horário que o RTC informa como sendo atual), vc opta por exibir o horário no serial monitor, exibir o horário no display, ou simplemente manda o arduino executar alguma função caso o horário atual coincida com aquele horário que vc definiu como hora da irrigação.

Então, para o seu projeto, aprenda a mandar o arduino perguntar pro RTC que horas são. Esse é o primeiro passo. Mande exibir no serial monitor.

Depois, comece a brincar, comece a treinar sua capacidade de programação. Mande por exemplo o arduino perguntar ao RTC que horas são, e se os minutos forem menores que trinta, mande exibir uma mensagem "MINUTOS MENOR QUE TRINTA" e se os minutos forem maiores que 30, mande exibir "MINUTOS MAIOR QUE TRINTA"

Depois mande o arduino exibir também, além dos minutos maior ou menor que trinta,  a mensagem "HORA PAR" OU "HORA IMPAR" conforme a hora que o RTC te informou. (por exemplo, irá exibir "HORA PAR, MINUTOS MAIOR QUE 30"

Com isso, vc vai estar pronto pra mandar o arduino perguntar ao RTC que horas são e mandar exibir a mensagem no serial monitor "IRRIGAR" caso o horário esteja por exemplo entre 08:00 e 08:15

Aí o próximo passo é ao invés de mandar exibir mensagem no serial monitor, mandar o arduino acionar o relê.

esse é o caminho das pedras. Existe algo já pronto? Não sei, talvez exista. Mas se quiser aprender, siga esses passos que te falei. E se vc aprender isso, com certeza vai poder usar a imaginação pra fazer muitas outras coisas úteis com o RTC

Olá Hugo,

Você pretende fazer algo similar a este vídeo?

https://www.youtube.com/watch?v=gAdXyfof19A

Abs.

Sim, é a mesma coisa só que o tempo seria uma vez por semana em uma determinada hora liga a válvula 1  e duas vezes na semana a válvula 2, e por enquanto sem o LCD. Se você puder me passar o código que você montou agradeço, mais irei tentar fazer o ajuste que o Paulo me disse e ver se vai dar certo. :D

 O que o Paulo te passou é o código que fiz e passei para ele, aqui somos assim, passamos conhecimento um aos outros sem outra finalidade que a de compartilhar conhecimento e ajudar o próximo e receber ajuda.

Teste as modificações se quiser antes, e se também quiser passe o seu @gmail que compartilho todo projeto no Google Drive.

A maneira como vai usar, ligar x dia, x horas o programa permite fazer as escolhas, basta saber entender o código que esta todo comentado linha a linha e se tiver duvidas, eu o Paulo que esta inclusive realizando testes práticos pode lhe auxiliar bem como todos os colegas do forum.

Por outra parte preste atenção no link que o Paulo te passou, note que todos mudamos para o RTC DS3231 depois que o Paulo apontou uma grande deficiência do DS1307 que atrasa e muito, o DS3231 é preciso, confirmação esta corroborada pelo colega ihmugo na pratica também.

Também lhe aconselho a mesma biblioteca que estamos usando que pode baixar aqui:

http://www.rinkydinkelectronics.com/library.php

Embora no meu projeto utilizo somente

#include <Wire.h>
#include <LiquidCrystal.h>
#include <Time.h> 

Te encorajo a seguir os conselhos do colega ihmugo, porque copiar e colar apenas não é uma boa escolha

Boa sorte.

Eu quero aprender, pretendo fazer alguns projetos para o meu uso, porém agora não tenho muito tempo para estudar os comandos para fazer do 0, por isso gostaria de ter algum mais ou menos pronto para o que eu preciso, já que é para a fins escolares. Você tem skype ? É mais fácil do que ficar trocando muitas mensagens por aqui (já que está dando alguns errinhos xD). E não tem como eu comprar outro RTC, já que este o grupo todo pagou.

Sim eu tenho skype, mas todas coisas que fazemos aqui são compartilhadas e não privadas, a intenção de um forum é exatamente essa, trocar informação para que todos aqui opinem, compartilhei sua ideia a respeito do assunto, ajudem, critiquem, ou seja la o que for dentro do mutuo respeito e regras do forum, dessa forma é que funciona o espirito de um forum, se para você é mais fácil o skype que trocar mensagens por aqui, acho bom procurar ajuda no forum do Skype, o qua acha?

Abs.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço