Go Down

Topic: auxilio código rtc ds 3231 (Read 1 time) previous topic - next topic

renatokappa30

pessoal está dando um erro no meu código acredito ser algo simples porem sou iniciante no arduino se puderem ajudar.

segue código


#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;
RTCDateTime dataehora;

void setup()
{
  pinMode(rele1, OUTPUT);
  digitalWrite(rele1, HIGH);
  pinMode(rele2, OUTPUT);
  digitalWrite(rele2, HIGH);
  pinMode(rele3, OUTPUT);
  digitalWrite(rele3, HIGH);
  pinMode(rele4, OUTPUT);
  digitalWrite(rele4, HIGH);
  ligarele1 = false;
  ligarele2 = false;
  ligarele3 = false;
  ligarele4 = false;
  Wire.begin();
  Serial.begin(9600);

  rtc.setDateTime(11 DATE 12__, _20_TIME 00);
}
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)) {
    ligarele1 = true;
    digitalWrite(rele1, LOW);
  }
  if ((horas >= 8) and (minutos <= 30) and (!ligarele2)) {
    ligarele2 = true;
    digitalWrite(rele2, LOW);
  }
  if ((horas >= 9) and (minutos <= 00) and (!ligarele3)) {
    ligarele3 = true;
    digitalWrite(rele3, LOW);
  }
  if ((horas >= 9) and (minutos <= 30) and (!ligarele4)) {
    ligarele4 = true;
    digitalWrite(rele4, LOW);
  }

  if ((horas >= 20) and (minutos <= 00) and (ligarele1)) {
    ligarele1 = false;
    digitalWrite(rele1, HIGH);
  }
  if ((horas >= 20) and (minutos <= 30) and (ligarele2)) {
    ligarele2 = false;
    digitalWrite(rele2, HIGH);
  }
  if ((horas >= 21) and (minutos <= 00) and (ligarele3)) {
    ligarele3 = false;
    digitalWrite(rele3, HIGH);
  }
  if ((horas >= 21) and (minutos <= 30) and (ligarele4)) {
    ligarele4 = false;
    digitalWrite(rele4, HIGH);
  }


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

giova014

Edite seu post e coloque o código dentro de tags [ code]seu código aqui[ /code] para facilitar a leitura, assim como descrito em How to use this forum - please read item 7.

Quote
pessoal está dando um erro no meu código
Qual o erro?
O que o código faz? O que era para fazer?
Arduino!!

renatokappa30

Code: [Select]


#include "Wire.h"
#define DS3231_ADDRESS 0x68

DS3231 rtc;              //Criação do objeto do tipo DS3231
RTCDateTime dataehora;   //Criação do objeto do tipo RTCDateTime

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;


rtc.setDateTime(_12_DATE_12_, _10_TIME_12_);

void setup()
{

dataehora = rtc.getDateTime();     //Atribuindo valores instantâneos de
                                                         //data e hora à instância dataehora esta linha deve ser comentada após a primeira gravação no Arduino.

pinMode(rele1, OUTPUT);
digitalWrite(rele1, HIGH);
pinMode(rele2, OUTPUT);
digitalWrite(rele2, HIGH);
pinMode(rele3, OUTPUT);
digitalWrite(rele3, HIGH);
pinMode(rele4, OUTPUT);
digitalWrite(rele4, HIGH);
ligarele1 = false;
ligarele2 = false;
ligarele3 = false;
ligarele4 = 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)) {
ligarele1 = true;
digitalWrite(rele1, LOW);}
if ((horas >= 8) and (minutos <= 30) and (!ligarele2)) {
ligarele2 = true;
digitalWrite(rele2, LOW);}
if ((horas >= 9) and (minutos <= 00) and (!ligarele3)) {
ligarele3 = true;
digitalWrite(rele3, LOW);}
if ((horas >= 9) and (minutos <= 30) and (!ligarele4)) {
ligarele4 = true;
digitalWrite(rele4, LOW);}

