Ir ao conteúdo

Posts recomendados

Postado

Olá pessoal, hoje um amigo meu pediu para que eu fizesse um sistema na casa dele onde um sensor de movimento que aciona a lâmpada fosse ligada automaticamente as 20:00 e desligasse as 5:00. Isso porque ele não quer que a lâmpada acenda quando alguém passa de dia ou antes desse horário. Dei a ideia de por um LDR para funcionar sozinho dependo da luminosidade do dia, mas ele disse que lá é quase sempre escuro, e que só quer a lâmpada acendendo nesse horário que é mais frequente sua chegada.

 

Pensei fazer isso com arduino, usando o seguinte código:

// Programação Timer sensorconst int Rele = 11; //Pino do Relevoid setup(){  Serial.begin(9600);  pinMode(Rele, OUTPUT); //Definido como saída}void loop(){  digitalWrite(Rele, HIGH); //Sensor acende  delay(32400000); //Espera 9 Horas  digitalWrite(Rele, LOW); //Sensor desliga  delay(54000000); //Espera 15 Horas}

Esse código só seria válido se o Arduino fosse ligado exatamente as 20:00, pois ele não interpreta o tempo real que se passa, mas sim quantos milisegundos (delay) se passaram depois que foi ligado. 

 

Gostaria de saber se há como fazer uma programação com o horário real, pois caso caia a energia, terá de ligar o arduino novamente no mesmo horário. Se for ligado as 5:00, terá apenas que inverter o delay e o estado do rele. Mas o mais interessante seria trabalhar com horário real. Há alguma ideia/biblioteca que auxilie nisso?

 

Obrigado!

Postado

@nick4xd,

Use um desses pequenos módulos de RTC, resolve todo o seu problema :

http://produto.mercadolivre.com.br/MLB-574631242-shield-relogio-tempo-real-arduino-i2c-rtc-ds1307bateria-_JM

Uma vez programado com o horário correto, ele irá manter com uma boa precisão o horário real, e basta ser lido pelo Arduíno quando a energia voltar .

Existem várias bibliotecas prontas para usar, basta procurar na Net.

Paulo

Postado

@aphawk

 

Certo, baixei uma biblioteca, e enquanto o shield não chega, gostaria de saber como adiciono essas linhas de códigos no exemplo:

digitalWrite(Rele, HIGH);...digitalWrite(Rele, LOW);

Quero acionar o Rele as 20:00 e desligar as 05:00.. Como eu faço isso no código de exemplo:

#include <Wire.h>#include <Time.h>#include <DS1307RTC.h>const char *monthName[12] = {  "Jan", "Feb", "Mar", "Apr", "May", "Jun",  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};tmElements_t tm;void setup() {  bool parse=false;  bool config=false;  // get the date and time the compiler was run  if (getDate(__DATE__) && getTime(__TIME__)) {    parse = true;    // and configure the RTC with this info    if (RTC.write(tm)) {      config = true;    }  }  Serial.begin(9600);  while (!Serial) ; // wait for Arduino Serial Monitor  delay(200);  if (parse && config) {    Serial.print("DS1307 configured Time=");    Serial.print(__TIME__);    Serial.print(", Date=");    Serial.println(__DATE__);  } else if (parse) {    Serial.println("DS1307 Communication Error :-{");    Serial.println("Please check your circuitry");  } else {    Serial.print("Could not parse info from the compiler, Time=\"");    Serial.print(__TIME__);    Serial.print("\", Date=\"");    Serial.print(__DATE__);    Serial.println("\"");  }}void loop() {}bool getTime(const char *str){  int Hour, Min, Sec;  if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;  tm.Hour = Hour;  tm.Minute = Min;  tm.Second = Sec;  return true;}bool getDate(const char *str){  char Month[12];  int Day, Year;  uint8_t monthIndex;  if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false;  for (monthIndex = 0; monthIndex < 12; monthIndex++) {    if (strcmp(Month, monthName[monthIndex]) == 0) break;  }  if (monthIndex >= 12) return false;  tm.Day = Day;  tm.Month = monthIndex + 1;  tm.Year = CalendarYrToTm(Year);  return true;}

