LusoRobótica - Robótica em Português

Robótica => Iniciantes => Tópico iniciado por: SoBraL-BR em 26 de Abril de 2013, 01:06

Título: Arduino+RTC - Simulador de Presença Residencial
Enviado por: SoBraL-BR em 26 de Abril de 2013, 01:06
Boa noite pessoal,
Gostaria de uma ajudinha para iniciar um simulador de presença residencial, ou seja, atuar relés para acender e apagar lampadas da casa enquanto eu nao estiver em casa.

Tenho os seguintes itens:
- Arduino Duemilanove;
- 1 shield RTC DS1307 I2C;
- 3 shields relay 5v;

Alguem poderia postar um codigo modelo para configurar a hora no RTC e fazer o acionamento de um relay as 20h05 por exemplo?

Nao vou usar display LCD e nao vou utilizar leitura serial. Gostaria apenas do codigo mais simples e facil de ser entendido possivel.
Aguardo. Obrigado desde já!!!
Título: Re: Arduino+RTC - Simulador de Presença Residencial
Enviado por: samc em 26 de Abril de 2013, 12:11
Um site bom para encontrares código e ajuda para esses problemas específicos é o fórum oficial do arduino que já conta com muitos post e um grande número de users. Pesquisei rapidamente sobre o que pretendes e logo nos primeiros resultados encontrei isto:
http://arduino.cc/forum/index.php?topic=143730.0 (http://arduino.cc/forum/index.php?topic=143730.0)
tens lá bases que podes utilizar para te guiar, o código é simples para esse projeto e apenas precisas de utilizar a biblioteca e uma comparação para o valor do tempo
Título: Re: Arduino+RTC - Simulador de Presença Residencial
Enviado por: SoBraL-BR em 27 de Abril de 2013, 17:32
Amigos,
Consegui configurar o RTC. Agora só falta descobrir como acionar uma saída fazendo a leitura da hora.
Vejam abaixo oque eu tentei, mas nao deu certo... provavelmente porque ele nao deve ler o segundo "22" da maneira que eu coloquei. Se alguem puder ajudar.

#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h>

int rtc[7];
int rele = 10;
int led = 13;

void setup()
{
  Serial.begin(9600);
   pinMode(rele, OUTPUT); //define o pino 10 como saída
   pinMode(led, OUTPUT);
   digitalWrite (rele, LOW);
   digitalWrite(led, LOW);
/*
  RTC.stop();
  RTC.set(DS1307_SEC,1);
  RTC.set(DS1307_MIN,42);
  RTC.set(DS1307_HR,12);
  RTC.set(DS1307_DOW,4);
  RTC.set(DS1307_DATE,27);
  RTC.set(DS1307_MTH,4);
  RTC.set(DS1307_YR,13);
  RTC.start();
*/
}

void loop()
{
  RTC.get(rtc,true);

  for(int i=0; i<7; i++)
  {
    Serial.print(rtc);
    Serial.print(" ");
  }
  Serial.println();
 
  if (digitalRead(rtc[0]) == 22) {
  digitalWrite(rele, HIGH);
  digitalWrite(led, HIGH);
  }
  delay(1000);

}
Título: Re: Arduino+RTC - Simulador de Presença Residencial
Enviado por: senso em 27 de Abril de 2013, 17:57
Esse digitalRead está ai a fazer o quê mesmo?
O digitalRead é para ler um pino do micro, não é para ler um array..
Título: Re: Arduino+RTC - Simulador de Presença Residencial
Enviado por: tarquinio em 27 de Abril de 2013, 19:01
Assumindo que a leitura está a ser bem feita e que os segundos estão na posição 0 do array, queres fazer apenas algo do tipo

if (rtc[0] == 22)
Título: Re: Arduino+RTC - Simulador de Presença Residencial
Enviado por: SoBraL-BR em 29 de Abril de 2013, 04:02
Uhull!!  ;D
tarquinio, muito obrigado!!! Deu certo!

Agora posso fazer finalizar meu simulador de presença residencial! Esses comandos funcionaram perfeitamente!
Obrigado!
Segue abaixo o codigo, caso alguem precise de um modelo algum dia... mas nao esqueca de instalar a biblioteca
Abraço!

Citar
// Modificated by SoBraL - mr.sobral@hotmail.com
// Font: http://arduino.cc/forum/index.php/topic,8833.0.html (http://arduino.cc/forum/index.php/topic,8833.0.html)
// Before you need to install the library DS1307: http://bricofoy.free.fr/forums/arduino/DS1307.zip (http://bricofoy.free.fr/forums/arduino/DS1307.zip)

#include <WProgram.h> //é um recurso para referenciar a biblioteca Wiring
#include <Wire.h> //inclui a biblioteca Wire necessaria para comunicaçao i2c
#include <DS1307.h> //inclui a biblioteca de comandos do DS1307 utilizada neste programa. Necessário baixá-la no link acima

int rtc[7];
int rele = 10;
int led = 13;

void setup()
{
Serial.begin(9600);
pinMode(rele, OUTPUT); //define o pino 10 como saída
pinMode(led, OUTPUT); //define o led (pino 13) do arduino como como saída
digitalWrite (rele, LOW); //desliga relé
digitalWrite(led, LOW); //desliga led

/*
Esta sequencia de comandos deve ser escrita apenas uma vez, para
configurar a hora do Shield RTC 1307. Troque os numeros pela hora atual

RTC.stop();
RTC.set(DS1307_SEC,1);        //define o segundo
RTC.set(DS1307_MIN,20);     //define o minuto
RTC.set(DS1307_HR,12);       //define a hora
RTC.set(DS1307_DOW,1);       //define o dia da semana
RTC.set(DS1307_DATE,28);       //define o dia
RTC.set(DS1307_MTH,4);        //define o mes
RTC.set(DS1307_YR,13);         //define o ano
RTC.start();
*/
}

void loop()
{
RTC.get(rtc,true);

/*
Comando utilizado apenas pra ficar enviando via USB a hora atual
para que possam monitorar no "serial monitor" do simulador Arduino
e ver se esta tudo funcionando de acordo
*/

for(int i=0; i<7; i++)
{
    Serial.print(rtc);
    Serial.print(" ");
}
Serial.println();

/*
O codigo abaixo significa que, quando o RTC estiver no segundo 22,
ele irá acionar o relé e o led. Para utilizar o minuto como referencia,
alterar rtc[0] para rtc[1], e assim sussecivamente
*/

if (rtc[0] == 22) {
digitalWrite(rele, HIGH);
digitalWrite(led, HIGH);
}
delay(1000);

}
Título: Re: Arduino+RTC - Simulador de Presença Residencial
Enviado por: samc em 29 de Abril de 2013, 11:19
Ainda bem que conseguiste colocar tudo a funcionar. Como tinha dito é algo simples e há muita documentação sobre esse assunto ;-)

No entanto, mesmo sem nunca ter utilizado essa biblioteca penso que tenhas aí alguns erros no código. No ciclo for acho que devia estar a chamada ao vetor para mostrar os diversos dados e não 7 vezes o mesmo (penso eu). Outra sugestão é usares o operador AND para definires uma hora para ligar e outra para desligar.

