Programa atualizado! 26/03/2016.

Fiz outro programa atualizado pra configurar a data/hora do RTC, bem como, outro programa para o simulador de presença, incluindo alguns recursos que antes nao tinha, como Sistema de Alarme, acionamento da bomba da piscina, e acesso remoto. Segue links:

Data/Hora RTC DS1307: http://labdegaragem.com/forum/topics/configurando-data-hora-do-seu-...

Sistema de Monitoramento Completo: http://labdegaragem.com/forum/topics/sistema-de-monitoramento-remot...

-----------------------------------------------

Versao antiga:

Pessoal,

Vi que o Sidney e outros estiveram tentando configurar o arduino para acionar algum rele/praticar alguma ação em determinado horario.

Segue abaixo o codigo que consegui testar e ficou redondinho.

Espero que ajude alguem. Abraço!

// 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[i]);
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);

}

Exibições: 5226

As respostas para este tópico estão encerradas.

Respostas a este tópico

Que bom que trabalhou o codigo.

Vou estudar e aprender mais.

Revisei o codigo e fiz algumas melhorias. Segue:

// Modificated by SoBraL - mr.sobral@hotmail.com

// Font: [url=http://arduino.cc/forum/index.php/topic,8833.0.html]http://arduino.cc/forum/index.php/topic,8833.0.html[/url]
// Before you need to install the library DS1307: [url=http://bricofoy.free.fr/forums/arduino/DS1307.zip]http://bricofoy.free.fr/forums/arduino/DS1307.zip[/url]

#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[i]);
Serial.print(" ");
}
Serial.println();
*/
delay(1000);

}

 

Por enquanto, mantendo esse algoritmo de vocês, deem uma pesquisada de como jogar todas essas programações em vetores (nem vou puxar o assunto de ponteiros por enquanto).

Uma matriz 5xN, onde 5 é o numero de parâmetros setados pelo usuário na função MudaDispositivo e N é o número de programações (chamadas da função MudaDispositivo).

Senão, comecem pelo mais intuitivo: Vetores nomeados Dispositivo, estado, hora, min e sec, sendo percorridos com o uso de FOR.

Pra galera mais empolgada, já recomendo partir direto pro "typedef".

Exemplo: http://playground.arduino.cc/Code/ResourceFriendlyStructs

Jonatas,

o que você mostrou já é algo bem avancado. Gostei. Vou estudar.

Obrigado pela contribuição.

Boa dica Jonatas,

Mas o programa atual ja esta usando a logica de vetores/ponteiros, certo?

Segue abaixo o programa atualizado e finalizado, onde implementei 2 sensores de presença para funcionar como alarme também. Amanhã vou instalar em casa.

Com isso, temos abaixo um "SIMULADOR DE PRESENÇA C/ SISTEMA DE ALARME INTEGRADO":

// 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 alarme1 = 7;
int alarme2 = 8;
int quarto = 9;
int banheiro = 10;
int radio = 11;
int sirene = 12;

int sensor1 = 0; //variavel para gravar o nivel de sinal do sensor
int sensor2 = 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(alarme1, INPUT);
pinMode(alarme2, 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.
}

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)
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 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;
}

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[i]);
Serial.print(" ");
}
Serial.println();
Serial.println(SSalarme);

delay(1000);
*/
}

Eu tentei usar uma biblioteca do DS1307 com a nova IDE do Arduino e sempre dava problema. Vou testar essa nova em casa. Obrigado por postar. Espero que funcione.

Mas que beleza.

Temos que aprimorar este programa. Parabens.

Valew mesmo mestre Sobral !!! pela clareca do post deu pra fazer meu 1307 rodar pela primeira vez apos umas 7 horas tentando buscar bibliotecas e explicativos na NET...Parabens!!!sou see fã...

achei muito interessante teu projeto , vc sabe como usar o ds no pic 18f4550 ?

att

deu erro aqui :  RTC.get(rtc,true);   

alguém sabe como resolver ?

Você não deve ter declarado a variável rtc no início do programa...

int rtc[7];

Estou com o mesmo problema e sinceramente não consegui resolver ...alguém pode nos ajudar ?

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço