Ir ao conteúdo
  • Cadastre-se

Como programar timer no Arduino Uno?


Posts recomendados

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!

Link para o comentário
Compartilhar em outros sites

@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

Link para o comentário
Compartilhar em outros sites

@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!

Link para o comentário
Compartilhar em outros sites

  • 1 ano depois...
  • 2 semanas depois...
/*
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/

Link para o comentário
Compartilhar em outros sites

  • 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...