• Welcome to LusoRobótica - Robótica em Português.
 

Contagem com o relogio DS1307

Started by AntonioGoncalves, 11 de February de 2017, 23:16

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

AntonioGoncalves

Boa  noite pessoal

Sou novo por aqui, descobri este Forum nas minhas pesquisas para um projeto que gostaria de fazer ,devo dizer tambem que estou comecar com o arduino faz pouco tempo unicamento tenho feito codigos basicos

Agora tenho um desafio maior pela frente e sozinho não esta nada facil e como vi que aqui tambem se USA o arduino resolvi pedir ajuda!

Bem tenho que fazer uma pequana automatização para uma estufa de plantas onde tem que estar 30 dias  e ter uma janela de ventilação aberta um serto tempo e outro fechada!

Ou seja  o arduino começao a contar os 30 dias a partir de quando è ligado  e mostrar no LCD20X4(para eu nao ter engano nos dias ), e a janela esta 4 Horas aberta e passados 4 Horas fecha e assim sucessivamnte os 30 dias. mas estes tempo sacados do DS1307

A janela vai fincionar com um Motor de caixa redutora  12V 1A e com dois Switchs um fim de abertura da janela e outro quando fim de janela fechada !

Gente como disse jà pesquisei tudo e nao encontrei nada que me ajuda-se , por isso serà que algem deste Forum  me pode ajudar a realizar Estas funcoes para o arduino com o descrito em cima ???

Sinceramente neste momento nao sei por onde pagar !! ainda comecei a fazer a contagem dos dias mas aparece varios nemeros seguidos no LCD

O codigo que fiz ate Agora è o seguinte:

#include <Wire.h>//livraria para o manejo do protocolo i2c
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#include "RTClib.h" //l
#define DHTPIN 7 //
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27,20,4);// Display 20x4
RTC_DS1307 RTC;//

int puls1=8;
int puls2=4;
int puls3=6;
int modo=9;
int led =13;
char texto[10];
int horas=17,minutos=16,segundos=0,anos,mess,dias=0;
int inicio=0;
//char daysOfTheWeek[7][14] = {"Domingo", "Segunda-feira", "Terça-feira", "Quarta-feira", "Quinta-feira", "Sexta-feira", "Sabado"};
//a linha acima é um array com os dias da semana

String zero(int n){ //função que verifica se o numero é menor
                    //que dez, e se for adiciona o 0 antes
  if(n < 10){       //Exemplo: entra 5, sai 05-> 00:05:00
    return "0" + String(n);       //como seria-> 00:5:00
  }else{
    return String(n);
  }
}


void setup ()
{
  // serie, wire, modulo RTC y LCD
    //Serial.begin(9600);
    Wire.begin();
    dht.begin();
    RTC.begin();
   
    lcd.backlight();
    lcd.init();
       //RTC.adjust(DateTime(__DATE__, __TIME__));//ajusta o relogio por software
    //RTC.adjust(DateTime(2014, 1, 21, 3, 0, 0));//Se Ajusta la hora por Software
   pinMode(8,INPUT);//pin de aumento
    pinMode(9,INPUT);//pin configuracao
    pinMode(led, OUTPUT);
}
void loop ()
{
  // mostrar_lcd();
  DateTime now = RTC.now(); //
    float h = dht.readHumidity();// lê a humidade
    float temp = dht.readTemperature(); //lê a temperatura
   
  mostrar_lcd();
  delay(50);
  lcd.setCursor(0,0); //
  lcd.print("Temp.: "); // Prints string "Temp." on the LCD
  lcd.print(temp); // Prints the temperature value from the sensor
  lcd.print(" C");
  lcd.setCursor(0,1);
  lcd.print("Humi.: ");
  lcd.print(h);
  lcd.print(" %");

///////////////// Ajustar a Hora
    int hora=now.hour();
    int minuto=now.minute();
    int segundo=now.second();
    int ano=now.year();
    int mes=now.month();
    int dia=now.day();

[i][i] //Comecei afazer a contagem dos dias mas aparece Numeros estranos [/i][/i]

    if (hora==horas && minuto==minutos && segundo==segundos && inicio>0 )
    { 
      inicio=inicio+1;
      lcd.setCursor(17,0);
      lcd.print(inicio);
       
      delay(500);
   }     

void mostrar_lcd()
{
     DateTime now = RTC.now(); //se accede a los datos del RTC
 
     // Se imprime en el primer renglon posicion 0,0
     lcd.setCursor(0,2);
      //Se Imprime el data
     lcd.print("date.: ");
     lcd.print(zero(now.day()) + "/" + zero(now.month()) + "/" + now.year());
      //Se Imprime el horario
     lcd.setCursor(0,3);
     lcd.print("time.: ");
     lcd.print(zero(now.hour())+ ":" +  zero(now.minute())+ ":" + zero(now.second()));

delay(50);
}

LVirtual

#1
eu nao sei programar arduinos, mas sei que os RTC's da dallas forncem sempre a Data/hora em formato bcd.
no caso deste RTC os dados saem de forma serial, noutros mais antigos eram de forma paralela.

o formato BCD é um formato quase decimal :)
tens aqui a sua descriçao: https://en.wikipedia.org/wiki/Binary-coded_decimal

