LusoRobótica - Robótica em Português
Robótica => Projectos de robótica => Projectos Concluídos => Tópico iniciado por: ricardo-reis em 13 de Julho de 2009, 04:57
-
olá, pessoal.. venho postar outra aplicação para o lcd.. desta vez a interacção com o ds1620 - termoestato.
no código apenas o uso como termometro, mas fácilmente se edita para utilização do termoestato. se o quiserem, têm aqui (http://lusorobotica.com/index.php/topic,435.msg2502.html#msg2502)o tutorial do tr3s que vos ajuda nisso.
#include <MsTimer2.h>
#include <LiquidCrystal.h>
#define dsRST 7
#define dsCLK 8
#define dsDQ 9
void setup(void);
void loop();
void ds_init();
void ds_stop();
void ds_set_thermostat(uint8_t t, int temp);
void ds_write_command(byte command);
int ds_read_raw_data(void);
void ds_out_bit(byte bit);
void ds_clk_high(void);
void ds_clk_low(void);
void ds_rst_high(void);
void ds_rst_low(void);
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
int i=16;
char teste[50] = "ricardo-reis @ [url=http://www.lusorobotica.com]www.lusorobotica.com[/url]"; // arrays de caracteres de tamanho máximo recomendável de 412 caracteres
char aux[50] = ""; // de forma a que estes sejam impressos sem qualquer tipo de problema
void escreve() {
lcd.clear();
/* ler dados do ds1620 */
int raw_data = ds_read_raw_data();
/* fim da leirura */
if(i==0){
if (teste!=aux){
for(int a=0; a<sizeof(teste); a++){
aux[a] = teste[a];
}
}
}
if(i<0){
for(int a=0; a<sizeof(aux); a++){
aux[a] = aux[a+1];
}
lcd.setCursor(0,1);
lcd.print(aux);
if(aux[0]=='\0'){
for(byte x=0; x<16; x++)
lcd.print(' ');
i=16;
}
}
else{
lcd.setCursor(i,1);
lcd.print(teste);
i--;
}
/* print no lcd, código adaptado do tutorial do tr3s */
lcd.setCursor(0,0);
for(byte x=0; x<16; x++)
lcd.print(' ');
lcd.setCursor(3,0);
lcd.print("Temp:");
lcd.print(raw_data/2);
lcd.print(".");
if(raw_data%2){
lcd.print(5);
}
else {
lcd.print(0);
}
lcd.write(0b11011111);
/* fim do print */
}
void setup() {
/* inicialização do ds1620 - código do tr3s */
pinMode(dsRST, OUTPUT);
pinMode(dsCLK, OUTPUT);
pinMode(dsDQ, OUTPUT);
ds_init(); // Iniciar o termómetro
/* fim ds1620 */
analogWrite(6,80); // isto serve para quem tem o pino 6 do arduino ligado ao pino que regula o contraste do lcd
MsTimer2::set(300, escreve); // 250 é o tempo em ms.. se quiserem ter o texto a rodar mais depressa diminuam o tempo, se quiserem mais devagar aumentem..
MsTimer2::start();
}
void loop() {
}
/* DAQUI PRÁ FRENTE O CÓDIGO É TODO DO TR3S QUALQUER DÚVIDA OU QUESTÃO, É COM ELE */
//-------Rotinas ds1620 por Daniel Gonçalves a.k.a. Tr3s------
// Podem usar estas rotinas à vontade para projectos particulares.
// Para fins comerciais entrar em contacto com we_real_cool@hotmail.com
// Partilhem com apenas com o meu concentimento.
// Se virem este código noutro sitio sem ser [url=http://www.lusorobotica.com]www.lusorobotica.com[/url] avisem de imediato para we_real_cool@hotmail.com!
void ds_init(){
ds_rst_low();
ds_rst_high(); // As transmissões de dados (comandos por exemplo) no ds1620 começam nas transições ascendentes do sinal RST
ds_write_command(0x0C); // Escrever o comando de configuração, a proxima palavra é a configuração em si
ds_write_command(0x00); // Configuração = CPU mode
ds_rst_low(); // Terminar a configuração
delay(15); // Esperar ate tar tudo ok... Pode ser muito menos tempo mas não ha pressa...
ds_rst_high();
ds_write_command(0xEE); // Começar a converter a temperatura em Volts!
ds_rst_low();
delay(200);
}
void ds_stop(){
ds_rst_low();
ds_rst_high();
ds_write_command(0x22); // Parar de converter a temperatura, gasta menos.
ds_rst_low();
delay(200); // Esperar que o comando seja interpretado
}
/* Esta rotina só será util para quem tiver necessidade de usar o ds1620 como termoestato.. no caso não se aplica.. (comentário por ricardo-reis)
void ds_set_thermostat(uint8_t t, int temp){ // uint8_t t = TH(0x01) ou TL(0x02) - ATENÇÃO, USAR COM CUIDADO, ESTES VALORES TEM LIMITE DE ESCRITAS. Basta defenir estes valores uma vez, mesmo que se desligue o chip estes valores não se perdem
ds_clk_high();
ds_rst_high();
ds_write_command(t); // Defenir termo-estato
byte bit=0;
for(byte n=0;n<9;n++){ // São 9 bits de temperatura, o bit de maior peso é o sinal 0 = + 1 = -
bit = ((temp >> n) & (0x01)); // Enviar os bits da temperatura
ds_out_bit(bit); // Enviar primeiro os bis de menor peso!
}
ds_rst_low(); // Terminar configuração.
}
*/
void ds_write_command(byte command){
byte bit; // Envia 8 bits pelo pin DQ, bit de menor peso primeiro
for(byte n=0;n<8;n++){
bit = ((command >> n) & (0x01));
ds_out_bit(bit);
}
}
int ds_read_raw_data(void){
byte bit,n;
int raw_data=0;
ds_rst_low();
ds_rst_high();
ds_write_command(0xAA); // Avisar que se vai ler a temperatura
pinMode(dsDQ,INPUT); // Assim evitam-se erros de leitura
for(n=0;n<9;n++){ // Ler a temperatura, 9bits.
ds_clk_low();
bit=(digitalRead(dsDQ)); // Vá dá ca mais um bit da temperatura por esse pin maluco!
ds_clk_high(); // A cada transição ascendente de CLK o chip ds1620 mete outro bit no pin DQ -> Estudar FLIP-FLOPS (tipo D)!
raw_data = raw_data | (bit << n);
}
pinMode(dsDQ, OUTPUT);
ds_rst_low(); // Ok já tá, podes ir descansar :P
return(raw_data);
}
void ds_out_bit(byte bit){
digitalWrite(dsDQ, bit); // Coloca o bit no pino DQ
ds_clk_low(); // Dá um clock ao ds1620 para ele receber o bit
ds_clk_high();
}
void ds_clk_high(void){digitalWrite(dsCLK,HIGH);}
void ds_clk_low(void){digitalWrite(dsCLK,LOW);}
void ds_rst_high(void){digitalWrite(dsRST,HIGH);}
void ds_rst_low(void){digitalWrite(dsRST,LOW);}
este código tem,como se pode ver, o contributo do tr3s.
qualquer duvida ou sugestão não exitem em postar.. ;)
(https://lusorobotica.com/index.php?action=dlattach;topic=1150.0;attach=263)
-
Sim senhor... estou a ver que andas em forma nestes últimos dias ;) mete só umas fotozinhas para encher mais a vista :P
-
Ele tem se dedicado bem aos LCD :D
-
pronto, pronto.. aqui fica a imagenzinha.. :)
(https://lusorobotica.com/index.php?action=dlattach;topic=1150.0;attach=263)
é isto.. ;)
-
Sim senhor, centrado e tudo, tenho que fazer um desses! Para meter na lareira :D
-
foi por acaso.. valeu o delay do tlm.. :P tens k fazer um destes pra pôr a arder? :D lol
-
bom trabalho :)
só me falta arranjar o termostato...
ish! 27 graus!? aqui rondam os 30 e poucos dentro de casa....
-
se n tou em erro eram 4 e tal da manhã kd eu tirei a foto..
-
oh pessoal, eu esqueci-me aqui de dizer, mas convém que reparem nos pinos usados para interagir com o ds1620.. eles estão definidos no inicio do código.. se seguirem o tutorial do tr3s pa montar isso, tenham em atenção k os pinos que aqui usei são diferentes, por causa de ter alguns usados no lcd..
-
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi30.tinypic.com%2Fk326i8.jpg&hash=5079dd3e03209b971e5981c792b64ae17695743b)
hehe chegaram as samples :)
entretanto o termometro de ''mercúrio'' chegou aos 32 e poucos :D