Não entendo muito de programação mas pretendo aprender. Então desculpa se for pedir de mais uma rápida interpretação do código e como usá-lo para acionar pinos digitais em certos horários. Estou pesquisando códigos prontos com o mesmo funcionamento, e se eu achar posto aqui.

 

Obrigado!

  • 1 ano depois...
  • 2 semanas depois...
Postado
/*
Sergio Mokshin
Fev/2015
*/
 
//Referencia de apoio http://www.glacialwanderer.com/hobbyrobotics
 
#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68
#include <LiquidCrystal.h>
 
//Inicializando LCD
LiquidCrystal lcd(12, 11, 8, 9, 10, 7);
 
//Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
    return ( (val/10*16) + (val%10) );
}
 
//Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
    return ( (val/16*10) + (val%16) );
}
 
// 1) Sets the date and time on the ds1307
// 2) Starts the clock
// 3) Sets hour mode to 24 hour clock
// Assumes you're passing in valid numbers
void setDateDs1307(byte second, // 0-59
            byte minute, // 0-59
            byte hour, // 1-23
            byte dayOfWeek, // 1-7
            byte dayOfMonth, // 1-28/29/30/31
            byte month, // 1-12
            byte year) // 0-99
{
    Wire.beginTransmission(DS1307_I2C_ADDRESS);
    Wire.write(0);
    Wire.write(decToBcd(second)); // 0 to bit 7 starts the clock
    Wire.write(decToBcd(minute));
    Wire.write(decToBcd(hour)); // If you want 12 hour am/pm you need to set
    // bit 6 (also need to change readDateDs1307)
    Wire.write(decToBcd(dayOfWeek));
    Wire.write(decToBcd(dayOfMonth));
    Wire.write(decToBcd(month));
    Wire.write(decToBcd(year));
    Wire.endTransmission();
}
 
// Gets the date and time from the ds1307
void getDateDs1307(byte *second,
            byte *minute,
            byte *hour,
            byte *dayOfWeek,
            byte *dayOfMonth,
            byte *month,
            byte *year)
{
    // Reset the register pointer
    Wire.beginTransmission(DS1307_I2C_ADDRESS);
    Wire.write(0);
    Wire.endTransmission();
 
    Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
    // A few of these need masks because certain bits are control bits
    *second = bcdToDec(Wire.read() & 0x7f);
    *minute = bcdToDec(Wire.read());
    *hour = bcdToDec(Wire.read() & 0x3f); // Need to change this if 12 hour am/pm
    *dayOfWeek = bcdToDec(Wire.read());
    *dayOfMonth = bcdToDec(Wire.read());
    *month = bcdToDec(Wire.read());
    *year = bcdToDec(Wire.read());
}
 
void setup()
{
    byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
    Wire.begin();
    Serial.begin(9600);
 
    lcd.begin(16, 2);
 
    pinMode(A0, OUTPUT);
    pinMode(A1, OUTPUT);
    pinMode(A2, OUTPUT);
    pinMode(A3, OUTPUT);
 
    // Change these values to what you want to set your clock to.
    // You probably only want to set your clock once and then remove
    // the setDateDs1307 call.
    second = 00;
    minute = 8;
    hour = 22;
    dayOfWeek = 1;
    dayOfMonth = 1;
    month = 2;
    year = 15;
    // setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); //Remova o '//' do começo e faça o primeiro upload, depois volte o '//' faça novamente o upload
}
 
void loop()
{
    MostraData();
    AtualizaSaidas();
    delay(1000);
}
 
