Go Down

Topic: Arduino mais rtc (Read 1 time) previous topic - next topic

renatoeng

olá galera poderiam me ajudar a incluir codigo para modulo rtc real time clock.
a partir deste gostaria de acionar 4 reles conforme horario pré determinado.
ou seja quero usar o relogio para acionar um rele de cada vez.
ou seja
liga rele 1 as 08:00
liga relé2   as 8:30
liga relé3 as 9:00
liga relé 4 as 9:30

desliga rele1 as 20:00
desliga relé2 as 20:30
desliga relé3 as 21:00
desliga relé 4 as 21:30



segue previa do codigo.







//Programa : Teste Modulo Rele Arduino 4 canais - Lampadas
//Autor : FILIPEFLOP/renato
 
//Porta ligada ao pino IN1 do modulo
int porta_rele1 = 7;
//Porta ligada ao pino IN2 do modulo
int porta_rele2 = 8;
//Porta ligada ao pino IN3 do modulo
int porta_rele3 = 9;
//Porta ligada ao pino IN4 do modulo
int porta_rele4 = 10;
 
void setup()
{
  //Define pinos para o rele como saida
  pinMode(porta_rele1, OUTPUT);
  pinMode(porta_rele2, OUTPUT);
  pinMode(porta_rele3, OUTPUT);
  pinMode(porta_rele4, OUTPUT);
}
 
void loop()
{
  digitalWrite(porta_rele1, LOW); //Liga rele 1
  delay(2000);
  digitalWrite(porta_rele2, low); //liga rele 2
  delay(2000);
  digitalWrite(porta_rele3, low); //liga rele 3
  delay(2000);
  digitalWrite(porta_rele4, LOW);  //Liga rele 4
  delay(5000);
  digitalWrite(porta_rele1, high); //desliga rele 1
  delay(2000);
  digitalWrite(porta_rele2, high); //desliga rele 2
  delay(2000);
  digitalWrite(porta_rele3, high); //desliga rele 3
  delay(2000);
  digitalWrite(porta_rele4, high); //desliga rele 4
  delay(2000);
}

Jeff_85

Esse seu código em nada tem a ver com o que deseja. Se quer usar um RTC, veja os exemplos disponíveis e tente, ao menos, exibir as horas no serial monitor. Faça as adaptações que precisar e, caso surgam dúvidas, poste-as aqui, juntamente com seu código completo.

renatoeng

#include "Wire.h"
#define DS3231_ADDRESS 0x68
int segundos;
int minutos;
int horas;
int diadasemana;
int diadomes;
int mes;
int ano;
byte zero = 0x00;
int rele1 = 7;
int rele2 = 8;
int rele3 = 9;
int rele4 = 10;