Código: [Seleccione]
for(int i=0; i<7; i++)
{
    Serial.print(rtc[i]); // print os vários valores
    Serial.print(" ");
}

// ligar às 22:22:22
if (rtc[2] == 22 && rtc[1] == 22 && rtc[0] == 22) {
digitalWrite(rele, HIGH);
digitalWrite(led, HIGH);
}
// desligar às 11:11:11
if (rtc[2] == 11 && rtc[1] == 11 && rtc[0] == 11) {
digitalWrite(rele, LOW);
digitalWrite(led, LOW);
}
Título: Re: Arduino+RTC - Simulador de Presença Residencial
Enviado por: SoBraL-BR em 30 de Abril de 2013, 03:17
Obrigado samc!
Segue o codigo que terminei simulando a presença na minha casa.
Com certeza tem formas melhores de colocar os comandos, mas como eu nao tenho muita experiencia em programaçao, tive que fazer assim mesmo.

Acredito estar tudo certo, mas se alguem puder dar alguma sugestão de melhoria... não gostei muito de como ficou as diversas condiçoes dentro do "if", mas pareceu funcionar.

Citar
// Modificated by SoBraL - mr.sobral@hotmail.com
// Font: http://arduino.cc/forum/index.php/topic,8833.0.html (http://arduino.cc/forum/index.php/topic,8833.0.html)
// Before you need to install the library DS1307: http://bricofoy.free.fr/forums/arduino/DS1307.zip (http://bricofoy.free.fr/forums/arduino/DS1307.zip)

#include <WProgram.h> //é um recurso para referenciar a biblioteca Wiring
#include <Wire.h> //inclui a biblioteca Wire necessaria para comunicaçao i2c
#include <DS1307.h> //inclui a biblioteca de comandos do DS1307 utilizada neste programa. Necessário baixá-la no link acima

int rtc[6];
int quarto = 10;
int banheiro = 11;
int radio = 12;

void setup()
{
Serial.begin(9600);
for (int pino = 10; pino <= 14; pino++) {
pinMode(pino, OUTPUT); // configura pinos 10 ao 13 como saída
digitalWrite(pino, LOW); // desliga pinos 10 ao 13
}

/*
Esta sequencia de comandos deve ser escrita apenas uma vez, para
configurar a hora do Shield RTC 1307. Troque os numeros pela hora atual

RTC.stop();
RTC.set(DS1307_SEC,1);        //define o segundo rtc[0]
RTC.set(DS1307_MIN,33);     //define o minuto rtc[1]
RTC.set(DS1307_HR,0);       //define a hora rtc[2]
RTC.set(DS1307_DOW,1);       //define o dia da semana rtc[3]
RTC.set(DS1307_DATE,29);       //define o dia rtc[4]
RTC.set(DS1307_MTH,4);        //define o mes rtc[5]
RTC.set(DS1307_YR,13);         //define o ano rtc[6]
RTC.start();
*/
}

void loop()
{
RTC.get(rtc,true);

//Liga o rádio por 20 minutos às 9:40 e às 14:40
if (rtc[2] == 9 && rtc[1] == 40 || rtc[2] == 14 && rtc[1] == 40) {
  digitalWrite(radio,HIGH);
  if (rtc[2] == 10 || rtc[2] == 15) {
  digitalWrite(radio,LOW);
  }
}

//Acende as lampadas e liga radio durante a noite
if (rtc[2] == 20 && rtc[1] == 40 || rtc[2] == 22 && rtc[1] == 30) {
  digitalWrite(quarto,HIGH);
  digitalWrite(radio,HIGH);
  delay(20000);
  digitalWrite(banheiro,HIGH);
  if (rtc[1] == 45){
    digitalWrite(banheiro,LOW);
  }
  if (rtc[2] == 21) {
    digitalWrite(quarto,LOW);
  }
  if (rtc[2] == 22 && rtc[1] == 45) {
    digitalWrite(quarto,LOW);
    digitalWrite(radio,LOW);
  }
}

//Simula ir ao banheiro de madrugada
if (rtc[2] == 2 && rtc[0] == 1 || rtc[2] == 4 && rtc[0] == 1 ) {
  digitalWrite(quarto,HIGH);
  delay(10000);
  digitalWrite(banheiro,HIGH);
  delay(50000);
  digitalWrite(banheiro,LOW);
  delay(10000);
  digitalWrite(quarto,LOW);
}

//Acender luz do banheiro esporadicamente
if (rtc[2] == 19 && rtc[0] == 1 || rtc[2] == 19 && rtc[1] == 30 && rtc[0] == 1 || rtc[2] == 20 && rtc[0] == 1 || rtc[2] == 23 && rtc[1] == 30 && rtc[0] == 1) {
  digitalWrite(banheiro,HIGH);
  delay(20000);
  digitalWrite(banheiro,LOW);
}

/*
Comando utilizado apenas pra ficar enviando via USB a hora atual
para que possam monitorar no "serial monitor" do simulador Arduino
e ver se esta tudo funcionando de acordo
*/
/*
for(int i=0; i<6; i++)
{
    Serial.print(rtc);
    Serial.print(" ");
}
Serial.println();
*/

delay(1000);

}

Título: Re: Arduino+RTC - Simulador de Presença Residencial
Enviado por: tarquinio em 30 de Abril de 2013, 05:28
Podes tornar tudo bastante mais legivel e mais curto com uma função do tipo:

Código: [Seleccione]
void activaDispositivo(byte dispositivo, byte estado, byte hora, byte minuto, byte segundo, int* rtc)
{
    if ( rtc[0]==hora && rtc[1]==minuto && rtc[2]==segundo ) digitalWrite(dispositivo, estado);
}

depois no main é so fazeres linhas do tipo:
Código: [Seleccione]
    activaDispositivo(banheiro, HIGH, 2, 23, 45, rtc);
    activaDispositivo(banheiro, LOW, 2, 33, 45, rtc);
Título: Re: Arduino+RTC - Simulador de Presença Residencial
Enviado por: SoBraL-BR em 01 de Maio de 2013, 04:14
Obrigado tarquino!
Otima dica!
Pra quem quiser ver, segue o codigo revisado e completo para a simulação de presença residencial:

Citar
// Modificated by SoBraL - mr.sobral@hotmail.com
// Font: http://arduino.cc/forum/index.php/topic,8833.0.html (http://arduino.cc/forum/index.php/topic,8833.0.html)
// Before you need to install the library DS1307: http://bricofoy.free.fr/forums/arduino/DS1307.zip (http://bricofoy.free.fr/forums/arduino/DS1307.zip)

#include <WProgram.h> //é um recurso para referenciar a biblioteca Wiring
#include <Wire.h> //inclui a biblioteca Wire necessaria para comunicaçao i2c
#include <DS1307.h> //inclui a biblioteca de comandos do DS1307 utilizada neste programa. Necessário baixá-la no link acima

int rtc[6];
int quarto = 9;
int banheiro = 10;
int radio = 11;