void MostraData(){
 
    byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
    getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
 
    lcd.setCursor(0, 1); 
 
    if (hour < 10){
        lcd.print("0");
    }
 
    lcd.print(hour,DEC);
    lcd.setCursor(2, 1);
    lcd.print(":");
    lcd.setCursor(3, 1); 
 
    if (minute < 10){
        lcd.print("0");
    }
 
    lcd.print(minute,DEC);
    lcd.setCursor(5, 1);
    lcd.print(":");
    lcd.setCursor(6, 1);
    if (second < 10){
        lcd.print("0");
    }
 
    lcd.print(second,DEC);
    lcd.setCursor(8, 1);
    lcd.print(" ");
    lcd.setCursor(10, 1);
 
    if (dayOfMonth < 10){
        lcd.print("0");
    }
 
    lcd.print(dayOfMonth,DEC);
    lcd.setCursor(12, 1);
    lcd.print("/");
    lcd.setCursor(13, 1);
 
    if (month < 10){
        lcd.print("0");
    }
 
    lcd.print(month,DEC);
    lcd.setCursor(15, 1);
 
    Serial.print(hour, DEC);
    Serial.print(":");
    Serial.print(minute, DEC);
    Serial.print(":");
    Serial.print(second, DEC);
    Serial.print(" ");
    Serial.print(dayOfMonth, DEC);
    Serial.print("/");
    Serial.print(month, DEC);
    Serial.print("/");
    Serial.println(year, DEC);
    Serial.print("Day of week ");
    Serial.println(dayOfWeek, DEC);
}
 
void AtualizaSaidas(){
 
    byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
    getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); 
 
    //Saída S1: Ligada entre 00:00 e 11:59 todos os dias
    if (hour <= 11)
    {
        Serial.println("S1 Off");
        digitalWrite(A0, HIGH);
    }
    else
    {
        Serial.println("S1 On");
        digitalWrite(A0, LOW);
    }
 
    //Saída S2: Ligada entre 12:00 e 23:59 todos os dias
    if (hour >=12 )
    {
        Serial.println("S2 On");
        digitalWrite(A1, HIGH);
    }
    else
    {
        Serial.println("S2 Off");
        digitalWrite(A1, LOW);
    }
 
    //Saída S3: Ligada entre 08:00 e 17:00 de segunda a sexta
    if (hour >=8 && hour <=17 && dayOfWeek >= 2 && dayOfWeek <= 6)
    {
        Serial.println("S3 On");
        digitalWrite(A2, HIGH);
    }
    else
    {
        Serial.println("S3 Off");
        digitalWrite(A2, LOW);
    }
 
    //Saída S4: Ligada entre 08:00 e 17:00 sábado e domingo
    if (hour >=8 && hour <=17 && (dayOfWeek == 1 || dayOfWeek == 7))
    {
        Serial.println("S4 On");
        digitalWrite(A3, HIGH);
    }
    else
    {
        Serial.println("S4 Off");
        digitalWrite(A4, LOW);
    } 
 
    //RGB Branco: Ligado entre 18:00 e 22:00 todos os dias
    //RGB Azul: Ligado entre 22:00 e 23:59 todos os dias
    if (hour <18 )
    {
        Serial.println("RG Off");
        analogWrite(5, 0);
        analogWrite(6, 0);
        analogWrite(3, 0);
    }
    else if (hour >=18 && hour < 22 )
    {
        Serial.println("RGB Branco");
        analogWrite(5, 255);
        analogWrite(6, 255);
        analogWrite(3, 255);
    }
    else if (hour >=22)
    {
        Serial.println("RGB Azul");
        analogWrite(5, 255);
        analogWrite(6, 0);
        analogWrite(3, 0);
    }
} 

Resolvi usar deste site aqui.. Meu programa está muito diferente agora, mas essa é a base

http://www.ventron.com.br/como-montar-um-relogio-temporizador-com-arduino-lcd-e-rtc-ds1307/

  • 11 meses depois...
Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!