if ((horas >= 20) and (minutos <= 00) and (ligarele1)) {
ligarele1 = false;
digitalWrite(rele1, HIGH);}
if ((horas >= 20) and (minutos <= 30) and (ligarele2)) {
ligarele2 = false;
digitalWrite(rele2, HIGH);}
if ((horas >= 21) and (minutos <= 00) and (ligarele3)) {
ligarele3 = false;
digitalWrite(rele3, HIGH);}
if ((horas >= 21) and (minutos <= 30) and (ligarele4)) {
ligarele4 = false;
digitalWrite(rele4, HIGH);}


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

   


desculpa o erro


bem o projeto é ligar 4 relés em horário pré determinado com o auxilio do rtc ds 3231.
o projeto é ligar uma luminaria de leds. ou seja cada canal do relé vai controlar uma carga de leds(mas isso é detalhe.)
a questão é que eu não consigo gerar o código completamente.

giova014

Quote
a questão é que eu não consigo gerar o código completamente.
Como chegou a essa conclusão?
Obteve algum erro ao compilar? Poste o erro aqui.
O código não funciona como esperado? O que acontece na realidade diferente do esperado?
Arduino!!

renatokappa30

bem cheguei a esta conclusão pois o código não foi gerado por min, foi ajuda de um programador mas perdi contato com ele. em fim programa estava pela metade, o programa original não continha as linhas para gravar o horário e a data no rtc, aquelas linhas comentadas.
em busca na internet eu achei algo sobre e inclui as linhas mas dá erro.
o erro que dá  que existem linhas não declaradas. não consigo postar aqui pos estou na empresa e este pc não tem o programa do Arduino para poder rodar código.
o código postado aqui contem as linhas para ajustar a data e hora mas não sei se estão certos de acordo com meu programa além do erro que acontece.


giova014

Quote
o erro que dá  que existem linhas não declaradas. não consigo postar aqui pos estou na empresa e este pc não tem o programa do Arduino para poder rodar código.
Assim que possível, copie o erro do Arduino ao compilar e poste aqui.

Não tenho o hardware para testar, então você é o único que pode dizer se o programa funciona como o esperado.
Arduino!!

renatokappa30



./opt/arduino-builder/arduino-builder -compile -core-api-version 10611 -hardware opt/arduino-builder/hardware -hardware ./opt/cores -tools opt/arduino-builder/tools -tools ./opt/tools -built-in-libraries opt/libraries/latest -logger humantags -fqbn arduino:avr:uno -build-cache /tmp -build-path /tmp/158826676/build -verbose -prefs runtime.tools.avr-gcc.path=./opt/tools/avr-gcc/5.4.0-atmel3.6.1-arduino2 -prefs runtime.tools.avrdude.path=./opt/tools/avrdude/6.3.0-arduino14 -prefs runtime.tools.arduinoOTA.path=./opt/tools/arduinoOTA/1.2.1 -libraries /tmp/158826676/custom -libraries /tmp/158826676/pinned /tmp/158826676/sketch_dec12a

Using library Wire at version 1.0 in folder: /home/ubuntu/opt/cores/arduino/avr/libraries/Wire

/tmp/158826676/sketch_dec12a/sketch_dec12a.ino:4:1: error: 'DS3231' does not name a type

DS3231 rtc; //Criação do objeto do tipo DS3231

^

/tmp/158826676/sketch_dec12a/sketch_dec12a.ino:5:1: error: 'RTCDateTime' does not name a type

RTCDateTime dataehora; //Criação do objeto do tipo RTCDateTime

^

/tmp/158826676/sketch_dec12a/sketch_dec12a.ino:26:1: error: 'rtc' does not name a type

rtc.setDateTime(_12_DATE_12_, _10_TIME_12_);

^

/tmp/158826676/sketch_dec12a/sketch_dec12a.ino: In function 'void setup()':

/tmp/158826676/sketch_dec12a/sketch_dec12a.ino:31:1: error: 'dataehora' was not declared in this scope

dataehora = rtc.getDateTime(); //Atribuindo valores instantâneos de

^

/tmp/158826676/sketch_dec12a/sketch_dec12a.ino:31:13: error: 'rtc' was not declared in this scope

dataehora = rtc.getDateTime(); //Atribuindo valores instantâneos de

^

exit status 1



compilei o projeto no arduino online e deu esta mensagem

giova014