void setup()
{
Serial.begin(9600);
for (int pino = 9; pino <= 13; pino++) {
pinMode(pino, OUTPUT); // configura pinos 10 ao 13 como saída
digitalWrite(pino, LOW); // desliga pinos 10 ao 13
}
/* Esta sequencia de comandos deve ser escrita apenas uma vez, para
configurar a hora do Shield RTC 1307. Troque os numeros pela hora atual

RTC.stop();
RTC.set(DS1307_SEC,1);        //define o segundo rtc[0]
RTC.set(DS1307_MIN,33);     //define o minuto rtc[1]
RTC.set(DS1307_HR,0);       //define a hora rtc[2]
RTC.set(DS1307_DOW,1);       //define o dia da semana rtc[3]
RTC.set(DS1307_DATE,29);       //define o dia rtc[4]
RTC.set(DS1307_MTH,4);        //define o mes rtc[5]
RTC.set(DS1307_YR,13);         //define o ano rtc[6]
RTC.start();
*/
}

void MudaDispositivo(byte dispositivo, byte estado, byte hora, byte minuto, byte segundo, int* rtc) {
    if ( rtc[2] == hora  &&  rtc[1] == minuto && rtc[0] == segundo )
    digitalWrite(dispositivo, estado);
}

void loop()
{
RTC.get(rtc,true);

//Simula presença durante o dia
MudaDispositivo(radio, HIGH, 9, 40, 10, rtc);
MudaDispositivo(radio, LOW, 10, 20, 10, rtc);
MudaDispositivo(radio, HIGH, 14, 45, 10, rtc);
MudaDispositivo(radio, LOW, 15, 20, 10, rtc);
MudaDispositivo(radio, HIGH, 16, 30, 10, rtc);
MudaDispositivo(radio, LOW, 16, 55, 10, rtc);

//Simula presença de noite
MudaDispositivo(banheiro, HIGH, 18, 40, 10, rtc);
MudaDispositivo(banheiro, LOW, 18, 43, 10, rtc);
MudaDispositivo(quarto, HIGH, 18, 43, 20, rtc);
MudaDispositivo(radio, HIGH, 18, 55, 10, rtc);
MudaDispositivo(quarto, LOW, 18, 58, 10, rtc);
MudaDispositivo(quarto, HIGH, 19, 40, 10, rtc);
MudaDispositivo(banheiro, HIGH, 19, 40, 30, rtc);
MudaDispositivo(banheiro, LOW, 19, 41, 40, rtc);
MudaDispositivo(quarto, LOW, 19, 42, 10, rtc);
MudaDispositivo(radio, LOW, 20, 5, 10, rtc);

MudaDispositivo(quarto, HIGH, 20, 10, 10, rtc);
MudaDispositivo(quarto, LOW, 20, 10, 40, rtc);
MudaDispositivo(banheiro, HIGH, 20, 10, 50, rtc);
MudaDispositivo(banheiro, LOW, 20, 11, 20, rtc);
MudaDispositivo(quarto, HIGH, 20, 20, 50, rtc);
MudaDispositivo(quarto, LOW, 20, 21, 20, rtc);
MudaDispositivo(banheiro, HIGH, 20, 45, 40, rtc);
MudaDispositivo(banheiro, LOW, 20, 46, 10, rtc);

MudaDispositivo(quarto, HIGH, 21, 10, 10, rtc);
MudaDispositivo(banheiro, HIGH, 21, 11, 10, rtc);
MudaDispositivo(banheiro, LOW, 21, 15, 10, rtc);
MudaDispositivo(radio, HIGH, 21, 15, 40, rtc);
MudaDispositivo(quarto, LOW, 21, 16, 10, rtc);
MudaDispositivo(quarto, HIGH, 22, 10, 10, rtc);
MudaDispositivo(quarto, LOW, 22, 10, 50, rtc);
MudaDispositivo(radio, LOW, 22, 16, 10, rtc);

//Simula colocar pijama e escovar os dentes
MudaDispositivo(quarto, HIGH, 22, 40, 10, rtc);
MudaDispositivo(banheiro, HIGH, 22, 41, 10, rtc);
MudaDispositivo(banheiro, LOW, 22, 43, 10, rtc);
MudaDispositivo(quarto, LOW, 22, 43, 30, rtc);

MudaDispositivo(quarto, HIGH, 23, 40, 10, rtc);
MudaDispositivo(banheiro, HIGH, 23, 40, 30, rtc);
MudaDispositivo(banheiro, LOW, 23, 41, 20, rtc);
MudaDispositivo(quarto, LOW, 23, 41, 40, rtc);

//Simula presença de madrugada
MudaDispositivo(quarto, HIGH, 2, 10, 10, rtc);
MudaDispositivo(banheiro, HIGH, 2, 10, 30, rtc);
MudaDispositivo(banheiro, LOW, 2, 11, 20, rtc);
MudaDispositivo(quarto, LOW, 2, 11, 40, rtc);

MudaDispositivo(quarto, HIGH, 4, 10, 10, rtc);
MudaDispositivo(banheiro, HIGH, 4, 10, 30, rtc);
MudaDispositivo(banheiro, LOW, 4, 11, 20, rtc);
MudaDispositivo(quarto, LOW, 4, 11, 40, rtc);

MudaDispositivo(quarto, HIGH, 6, 10, 10, rtc);
MudaDispositivo(banheiro, HIGH, 6, 10, 30, rtc);
MudaDispositivo(banheiro, LOW, 6, 11, 20, rtc);
MudaDispositivo(quarto, LOW, 6, 11, 40, rtc);

/*
Comando utilizado apenas pra ficar enviando via USB a hora atual
para que possam monitorar no "serial monitor" do simulador Arduino
e ver se esta tudo funcionando de acordo


for(int i=0; i<6; i++){
    Serial.print(rtc);
    Serial.print(" ");
  }
Serial.println();
*/
delay(1000);

}

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg542.imageshack.us%2Fimg542%2F2562%2Fimg20130429wa0007.jpg&hash=2f3e3640a0a86d97465efd5448da82a5778d11df)
Título: Re: Arduino+RTC - Simulador de Presença Residencial
Enviado por: SoBraL-BR em 02 de Maio de 2013, 22:54
Pessoal,
Só queria mais um auxilio. Queria colocar 2 sensores de presença para funcionar como alarme também, junto com este programa. Só tem um porém: estes sensores nao tem o timer para ajuste do tempo que fica acionado, com isso, o que eu poderia fazer para manter a sirene ligada sem parar o restante do programa?

