collapse

* Links de Robótica

* Posts Recentes

Medir Agua que está no Poço por jm_araujo
[Hoje às 00:36]


URGENTE - display de 7 segmentos com backpack por helderjsd
[Ontem às 12:30]


Preços e fabricantes de pcb por Sérgio_Sena
[19 de Setembro de 2017, 10:20]


Palavras Cruzadas por Njay
[19 de Setembro de 2017, 02:24]


Isaac Asimov - I, Robot por senso
[18 de Setembro de 2017, 03:41]


Apresentação por TigPT
[17 de Setembro de 2017, 07:31]


ic SL440 da Plessey? por senso
[16 de Setembro de 2017, 13:11]


Compra Colectiva RS-Amidata por brunus
[15 de Setembro de 2017, 22:31]


Ideias para construir um quadrúpede simples por zordlyon
[15 de Setembro de 2017, 10:18]


Preparar bancada de testes por jm_araujo
[14 de Setembro de 2017, 10:24]

Autor Tópico: Arduino+RTC - Simulador de Presença Residencial  (Lida 9422 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline SoBraL-BR

  • Mini Robot
  • *
  • Mensagens: 14
    • Liga Oficial Pokémon de Blumenau
Arduino+RTC - Simulador de Presença Residencial
« 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á!!!

Offline samc

  • Mini Robot
  • *
  • Mensagens: 390
Re: Arduino+RTC - Simulador de Presença Residencial
« Responder #1 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
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

Offline SoBraL-BR

  • Mini Robot
  • *
  • Mensagens: 14
    • Liga Oficial Pokémon de Blumenau
Re: Arduino+RTC - Simulador de Presença Residencial
« Responder #2 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);

}

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.390
  • Helpdesk do sitio
Re: Arduino+RTC - Simulador de Presença Residencial
« Responder #3 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..
Avr fanboy

Offline tarquinio

  • Mini Robot
  • *
  • Mensagens: 529
Re: Arduino+RTC - Simulador de Presença Residencial
« Responder #4 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)

Offline SoBraL-BR

  • Mini Robot
  • *
  • Mensagens: 14
    • Liga Oficial Pokémon de Blumenau
Re: Arduino+RTC - Simulador de Presença Residencial
« Responder #5 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
// Before you need to install the library DS1307: 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);

}
« Última modificação: 29 de Abril de 2013, 04:17 por SoBraL-BR »

Offline samc

  • Mini Robot
  • *
  • Mensagens: 390
Re: Arduino+RTC - Simulador de Presença Residencial
« Responder #6 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);
}

Offline SoBraL-BR

  • Mini Robot
  • *
  • Mensagens: 14
    • Liga Oficial Pokémon de Blumenau
Re: Arduino+RTC - Simulador de Presença Residencial
« Responder #7 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
// Before you need to install the library DS1307: 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);

}

« Última modificação: 30 de Abril de 2013, 03:37 por SoBraL-BR »

Offline tarquinio

  • Mini Robot
  • *
  • Mensagens: 529
Re: Arduino+RTC - Simulador de Presença Residencial
« Responder #8 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);
« Última modificação: 30 de Abril de 2013, 05:37 por tarquinio »

Offline SoBraL-BR

  • Mini Robot
  • *
  • Mensagens: 14
    • Liga Oficial Pokémon de Blumenau
Re: Arduino+RTC - Simulador de Presença Residencial
« Responder #9 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
// Before you need to install the library DS1307: 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);

}


Offline SoBraL-BR

  • Mini Robot
  • *
  • Mensagens: 14
    • Liga Oficial Pokémon de Blumenau
Re: Arduino+RTC - Simulador de Presença Residencial
« Responder #10 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!

Offline tarquinio

  • Mini Robot
  • *
  • Mensagens: 529
Re: Arduino+RTC - Simulador de Presença Residencial
« Responder #11 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.

Offline SoBraL-BR

  • Mini Robot
  • *
  • Mensagens: 14
    • Liga Oficial Pokémon de Blumenau
Re: Arduino+RTC - Simulador de Presença Residencial
« Responder #12 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á?

Offline tarquinio

  • Mini Robot
  • *
  • Mensagens: 529
Re: Arduino+RTC - Simulador de Presença Residencial
« Responder #13 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]

Offline SoBraL-BR

  • Mini Robot
  • *
  • Mensagens: 14
    • Liga Oficial Pokémon de Blumenau
Re: Arduino+RTC - Simulador de Presença Residencial
« Responder #14 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. :)