#7
Dec 12, 2018, 03:55 pm Last Edit: Dec 12, 2018, 03:56 pm by giova014
Está faltando incluir a biblioteca do DS3231 (no começo do código):
Code: [Select]
#include <DS3231.h>

Caso não tenha esta biblioteca instalada, pergunte a quem fez o código para te fornecer a biblioteca que usou.

Em 10 segundos de pesquisa, encontrei 4 bibliotecas:
- DS3231 - Andrew Wickert
- DS3231 - Petre Rodan
- DS3231 - Korneliusz Jarzębski
- DS3231 - Rinky-Dink
Qual delas é a certa?
Arduino!!

renatokappa30

acho que ele não utilizou biblioteca mas fez código todo do 0

giova014

#9
Dec 12, 2018, 06:19 pm Last Edit: Dec 12, 2018, 06:21 pm by giova014
Quote
acho que ele não utilizou biblioteca mas fez código todo do 0
Realmente, pelo código ele utiliza nada da biblioteca para tomada de decisão.

Exclua as seguintes linhas:
Code: [Select]
DS3231 rtc;              //Criação do objeto do tipo DS3231
RTCDateTime dataehora;   //Criação do objeto do tipo RTCDateTime

Code: [Select]
rtc.setDateTime(_12_DATE_12_, _10_TIME_12_);
Code: [Select]
dataehora = rtc.getDateTime();     //Atribuindo valores instantâneos de
                                                         //data e hora à instância dataehora esta linha deve ser comentada após a primeira gravação no Arduino.


Teste novamente.

Dica: Use CTRL+T no Arduino IDE para formatar seu código, dói os olhos de ver essa bagunça.
Arduino!!

renatokappa30

boa noite
segue codigo

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(rele1, OUTPUT);
  digitalWrite(rele1, HIGH);
  pinMode(rele2, OUTPUT);
  digitalWrite(rele2, HIGH);
  pinMode(rele3, OUTPUT);
  digitalWrite(rele3, HIGH);
  pinMode(rele4, OUTPUT);
  digitalWrite(rele4, HIGH);
  ligarele1 = false;
  ligarele2 = false;
  ligarele3 = false;
  ligarele4 = 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)) {
    ligarele1 = true;
    digitalWrite(rele1, LOW);
  }
  if ((horas >= 8) and (minutos <= 30) and (!ligarele2)) {
    ligarele2 = true;
    digitalWrite(rele2, LOW);
  }
  if ((horas >= 9) and (minutos <= 00) and (!ligarele3)) {
    ligarele3 = true;
    digitalWrite(rele3, LOW);
  }
  if ((horas >= 9) and (minutos <= 30) and (!ligarele4)) {
    ligarele4 = true;
    digitalWrite(rele4, LOW);
  }

  if ((horas >= 20) and (minutos <= 00) and (ligarele1)) {
    ligarele1 = false;
    digitalWrite(rele1, HIGH);
  }
  if ((horas >= 20) and (minutos <= 30) and (ligarele2)) {
    ligarele2 = false;
    digitalWrite(rele2, HIGH);
  }
  if ((horas >= 21) and (minutos <= 00) and (ligarele3)) {
    ligarele3 = false;
    digitalWrite(rele3, HIGH);
  }
  if ((horas >= 21) and (minutos <= 30) and (ligarele4)) {
    ligarele4 = false;
    digitalWrite(rele4, HIGH);
  }


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






desta forma é a forma original a qual o programador me ajudou
dá certo compila
porem quando eu aplico no arduino e o rtc. meus reles ficam malucos e no monitor serial do arduino o horario fica maluco não respeitando a hora em sequancia.


a questão toda agora é
como fazer para o rtc respeitar a hora minutos e segundos???/

giova014

#11
Dec 13, 2018, 11:22 am Last Edit: Dec 13, 2018, 11:24 am by giova014
Quote
meus reles ficam malucos e no monitor serial do arduino o horario fica maluco não respeitando a hora em sequancia.
Copie e cole aqui o que aparece no terminal do Arduino depois de uns 5 minutos de funcionamento do programa (dentro de tags [ code]).

Confirme se este endereço está certo:
Code: [Select]
#define DS3231_ADDRESS 0x68
Arduino!!

renatokappa30