Segue o codigo que pretendo inserir antes do RTCget:
Citar
void loop()
{
//ALARME - Os sensores ficam sempre HIGH. Quando ele detecta movimento, cortam o sinal (LOW)
sensor1 = digitalRead(alarme1);
sensor2 = digitalRead(alarme2);

if (sensor1 == LOW || sensor2 == LOW){
  digitalWrite(sirene, HIGH);
   }
else{
  digitalWrite(sirene, LOW); //faltou fazer o delay pra sirene ficar ligada +/- 1 minuto, porque do jeito que ta o sensor fica acionado por apenas 5segundos
  }
 
RTC.get(rtc,true);
...continua como antes...

Aguardo ajuda. Obrigado!
Título: Re: Arduino+RTC - Simulador de Presença Residencial
Enviado por: tarquinio em 02 de Maio de 2013, 23:32
É bastante parecido, basta só definires uma flag e umas variáveis com a hora de desligar. Por exemplo:

Código: [Seleccione]
//ALARME - Os sensores ficam sempre HIGH. Quando ele detecta movimento, cortam o sinal (LOW)
sensor1 = digitalRead(alarme1);
sensor2 = digitalRead(alarme2);

if (sensor1 == LOW || sensor2 == LOW)
{
    digitalWrite(sirene, HIGH);
    sirene_ligada = true;
    segundo_desligar_sirene = rtc[0] + 30;
    minuto_desligar_sirene = rtc[1];
    hora_desligar_sirene = rtc[2];
}

if (sirene_ligada)
{
 if ( rtc[2] == hora_desligar_sirene  &&  rtc[1] == minuto_desligar_sirene && rtc[0] == segundo_desligar_sirene )
    digitalWrite(sirene, LOW);
    sirene_ligada = false;
}

Isto seria a idéia base da coisa... O unico problema deste dódigo é terem de ser feitos uma data de contas por causa dos overflows. Por exemplo no codigo que coloquei só funciona bem entre os 0 e os 29 segundos de cada minuto, fazendo as coisas desta maneira tens de verificar se passou de minuto, de hora... E mais tarde se quiseres fazer mais coisas e por datas à mistura, tens de ver se passou de dia, mes, etc...

Acho que seria boa ideia explorares a library Time do arduino, e ver por exemplo o sketch TimeRTC, já tem o código todo para interagir com esses relogios. Ainda mais importante, já tem métodos para converter o tempo numa variavel que representa o número de segundos desde as 0:00 de 1 de Janeiro de 1970. Isto dá mesmo bastante jeito porque evita estar a fazer um monte verificações complicadas no nosso código.
Se quiseres agendar algo para 5 minutos é só fazer time = time + 5*50 (os calsulos são todos em segundos)
Se quiseres avancar 3 dias, é so fazer time = time + 3*24*60*60
Acho que vale a pena veres os exemplos desta library com calma porque simplifica bastante as coisas a longo prazo.
Título: Re: Arduino+RTC - Simulador de Presença Residencial
Enviado por: SoBraL-BR em 02 de Maio de 2013, 23:49
Legal,
Obrigado pelas dicas!
Antes de ver a sua resposta, estive testando aqui e me pareceu funcionar direitinho até agora, o seguinte comando:

Citar
void loop()
{
//ALARME - Os sensores ficam sempre HIGH. Quando ele detecta movimento, cortam o sinal (LOW)

RTC.get(rtc,true);

sensor1 = digitalRead(alarme1);
sensor2 = digitalRead(alarme2);

if (sensor1 == LOW || sensor2 == LOW){
   digitalWrite(sirene, HIGH);
    mmalarme = ++rtc[1];
   }
   else if (mmalarme == rtc[1]){
     digitalWrite(sirene, LOW);
     mmalarme = 60; //coloca um valor que nao existe no mmalarme pra nao ficar desligando a sirene em vão     
   }
 
RTC.get(rtc,true);

//Simula presença durante o dia
...continua...

Uma coisa que eu nao consegui entender: se eu nao coloco a linha "RTC.get(rtc,true);" depois desses comandos if/else que coloquei para o alarme, a impressão do ano 2013 fica errada... invés de imprimir o 2013, ele imprime o nivel do pino 7 do arduino (alarme1).  Porque será?
Título: Re: Arduino+RTC - Simulador de Presença Residencial
Enviado por: tarquinio em 03 de Maio de 2013, 00:16
Eu nem sequer percebo onde é que está a ser impressa a data/hora...
Tens isto no fim do código:
Código: [Seleccione]
for(int i=0; i<6; i++)
{
    Serial.print(rtc);
    Serial.print(" ");
}
Mas isto supostamente imprime 6x o mesmo valor... O que tu queres provávemente é
Código: [Seleccione]
for(int i=0; i<7; i++)  // Acho que tem de ir até 7 porque costuma ter o dia da semana pelo meio, ms n tenho a certeza
{
    Serial.print(rtc[i]);
    Serial.print(" ");
}

Quanto ao código que tu fizeste, mais +- o mesmo que o que eu mostrei, só que ainda acrescenta outro bug :P
Primeiro, estás a dizer para o alarme se desligar 1 minuto depois... Mas assim se ele começa a tocar aos 59 minutos, vai desligar-se no minuto 60, ou seja, nunca!

Alem disso, ao fazeres
Código: [Seleccione]
mmalarme = ++rtc[1];
Estás básicamente a adiantar o relogio 1 minuto para todas as contas que vem a seguir... Qdo muito deverias fazer
Código: [Seleccione]
mmalarme = rtc[1] + 1;

E para acabar... não deves fazer delay(1000), isso pode causar saltos no tempo de 2 segundos, porque o código ainda demora algum tempo a ser executado. Imagina que o loop todo demora por exemplo 10ms a ser executado. Mais o delay fica em 1010ms. Isto significa que de vez em quando ele irá dar saltos de 2 segundos, se o segundo mudar logo a seguir a ser feita a leitura do tempo. Porque como o loop demora mais de um segundo, quando for feita a proxima leitura já passou um segundo adicional, e qualquer acção que quisesses fazer naquele segundo exacto será perdida.[/code]
Título: Re: Arduino+RTC - Simulador de Presença Residencial
Enviado por: SoBraL-BR em 03 de Maio de 2013, 01:14
Hehe, segue as minhas respostas aos seus comentarios:

Citar
for(int i=0; i<6; i++)
{
    Serial.print(rtc);
    Serial.print(" ");
}
Este código vai imprimir a hora atual com um espaço a cada posiçao do rtc:
segundo minuto hora semana dia mes ano

Sobre o codigo do alarme:
Citar
if (sensor1 == LOW || sensor2 == LOW){
   digitalWrite(sirene, HIGH);
    mmalarme = ++rtc[1];
   }
   else if (mmalarme == rtc[1]){
     digitalWrite(sirene, LOW);
     mmalarme = 60; //coloca um valor que nao existe no mmalarme pra nao ficar desligando a sirene em vão     
   }
Quando ele ligar a sirene, vai colocar na variavel "mmalarme" a hora atual somada +1 minuto. Desta forma, quando a hora atual entrar no minuto seguinte do acionamento da sirene, ele vai desligar a sirene. O "mmalarme = 60" é só um valor default pro programa nao ficar executando a condiçao abaixo do else if, já que nao existe o minuto "60" no rtc.
Nao sei se consegui ser claro?

E sobre o delay 1000, é temporario, só para fins de teste mesmo, visto que quando colocar o programa em pratica, estarei eliminando o monitoramento da hora pela USB. :)

Título: Re: Arduino+RTC - Simulador de Presença Residencial
Enviado por: tarquinio em 03 de Maio de 2013, 03:08
Ok mas já testaste esta parte de imprimir a data?
Isso não pode estar a funcionar bem assim...
Não podes fazer Serial.print() de um vector sem indicar quais são as posições a imprimir... Por isso é que acho estranho não haver erros.
Código: [Seleccione]
      Serial.print(rtc);
Sendo rtc um vector, isto nem deveria compilar no arduino, muito menos imprimir os valores certos... No outro post perguntaste porque é que às vezes aquilo imprimia coisas estranhas... É por causa de coisas destas ;)