tens que implementar um conversor de bcd para decimal no sw do arduino e depois fazeres as contas numa subrotina de contador para saberes quando passaram 4 horas para fechar a a janela e depois para a abrir.

se estas a usar formatos hexadecimais para essas rotinas vai dar sempre barraca porque o BCD é essencialmente decimal.

no BCD cada digito é formado por 4 bits, num byte tens dois digitos seguidos, no caso deste integrado é assim: https://drive.google.com/open?id=0B4i9yBKv1LG4Zkg3R2lCN0tocjQ

como o formato bcd é digitos de 0 a 9 em binario de 4 bits, podes sempre fixar uma hora certa para abrir e fechar a janela e ao leres o byte dessa hora no RTC disparas a funcçao de abrir ou fechar. isto se for sempre para abrir ou fechar a mesma hora. senao teras que comparar continuamente a hora do RTC com as horas fixadas numa memoria nao volatil para disparares as funcçoes respectivas.


mais um edit:
e nao deverias usar numeros formatados como strings para fazer calculos matematicos, mas antes formatados como inteiros ou longos...
"O defeito mais grave dos humanos, aquele que coloca mais obstáculos à sua evolução, é a crença profundamente arreigada na infalibilidade dos seus raciocínios e dos seus pontos de vista."

AntonioGoncalves

Obrigado LVirtualpor responder!!

Realmente o que pertendo è outro caminho visto que os formatos da Hora e data jà  estao tratados na biblioteca !

Como disse em cima o meu problema è emplementar o codigo para que o arduino faço o que descrevi no poste anterior , mas para isso algum aqui do Forum com esperiencia na programaçao do arduino me fize-se o basico do que pertendo para eu depois com essas bases desenvolver mais o meu projeto , eu nao queria o codigo feito de bandeja , mas uma coisa è verdade eu nao tenho neste momento conhecimento para mais !

O codigo que fiz foi baseado em pesquisas que fiz e depois tento compreender e desenvolver mais ,mas infelimente tenho que ver os exemplos estudalos e depois seguir em Frente

Espero vossa compreenção

LVirtual

parece-me que tambem dará jeito saber como é que estas a usar fisicamente o RTC DS1307.
se num modulo externo em que envia para o arduino essa informaçao se é o RTC de referencia do proprio arduino...
O circuito integrado em si, existe e é usado em muita coisa para alem dos arduinos.
Olhando de forma enviesada para o codigo fonte vejo algo que tambem nao é bom para calculos matematicos como os sinais de ":" no formato string da data. se queres comparar dois numeros que é o caso nao podes ter nada em formato alfanumerico. nem precisas de estar a fazer concatenações de algarismos e letras para verificar se uma data esta igual a um valor requerido. pelo que disseste so precisas de saber a hora do dia, portanto andar ai a meter 2 pontos no meio dos numeros e a converter em string  tambem nao me parece muito logico...
pega no que ja sabes de programaçao e reformula tudo. ;)
"O defeito mais grave dos humanos, aquele que coloca mais obstáculos à sua evolução, é a crença profundamente arreigada na infalibilidade dos seus raciocínios e dos seus pontos de vista."

AntonioGoncalves

Lvirtual esse codigo esta a funcionar na bancada Sem problema esse formato string  nada tem a ver  visto isso è so para mostrar no LCD!

O que eu nao estou conseguindo è por em paratica  de como fazer as funcoes para que eu consiga o que quero!

Estou quase a ficar careca de tanto teste que tenho feito e nao da certo !

Obrigado pela atenção

LVirtual

relê o que eu escrevi. isso é tudo uma questao de raciocinio logico... ;)
"O defeito mais grave dos humanos, aquele que coloca mais obstáculos à sua evolução, é a crença profundamente arreigada na infalibilidade dos seus raciocínios e dos seus pontos de vista."

senso

Esse código compila com um } a menos?

Que funções queres fazer, ou melhor, tenta dizer/explicar como queres implementar a coisa.
Amanhã já olho melhor para o teu código e volto a reler os vossos textos, que acho que só se estão a confundir mais um ao outro....
Avr fanboy

AntonioGoncalves

#7
Ola senso ,obrigado pela ajuda!

A falta da chave foi talves quando eu copiei o codigo  e fiz algumas alterações  esqueci da chave ,mas o codigo foi compilado Sem problemas Antes de o colocar aqui

senso como eu ja descrevi em cima o que pertendo è o seguinte;

Eu quero que quando ligar o arduino os dias começa a partir desse momento  a contar os dias ou seja se o arduino foi ligado ao 12:00 cemeça a contar a partir desse momento e passado 24 Horas conta um dia e assim sucessivamente ate ao 30 dia e termina aí mostrando a contagem dos dias no LCD

Depois durante esse tempo tem que ser ventidado e para isso quero fazer uma janela que deve abrir e estar aberta 4horas, passado esse tempo fechar e estar fechada 4horas  depois assim sucessivamente durante 30dias  e termina para isso vou usar um Motor de 12V e dois Switchs para fim de abertura da janela e fim de janela fechada.

Mas estes tempos controlados pelo relogio DS1307 deviso ter uma bateria e mesmo que falhe alguma coisa o retelogio continua o seu funcionamento

Como descrevi sao duas funçoes que tenho que emplementar no codigo postado em cima , mas nao tenho tido sucesso ,caso não entendas bem o que quero posta aqui

Desde ja agradeço