LusoRobótica - Robótica em Português
Sistemas específicos => Arduino / AVR => Tópico iniciado por: AntonioGoncalves em 11 de Fevereiro de 2017, 23:16
-
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);
}
-
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 (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...
-
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
-
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. ;)
-
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
-
relê o que eu escrevi. isso é tudo uma questao de raciocinio logico... ;)
-
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....
-
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