Citação de: SoBraL-BR
Quando ele ligar a sirene, vai colocar na variavel "mmalarme" a hora atual somada +1 minuto. Desta forma, quando a hora atual entrar no minuto seguinte do acionamento da sirene, ele vai desligar a sirene. O "mmalarme = 60" é só um valor default pro programa nao ficar executando a condiçao abaixo do else if, já que nao existe o minuto "60" no rtc.
Sim eu tinha percebido a idéia... Os dois erros que eu disse que aconteciam acontecem mesmo...
O primeiro erro... Se os sensores forem activados no minuto 59, ele liga a sirene e fica com o valor 60 na variável mmalarme. O que significa que a sirene se vai desligar quando os minutos forem=60, que nunca acontece, ou mais provávelmente quando um vizinho furioso for lá parti-la, porque ela tocou a noite inteira sen parar! :P
O segundo erro, como já referi no mail anterior é que quando fazes
Código: [Seleccione]
    mmalarme = ++rtc[1];
este código altera tanto a variável mmalarme como a posição 1 de rtc... O que significa que para todas as comparações que são feitas a seguir o tempo estará sempre adiantado um minuto.
Se tens dúvidas experimenta fazer
Código: [Seleccione]
      Serial.print(rtc[2]);
      int aux = ++rtc[2];
      Serial.print(rtc[2]);
e logo ves :P

Acredita, vale bem a pena aprender a trabalhar com a library Time do Arduino do que andar a fazer código para resolver estas coisas todas, principalmente se mais tarde quiseres fazer coisas com datas tambem.
Título: Re: Arduino+RTC - Simulador de Presença Residencial
Enviado por: SoBraL-BR em 03 de Maio de 2013, 23:26
Hehe,
Tens razão Tarquino. Obrigado pelas dicas... realmente poderia acontecer da sirene nunca desligar, hehe.

Veja as alteraçoes que eu fiz, e vejas se tem algum erro. Aparentemente pareceu tudo funcionar como previsto.
Em paralelo, vou estudar sobre a library de tempo conforme sugerido.
Obrigado!

Citar
//ALARME - Os sensores ficam sempre HIGH. Quando ele detecta movimento, cortam o sinal (LOW)
sensor1 = digitalRead(alarme1);
sensor2 = digitalRead(alarme2);

if (sensor1 == LOW || sensor2 == LOW){
  digitalWrite(sirene, HIGH);
   SSalarme = rtc[0];
   --SSalarme;
   }
if (SSalarme == rtc[0]){
  digitalWrite(sirene, LOW);
  SSalarme = 60; //coloca um valor que nao existe no mmalarme pra nao ficar desligando a sirene em vão     
  }
if (SSalarme == -1){
  SSalarme = 59;
  }

...continua...
Título: Re: Arduino+RTC - Simulador de Presença Residencial
Enviado por: tarquinio em 04 de Maio de 2013, 00:21
Sim assim dá para desenrascar, fica com um tempo fixo de 59 segundos.
Assim de repente não estou a ver nenhum problema que possa acontecer com esse código.
Título: Re: Arduino+RTC - Simulador de Presença Residencial
Enviado por: SoBraL-BR em 05 de Maio de 2013, 06:21
Tarquino,
Nas ultimas simulaçoes que eu fiz, apresentou o problema na imagem anexo abaixo.
Parece que o programa se perde na hora atual no momento em que é acionado um segundo relé.

Vou estudar o codigo e tentar descobrir o motivo disso acontecer.
Caso o motivo esteja mais claro pra voce, favor dar um toq. Abraço!

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimageshack.us%2Fa%2Fimg38%2F7213%2Ferroyk.png&hash=4ebc538021dc38c289c6347e4c9fb53473e788f2)

Programa completo:
Citar
// Modificated by SoBraL - mr.sobral@hotmail.com
// Font: http://arduino.cc/forum/index.php/topic,8833.0.html (http://arduino.cc/forum/index.php/topic,8833.0.html)
// Before you need to install the library DS1307: http://bricofoy.free.fr/forums/arduino/DS1307.zip (http://bricofoy.free.fr/forums/arduino/DS1307.zip)

#include <WProgram.h> //é um recurso para referenciar a biblioteca Wiring
#include <Wire.h> //inclui a biblioteca Wire necessaria para comunicaçao i2c
#include <DS1307.h> //inclui a biblioteca de comandos do DS1307 utilizada neste programa. Necessário baixá-la no link acima

int rtc[6];
int irfalarme = 8;
int quarto = 9;
int banheiro = 10;
int radio = 11;
int sirene = 12;

int sensor = 0; //variavel para gravar o nivel de sinal do sensor
int SSalarme = 60; //variavel para guardar o segundo atual que o sensor detectou movimento

void setup()
{
Serial.begin(9600);
pinMode(irfalarme, INPUT);
for (int pino = 9; pino <= 13; pino++) { // configura pinos 10 ao 13 como saída
  pinMode(pino, OUTPUT);
  digitalWrite(pino, LOW); // desliga pinos 10 ao 13
  }
/* Esta sequencia de comandos deve ser escrita apenas uma vez, para
configurar a hora do Shield RTC 1307. Troque os numeros pela hora atual

RTC.stop();
RTC.set(DS1307_SEC,10);        //define o segundo rtc[0]
RTC.set(DS1307_MIN,12);     //define o minuto rtc[1]
RTC.set(DS1307_HR,0);       //define a hora rtc[2]
RTC.set(DS1307_DOW,1);       //define o dia da semana rtc[3]
RTC.set(DS1307_DATE,2);       //define o dia rtc[4]
RTC.set(DS1307_MTH,5);        //define o mes rtc[5]
RTC.set(DS1307_YR,13);         //define o ano rtc[6]
RTC.start();
*/
RTC.get(rtc,true);
//delay(60000); //espera 60segundos para os sensores se estabilizarem e a pessoa trancar a casa sem disparos.
}

void MudaDispositivo(byte dispositivo, byte estado, byte hora, byte minuto, byte segundo, int* rtc) {
    if ( rtc[2] == hora  &&  rtc[1] == minuto && rtc[0] == segundo )
    digitalWrite(dispositivo, estado);
   }