ok hoje noite faço.
como confirmar o endereço?

giova014

DS3231 - Datasheet na página 17 ele fala que o endereço é 1101000 em binário que é igual a 68 em hexadecimal, então seu código está certo.

Faça o primeiro passo do meu post anterior, que é pegar o que aparece no terminal
Arduino!!

renatokappa30

olá segue
Code: [Select]
Data: 30/85/105 Hora : 32:0:1Data: 0/21/80 Hora : 22:45:35Data: 1/1/0 Hora : 0:0:20, Segunda
, Terca
, Quarta
, Quinta
, Sexta
, Sabado
Data: 105/35/45 Hora : 30:11:112Data: 80/22/0 Hora : 0:88:22Data: 0/112/11 Hora : 1:1:0, Segunda
, Terca
, Quarta
, Quinta
, Sexta
, Sabado
Data: 45/22/88 Hora : 25:85:30Data: 0/0/1 Hora : 0:21:0Data: 11/30/85 Hora : 0:1:1Data: 88/0/21 Hora : 45:35:105Data: 1/1/1 Hora : 0:28:80, Domingo
, Segunda
, Terca
, Quarta
, Quinta
, Sexta
, Sabado
Data: 85/105/35 Hora : 11:112:0Data: 21/80/30 Hora : 8:22:45, Domingo
, Segunda
, Terca
, Quarta
, Quinta
, Sexta
, Sabado
Data: 1/0/112 Hora : 1:0:0, Segunda
, Terca
, Quarta
, Quinta
, Sexta
, Sabado
Data: 35/45/22 Hora : 45:30:11Data: 33/0/0 Hora : 21:0:88Data: 112/11/30 Hora : 1:1:1, Domingo
, Segunda
, Terca
, Quarta
, Quinta
, Sexta
, Sabado
Data: 22/88/0 Hora : 35:105:85Data: 0/1/1 Hora : 36:80:21, Domingo
, Segunda
, Terca
, Quarta
, Quinta
, Sexta
, Sabado
Data: 30/85/105 Hora : 32:0:1Data: 0/21/80 Hora : 22:45:35Data: 1/1/0 Hora : 0:0:39, Segunda
, Terca
, Quarta
, Quinta
, Sexta
, Sabado
Data: 105/35/45 Hora : 30:11:112Data: 80/41/0 Hora : 0:88:22Data: 0/112/11 Hora : 1:1:0, Segunda
, Terca
, Quarta
, Quinta
, Sexta
, Sabado
Data: 45/22/88 Hora : 25:85:30Data: 0/0/1 Hora : 0:21:0Data: 11/30/85 Hora : 0:1:1Data: 88/0/21 Hora : 45:35:105Data: 1/1/1 Hora : 0:47:80, Domingo
, Segunda
, Terca
, Quarta
, Quinta
, Sexta
, Sabado
Data: 85/105/35 Hora : 11:112:0Data: 21/80/49 Hora : 8:22:45, Domingo
, Segunda
, Terca
, Quarta
, Quinta
, Sexta
, Sabado
Data: 1/0/112 Hora : 1:0:0, Segunda
, Terca
, Quarta
, Quinta
, Sexta
, Sabado
Data: 35/45/22 Hora : 45:30:11Data: 52/0/0 Hora : 21:0:88Data: 112/11/30 Hora : 1:1:1, Domingo
, Segunda
, Terca
, Quarta
, Quinta
, Sexta
, Sabado
Data: 22/88/0 Hora : 35:105:85Data: 0/1/1 Hora : 15:80:21, Domingo
, Segunda
, Terca
, Quarta
, Quinta
, Sexta
, Sabado
Data: 30/85/105 Hora : 32:0:1Data: 0/21/80 Hora : 22:45:35Data: 1/1/0 Hora : 0:0:58, Segunda
, Terca
, Quarta
, Quinta
, Sexta
, Sabado
Data: 105/35/45 Hora : 30:11:112Data: 80/1/1 Hora : 0:88:22Data: 0/112/11 Hora : 1:1:0, Segunda
, Terca
, Quarta
, Quinta
, Sexta
, Sabado



pelo que entendi é o que você queria que aparecesse no monitor serial isso?

Go Up