bool ligarele1;
bool ligarele2;
bool ligarele3;
bool ligarele4;
 void setup()
{
pinMode(rele, OUTPUT);
digitalWrite(rele1, HIGH);
ligarele1 = false;
Wire.begin();
Serial.begin(9600);
}
byte ConverteParaBCD(byte val){ //Converte o número de decimal para BCD
return ( (val/10*16) + (val%10) );
}
byte ConverteparaDecimal(byte val) { //Converte de BCD para decimal
return ( (val/16*10) + (val%16) );
}
void Mostrarelogio()
{
Wire.beginTransmission(DS3231_ADDRESS);
Wire.write(zero);
Wire.endTransmission();
Wire.requestFrom(DS3231_ADDRESS, 7);
int segundos = ConverteparaDecimal(Wire.read());
int minutos = ConverteparaDecimal(Wire.read());
int horas = ConverteparaDecimal(Wire.read() & 0b111111);
int diadasemana = ConverteparaDecimal(Wire.read());
int diadomes = ConverteparaDecimal(Wire.read());
int mes = ConverteparaDecimal(Wire.read());
int ano = ConverteparaDecimal(Wire.read());
//Mostra a data no Serial Monitor
Serial.print("Data: ");
Serial.print(diadomes);
Serial.print("/");
Serial.print(mes);
Serial.print("/");
Serial.print(ano);
Serial.print(" ");
Serial.print("Hora : ");
Serial.print(horas);
Serial.print(":");
Serial.print(minutos);
Serial.print(":");
Serial.print(segundos);
switch(diadasemana)
{
case 0:Serial.println(", Domingo");
case 1:Serial.println(", Segunda");
case 2:Serial.println(", Terca");
case 3:Serial.println(", Quarta");
case 4:Serial.println(", Quinta");
case 5:Serial.println(", Sexta");
case 6:Serial.println(", Sabado");
}

if ((horas >= 8) and (minutos >= 00) and (!ligarele1)) {
rele1ligado = true;
digitalWrite(rele1, LOW);
if ((horas >= 8) and (minutos >= 30) and (!ligarele2)) {
rele2ligado = true;
digitalWrite(rele2, LOW);
if ((horas >= 9) and (minutos >= 00) and (!ligarele3)) {
rele3ligado = true;
digitalWrite(rele3, LOW);
if ((horas >= 9) and (minutos >= 30) and (!ligarele4)) {
rele4ligado = true;
digitalWrite(rele4, LOW);

if ((horas >= 20) and (minutos >= 00) and (!desligarele1)) {
rele1desligado = true;
digitalWrite(rele1, high);
if ((horas >= 20) and (minutos >= 30) and (!desligarele2)) {
rele2desligado = true;
digitalWrite(rele2, high);
if ((horas >= 21) and (minutos >= 00) and (!desligarele3)) {
rele3desligado = true;
digitalWrite(rele3, high);
if ((horas >= 21) and (minutos >= 30) and (!desligarele4)) {
rele4ligado = true;
digitalWrite(rele4, high);


}
}void loop()
{
Mostrarelogio();
delay(1000);
}



segue código, com ajuste para rtc porem copiei e inclui algumas coisas  preciso de ajuda para correção.

Jeff_85

Por favor, poste o código entre TAGS. </>

Code: [Select]
Assim

renatoeng

desculpa mas como faço isso?

bubulindo

Antes de colocares o código carregas num botão que tem estes simbolos

</>

Depois carregas no Ctrl+V e o código aparece entre as tags de code.

O código que colocaste anteriormente, embora pareça estar perto do que queres nem sequer compila.
This... is a hobby.

renatoeng

Code: [Select]
#include "Wire.h"
#define DS3231_ADDRESS 0x68
int segundos;
int minutos;
int horas;
int diadasemana;
int diadomes;
int mes;
int ano;
byte zero = 0x00;
int rele1 = 7;
int rele2 = 8;
int rele3 = 9;
int rele4 = 10;

bool ligarele1;
bool ligarele2;
bool ligarele3;
bool ligarele4;

void setup()
{
pinMode(rele, OUTPUT);
digitalWrite(rele1, HIGH);
ligarele1 = false;
Wire.begin();
Serial.begin(9600);
}
byte ConverteParaBCD(byte val){ //Converte o número de decimal para BCD
return ( (val/10*16) + (val%10) );
}
byte ConverteparaDecimal(byte val) { //Converte de BCD para decimal
return ( (val/16*10) + (val%16) );
}
void Mostrarelogio()
{
Wire.beginTransmission(DS3231_ADDRESS);
Wire.write(zero);
Wire.endTransmission();
Wire.requestFrom(DS3231_ADDRESS, 7);
int segundos = ConverteparaDecimal(Wire.read());
int minutos = ConverteparaDecimal(Wire.read());
int horas = ConverteparaDecimal(Wire.read() & 0b111111);
int diadasemana = ConverteparaDecimal(Wire.read());
int diadomes = ConverteparaDecimal(Wire.read());
int mes = ConverteparaDecimal(Wire.read());
int ano = ConverteparaDecimal(Wire.read());
//Mostra a data no Serial Monitor
Serial.print("Data: ");
Serial.print(diadomes);
Serial.print("/");
Serial.print(mes);
Serial.print("/");
Serial.print(ano);
Serial.print(" ");
Serial.print("Hora : ");
Serial.print(horas);
Serial.print(":");
Serial.print(minutos);
Serial.print(":");
Serial.print(segundos);
switch(diadasemana)
{
case 0:Serial.println(", Domingo");
case 1:Serial.println(", Segunda");
case 2:Serial.println(", Terca");
case 3:Serial.println(", Quarta");
case 4:Serial.println(", Quinta");
case 5:Serial.println(", Sexta");
case 6:Serial.println(", Sabado");
{

if ((horas >= 8) and (minutos <= 00) and (!ligarele)) {
rele1ligado = true;
digitalWrite(rele1, LOW);}
if ((horas >= 8) and (minutos <= 30) and (!ligarele)) {
rele2ligado = true;
digitalWrite(rele2, LOW);}
if ((horas >= 9) and (minutos <= 00) and (!ligarele)) {
rele3ligado = true;
digitalWrite(rele3, LOW);}
if ((horas >= 9) and (minutos <= 30) and (!ligarele)) {
rele4ligado = true;
digitalWrite(rele4, LOW);}

if ((horas >= 20) and (minutos <= 00) and (ligarele)) {
ligarele = false;
digitalWrite(rele1, high);}
if ((horas >= 20) and (minutos <= 30) and (ligarele)) {
ligarele = false;
digitalWrite(rele2, high);}
if ((horas >= 21) and (minutos <= 00) and (ligarele)) {
ligarele = false;
digitalWrite(rele3, high);}
if ((horas >= 21) and (minutos <= 30) and (ligarele)) {
ligarele = false;
digitalWrite(rele4, high);}


}void loop()
{
Mostrarelogio();
delay(1000);
}


Jeff_85

#7
Nov 20, 2017, 03:10 pm Last Edit: Nov 20, 2017, 05:31 pm by Jeff_85
Como já dito antes, seu código nem compila. Operador booleano AND é feito com &&. Além disso, há variáveis que foram inseridas no programa e não declaradas. Seu código está repleto de IF. A ideia é usar comparações mesmo, mas você encheu o programa de coisas antes de fazer ele rodar com o mais simples.

Quando o compilador retorna a mensagem:
Code: [Select]
'rele' was not declared in this scope
Quer dizer que inseriu uma variável no programa e ela não foi declarada no início. Você precisa dizer para ele "olha, rele vai ser uma saída e vou usar a porta tal".

Code: [Select]
int rele = 11; //por exemplo

O mesmo para as demais variáveis. Diminua os IFs provisoriamente para mostrar as horas no monitor serial e faça apenas uma comparação de teste.

pseudo código (isso é apenas uma ideia para seu teste básico):
Code: [Select]
if ((hora == 8) && (minuto == 00) && (segundos == 00)){
//LIGA rele numero XX

}
else if ((hora == 8)&& (minuto == 30) && (segundos == 00)){
//DESLIGA rele numero XX

}

Interessante usar os segundos porque se usar apenas horas e minutos ele vai ficar ligando durante 1 minuto a saída do relé (até minutor ser diferente de 00, ou seja, 01), o que é desnecessário. Usando "segundos" ele ainda vai fazer isso, mas um pouco menos. Pois 1 segundo passa mais rápido que 1 minuto :)


renatoeng

obrigado vou estudar o que me passou e arrumar codigo

Go Up