void loop()
{
//ALARME - Os sensores ficam sempre HIGH. Quando ele detecta movimento, cortam o sinal (LOW)
sensor = digitalRead(irfalarme);

if (sensor == LOW){
  digitalWrite(sirene, HIGH);
   SSalarme = rtc[0];
   --SSalarme;
   }
if (SSalarme == rtc[0]){
  digitalWrite(sirene, LOW);
  SSalarme = 60; //coloca um valor que nao existe no ssalarme pra nao ficar desligando a sirene em vão no proximo loop.
  }
if (SSalarme == -1){ //garantir que nunca vai ficar com segundo -1, oque deixaria a sirene ligada enternamente
  SSalarme = 59;
  }

//Simula presença durante o dia
MudaDispositivo(radio, HIGH, 9, 40, 10, rtc);
MudaDispositivo(radio, LOW, 10, 20, 10, rtc);
MudaDispositivo(radio, HIGH, 14, 45, 10, rtc);
MudaDispositivo(radio, LOW, 15, 20, 10, rtc);
MudaDispositivo(radio, HIGH, 16, 30, 10, rtc);
MudaDispositivo(radio, LOW, 16, 55, 10, rtc);

//Simula presença de noite
MudaDispositivo(banheiro, HIGH, 18, 40, 10, rtc);
MudaDispositivo(banheiro, LOW, 18, 43, 10, rtc);
MudaDispositivo(quarto, HIGH, 18, 43, 20, rtc);
MudaDispositivo(radio, HIGH, 18, 55, 10, rtc);
MudaDispositivo(quarto, LOW, 18, 58, 10, rtc);
MudaDispositivo(quarto, HIGH, 19, 40, 10, rtc);
MudaDispositivo(banheiro, HIGH, 19, 40, 30, rtc);
MudaDispositivo(banheiro, LOW, 19, 41, 40, rtc);
MudaDispositivo(quarto, LOW, 19, 42, 10, rtc);
MudaDispositivo(radio, LOW, 20, 5, 10, rtc);

MudaDispositivo(quarto, HIGH, 20, 10, 10, rtc);
MudaDispositivo(quarto, LOW, 20, 10, 40, rtc);
MudaDispositivo(banheiro, HIGH, 20, 10, 50, rtc);
MudaDispositivo(banheiro, LOW, 20, 11, 20, rtc);
MudaDispositivo(quarto, HIGH, 20, 20, 50, rtc);
MudaDispositivo(quarto, LOW, 20, 21, 20, rtc);
MudaDispositivo(banheiro, HIGH, 20, 45, 40, rtc);
MudaDispositivo(banheiro, LOW, 20, 46, 10, rtc);

MudaDispositivo(quarto, HIGH, 21, 10, 10, rtc);
MudaDispositivo(banheiro, HIGH, 21, 11, 10, rtc);
MudaDispositivo(banheiro, LOW, 21, 15, 10, rtc);
MudaDispositivo(radio, HIGH, 21, 15, 40, rtc);
MudaDispositivo(quarto, LOW, 21, 16, 10, rtc);
MudaDispositivo(quarto, HIGH, 22, 10, 10, rtc);
MudaDispositivo(quarto, LOW, 22, 10, 50, rtc);
MudaDispositivo(radio, LOW, 22, 16, 10, rtc);

//Simula colocar pijama e escovar os dentes
MudaDispositivo(quarto, HIGH, 22, 40, 10, rtc);
MudaDispositivo(banheiro, HIGH, 22, 41, 10, rtc);
MudaDispositivo(banheiro, LOW, 22, 43, 10, rtc);
MudaDispositivo(quarto, LOW, 22, 43, 30, rtc);

MudaDispositivo(quarto, HIGH, 23, 40, 10, rtc);
MudaDispositivo(banheiro, HIGH, 23, 40, 30, rtc);
MudaDispositivo(banheiro, LOW, 23, 41, 20, rtc);
MudaDispositivo(quarto, LOW, 23, 41, 40, rtc);

//Simula presença de madrugada
MudaDispositivo(quarto, HIGH, 2, 10, 10, rtc);
MudaDispositivo(banheiro, HIGH, 2, 10, 30, rtc);
MudaDispositivo(banheiro, LOW, 2, 11, 20, rtc);
MudaDispositivo(quarto, LOW, 2, 11, 40, rtc);

MudaDispositivo(quarto, HIGH, 4, 10, 10, rtc);
MudaDispositivo(banheiro, HIGH, 4, 10, 30, rtc);
MudaDispositivo(banheiro, LOW, 4, 11, 20, rtc);
MudaDispositivo(quarto, LOW, 4, 11, 40, rtc);

MudaDispositivo(quarto, HIGH, 6, 10, 10, rtc);
MudaDispositivo(banheiro, HIGH, 6, 10, 30, rtc);
MudaDispositivo(banheiro, LOW, 6, 11, 20, rtc);
MudaDispositivo(quarto, LOW, 6, 11, 40, rtc);

/*
Comando utilizado apenas pra ficar enviando via USB a hora atual
para que possam monitorar no "serial monitor" do simulador Arduino
e ver se esta tudo funcionando de acordo
*/

MudaDispositivo(quarto, HIGH, 2, 20, 10, rtc);
MudaDispositivo(banheiro, HIGH, 2, 20, 15, rtc);
MudaDispositivo(radio, HIGH, 2, 20, 20, rtc);
MudaDispositivo(quarto, LOW, 2, 20, 40, rtc);
MudaDispositivo(banheiro, LOW, 2, 20, 45, rtc);
MudaDispositivo(radio, LOW, 2, 20, 50, rtc);

for(int i=0; i<=6; i++){
    Serial.print(rtc);
    Serial.print(" ");
  }
Serial.println();
Serial.println(SSalarme);

//delay(1000);

}
Título: Re: Arduino+RTC - Simulador de Presença Residencial
Enviado por: tarquinio em 05 de Maio de 2013, 07:08
Assim de repente a coisa unica coisa que vejo errada é o
Código: [Seleccione]
int rtc[6];
que devia ser:
Código: [Seleccione]
int rtc[7];
Nas primerias versões estava o valor certo, depois alteraste para o valor errado, não percebi porque... :P
Título: Re: Arduino+RTC - Simulador de Presença Residencial
Enviado por: SoBraL-BR em 05 de Maio de 2013, 16:34
Tinha feito rtc[6] só pra remover a impressao do dia da semana, mas enfim, deixei como estava e o problema persiste.

Voce chegou a analisar a biblioteca ds1307.h? Segue abaixo.

Ainda nao consegui resolver esse problema do relogio se perder (85 85 45 7...) depois que aciona o segundo rele... >.<

Citar
/*
 *
 ********************************************************************************************************
 *          DS1307.h     library for DS1307 I2C rtc clock            *
 ********************************************************************************************************
 *
 * Created by D. Sjunnesson 1scale1.com d.sjunnesson (at) 1scale1.com
 * Modified by bricofoy - bricofoy (at) free.fr
 *
 * Created with combined information from
 *  http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1180908809 (http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1180908809)
 *  http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1191209057 (http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1191209057)
 *
 * Big credit to  mattt (please contact me for a more correct name...) from the Arduino forum
 * which has written the main part of the library which I have modified
 *
 * Rev history :
 *
 * ??-??-??   - mattt & dsjunnesson    - creation
 * 19-feb-2012   - bricofoy       - added arduino 1.0 compatibility
 * 20-feb-2012   - bricofoy       - bugfix : time was not preserved when setting or stopping clock
 * 21-feb-2012   - bricofoy       - bugfix : preserve existing seconds when starting/stopping clock
 *
 *TODO: enable AM/PM
 *   enable square wave output
 *
 */


// ensure this library description is only included once
#ifndef DS1307_h
#define DS1307_h

// include types & constants of Wiring core API
// this "if" is for compatibility with both arduino 1.0 and previous versions
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif

// include types & constants of Wire ic2 lib
#include <../Wire/Wire.h>

#define DS1307_SEC 0
#define DS1307_MIN 1
#define DS1307_HR 2
#define DS1307_DOW 3
#define DS1307_DATE 4
#define DS1307_MTH 5
#define DS1307_YR 6

#define DS1307_BASE_YR 2000

#define DS1307_CTRL_ID B1101000  //DS1307

 // Define register bit masks
#define DS1307_CLOCKHALT B10000000

#define DS1307_LO_BCD  B00001111
#define DS1307_HI_BCD  B11110000

#define DS1307_HI_SEC  B01110000
#define DS1307_HI_MIN  B01110000
#define DS1307_HI_HR   B00110000
#define DS1307_LO_DOW  B00000111
#define DS1307_HI_DATE B00110000
#define DS1307_HI_MTH  B00110000
#define DS1307_HI_YR   B11110000

// library interface description
class DS1307
{
  // user-accessible "public" interface
  public:
    DS1307();
    void get(int *, boolean);
    int get(int, boolean);
    void set(int, int);
    void start(void);
    void stop(void);

  // library-accessible "private" interface
  private:
    byte rtc_bcd[7]; // used prior to read/set ds1307 registers;
    void read(void);
    void save(void);
};

extern DS1307 RTC;

#endif
Título: Re: Arduino+RTC - Simulador de Presença Residencial
Enviado por: senso em 05 de Maio de 2013, 16:44
Decoupling do circuito?
Relé tem diodo de free-wheling para não causar (ainda) mais ruido?
Título: Re: Arduino+RTC - Simulador de Presença Residencial
Enviado por: SoBraL-BR em 05 de Maio de 2013, 17:45
tem sim... voce consegue ver nas fotos que os relés sao daquele shield, com resistor, transistor e diodo.

O problema só pode estar acontecendo devido ao "void MudaDispositivo", pois peguei uma outra biblioteca do ds1307, e acontece a mesma coisa...

Eu não entendo tao bem como funciona o método de ponteiros, então não faço ideia porque o relógio porque o relogio esta se perdendo.  :-\
Título: Re: Arduino+RTC - Simulador de Presença Residencial
Enviado por: SoBraL-BR em 05 de Maio de 2013, 18:13
Pessoal,
Pode ser muita carga sendo absorvida da USB???

Eu fiz o teste aqui, apenas com a USB ligada, quando os 3 reles (que sao alimentados pelo pino 5v do arduino)  são acionados , ele bagunça a hora. Mas se eu mander a USB ligada e também conectar a fonte 5v na placa do arduino, o relogio se acerta!  :o

Alguem sabe explicar?

Acho que o problema se resolveu colocando a fonte 5v externa. Se alguem puder explicar o motivo disso...
Vou testar melhor, mas agora só de mais tarde. Abraço!
Título: Re: Arduino+RTC - Simulador de Presença Residencial
Enviado por: tarquinio em 05 de Maio de 2013, 22:28
Bom parece ser mesmo um problema qualquer de ruido no circuito então... Pelo menos já descobriste a causa.
De qualquer modo, em relação ao rtc[6], se quisesses imprimir menos um valor tinhas de decrementar um valor no for onde fazes o print, não no tamanho do vector.
Imprimir 6 posições quando existem 7 não tem problema, imprimir 7 quando só existem 7 já é mau... Já para não falar que a library usada espera que o vector tenha 7 posições, e só lhe dás um com 6 posições ele vai escrever coisas em posições que não devia.
Título: Re: Arduino+RTC - Simulador de Presença Residencial
Enviado por: SoBraL-BR em 07 de Maio de 2013, 01:00
Beleza Tarquino, mas nao concordei com esse problema. Ainda nao fez sentido pra mim o relogio se perder só pelo fato do segundo relé acionar.
Enfim, antes de saber a solução, acabei encontrando outra library do RTC, a qual me pareceu mais amigavel, tanto para configurar a hora, quanto na apresentaçao pela USB. Coloquei o link no cabeçalho do programa.
Sendo assim, segue abaixo o programa final, como tudo testado e funcionando:

Citar
/*
This program will to simulate presence of peoples in your house,
and will to monitor twice sensors PIR for alarm.
Modificated by SoBraL - mr.sobral@hotmail.com
Font: http://microcontrolandos.blogspot.com.br/2013/01/relogio-digital-com-arduino.html (http://microcontrolandos.blogspot.com.br/2013/01/relogio-digital-com-arduino.html)
Before you need to install the library DS1307: https://sites.google.com/site/microcontrolandos/arquivos/DS1307.zip (https://sites.google.com/site/microcontrolandos/arquivos/DS1307.zip)

Pin connections on DS1307 module:

[DS1307] <--> [Arduino]
5V       <--> 5V
GND      <--> GND
SQW      <--> (not connected)
SCL      <--> Analog Input 5
SDA      <--> Analog Input 4

This software is free software.
*/

#include <string.h>
#include <Wire.h>
#include <DS1307.h>

char dateTime[20];
int RTCValues[7];
int HoraAtiva[6];

int piralarme = 8;
int quarto = 9;
int banheiro = 10;
int radio = 11;
int sirene = 12;

int sensor = 0; //variavel para gravar o nivel de sinal do sensor
int SSalarme = 60; //variavel para guardar o segundo atual que o sensor detectou movimento. Nenhum movimento = 60.

void setup() {
  Serial.begin(9600);
   
  Serial.println("Configurando portas do Arduino...");
  pinMode(piralarme, INPUT);
  for (int pino = 9; pino <= 13; pino++) { // configura pinos 10 ao 13 como saída
    pinMode(pino, OUTPUT);
    digitalWrite(pino, LOW); // desliga pinos 10 ao 13
    }
  Serial.println("Pronto!");
  Serial.println("Lendo informacoes do RTC...");
  DS1307.begin();
  Serial.println("Pronto!");
  Serial.println("...Aguardando 1 minuto para deixares a residencia...");
  delay(60000);
  Serial.println("Pronto! Seu sistema de Alarme e Simulador de Presenca Residencial esta ativo!");
}

void MudaDispositivo(byte dispositivo, byte estado, byte hora, byte minuto, byte segundo, int* HoraAtiva) {
    if (RTCValues[4] == hora  &&  RTCValues[5] == minuto && RTCValues[6] == segundo)
    digitalWrite(dispositivo, estado);
    }

void loop() {
    DS1307.getDate(RTCValues); //busca hora atual no RTC
   
//ALARME - Os sensores ficam sempre HIGH. Quando detectam movimento, cortam o sinal (LOW)
sensor = digitalRead(piralarme);

if (sensor == LOW){
  digitalWrite(sirene, HIGH);
   SSalarme = RTCValues[6];
   --SSalarme;
   }
if (SSalarme == RTCValues[6]){
  digitalWrite(sirene, LOW);
  SSalarme = 60; //coloca um valor que nao existe no ssalarme pra nao ficar desligando a sirene em vão no proximo loop.
  }
if (SSalarme == -1){ //garantir que nunca vai ficar com segundo -1, oque deixaria a sirene ligada enternamente
  SSalarme = 59;
  }


//Simula presença durante o dia
MudaDispositivo(radio, HIGH, 9, 40, 10, HoraAtiva);
MudaDispositivo(radio, LOW, 10, 20, 10, HoraAtiva);
MudaDispositivo(radio, HIGH, 14, 45, 10, HoraAtiva);
MudaDispositivo(radio, LOW, 15, 20, 10, HoraAtiva);
MudaDispositivo(radio, HIGH, 16, 30, 10, HoraAtiva);
MudaDispositivo(radio, LOW, 16, 55, 10, HoraAtiva);

//Simula presença de noite
MudaDispositivo(banheiro, HIGH, 18, 40, 10, HoraAtiva);
MudaDispositivo(banheiro, LOW, 18, 43, 10, HoraAtiva);
MudaDispositivo(quarto, HIGH, 18, 43, 20, HoraAtiva);
MudaDispositivo(radio, HIGH, 18, 55, 10, HoraAtiva);
MudaDispositivo(quarto, LOW, 18, 58, 10, HoraAtiva);
MudaDispositivo(quarto, HIGH, 19, 40, 10, HoraAtiva);
MudaDispositivo(banheiro, HIGH, 19, 40, 30, HoraAtiva);
MudaDispositivo(banheiro, LOW, 19, 41, 40, HoraAtiva);
MudaDispositivo(quarto, LOW, 19, 42, 10, HoraAtiva);
MudaDispositivo(radio, LOW, 20, 5, 10, HoraAtiva);

MudaDispositivo(quarto, HIGH, 20, 10, 10, HoraAtiva);
MudaDispositivo(quarto, LOW, 20, 10, 40, HoraAtiva);
MudaDispositivo(banheiro, HIGH, 20, 10, 50, HoraAtiva);
MudaDispositivo(banheiro, LOW, 20, 11, 20, HoraAtiva);
MudaDispositivo(quarto, HIGH, 20, 20, 50, HoraAtiva);
MudaDispositivo(quarto, LOW, 20, 21, 20, HoraAtiva);
MudaDispositivo(banheiro, HIGH, 20, 45, 40, HoraAtiva);
MudaDispositivo(banheiro, LOW, 20, 46, 10, HoraAtiva);

MudaDispositivo(quarto, HIGH, 21, 10, 10, HoraAtiva);
MudaDispositivo(banheiro, HIGH, 21, 11, 10, HoraAtiva);
MudaDispositivo(banheiro, LOW, 21, 15, 10, HoraAtiva);
MudaDispositivo(radio, HIGH, 21, 15, 40, HoraAtiva);
MudaDispositivo(quarto, LOW, 21, 16, 10, HoraAtiva);
MudaDispositivo(quarto, HIGH, 22, 10, 10, HoraAtiva);
MudaDispositivo(quarto, LOW, 22, 10, 50, HoraAtiva);
MudaDispositivo(radio, LOW, 22, 16, 10, HoraAtiva);

//Simula colocar pijama e escovar os dentes
MudaDispositivo(quarto, HIGH, 22, 40, 10, HoraAtiva);
MudaDispositivo(banheiro, HIGH, 22, 41, 10, HoraAtiva);
MudaDispositivo(banheiro, LOW, 22, 43, 10, HoraAtiva);
MudaDispositivo(quarto, LOW, 22, 43, 30, HoraAtiva);

MudaDispositivo(quarto, HIGH, 23, 40, 10, HoraAtiva);
MudaDispositivo(banheiro, HIGH, 23, 40, 30, HoraAtiva);
MudaDispositivo(banheiro, LOW, 23, 41, 20, HoraAtiva);
MudaDispositivo(quarto, LOW, 23, 41, 40, HoraAtiva);

//Simula presença de madrugada
MudaDispositivo(quarto, HIGH, 2, 10, 10, HoraAtiva);
MudaDispositivo(banheiro, HIGH, 2, 10, 30, HoraAtiva);
MudaDispositivo(banheiro, LOW, 2, 11, 20, HoraAtiva);
MudaDispositivo(quarto, LOW, 2, 11, 40, HoraAtiva);

MudaDispositivo(quarto, HIGH, 4, 10, 10, HoraAtiva);
MudaDispositivo(banheiro, HIGH, 4, 10, 30, HoraAtiva);
MudaDispositivo(banheiro, LOW, 4, 11, 20, HoraAtiva);
MudaDispositivo(quarto, LOW, 4, 11, 40, HoraAtiva);

MudaDispositivo(quarto, HIGH, 6, 10, 10, HoraAtiva);
MudaDispositivo(banheiro, HIGH, 6, 10, 30, HoraAtiva);
MudaDispositivo(banheiro, LOW, 6, 11, 20, HoraAtiva);
MudaDispositivo(quarto, LOW, 6, 11, 40, HoraAtiva);

/*
Comando utilizado apenas pra ficar enviando via USB a hora atual
para que possam monitorar no "serial monitor" do simulador Arduino
e ver se esta tudo funcionando de acordo

    sprintf(dateTime, "20%02d-%02d-%02d %02d:%02d:%02d", RTCValues[0],
            RTCValues[1], RTCValues[2], RTCValues[4], RTCValues[5],
            RTCValues[6]);
    Serial.print(dateTime);
    Serial.print(" - day of week: ");
    Serial.println(RTCValues[3]);
   
    delay(1000);
 */
}
Título: Re: Arduino+RTC - Simulador de Presença Residencial
Enviado por: tarquinio em 07 de Maio de 2013, 02:31
Beleza Tarquino, mas nao concordei com esse problema. Ainda nao fez sentido pra mim o relogio se perder só pelo fato do segundo relé acionar.
Bem neste caso o problema aparentemente não era esse. Seja como for, nunca é boa idéia escrever em enderecos de memória que não estão bem alocados... Pode não acontecer nada, mas tambem podem fazer um programa passar-se completamente e/ou levar o arduino a fazer reset...
Não é facil explicar o porque a uma pessoa que esteja a começar a programar... Mas acredita que podem acontecer coisas muita estranhas e que não parecem ter nada a ver umas com as outras. Ainda pior, se tiveres a memória mal alocada as coisas às vezes até podem funcionar bem, mas podem dar problemas muito mais tarde, quando se estiver a trabalhar noutra parte do programa (mesmo que esta nova parte do programa esteja bem).
Título: Re: Arduino+RTC - Simulador de Presença Residencial
Enviado por: zotequi em 01 de Julho de 2014, 17:43
Olá. Vi um post de um RTC com Display LCD 20x4 que talvez possa ser útil: http://blog.filipeflop.com/modulos/rtc-ds1307-display-lcd-20x4-arduino.html (http://blog.filipeflop.com/modulos/rtc-ds1307-display-lcd-20x4-arduino.html)

Abraço!