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

LCD YM1602C 16x2 (Compatível HD44780) + DS1620

Started by ricardo-reis, 13 de July de 2009, 04:57

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

ricardo-reis

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 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.. ;)


TigPT

Sim senhor... estou a ver que andas em forma nestes últimos dias ;) mete só umas fotozinhas para encher mais a vista :P

metRo_


ricardo-reis

#3
pronto, pronto.. aqui fica a imagenzinha.. :)




é isto.. ;)

TigPT

Sim senhor, centrado e tudo, tenho que fazer um desses! Para meter na lareira :D

ricardo-reis

foi por acaso.. valeu o delay do tlm.. :P tens k fazer um destes pra pôr a arder? :D lol

amando96

bom trabalho :)

só me falta arranjar o termostato...


ish! 27 graus!? aqui rondam os 30 e poucos dentro de casa....

ricardo-reis

se n tou em erro eram 4 e tal da manhã kd eu tirei a foto..

ricardo-reis

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

amando96



hehe chegaram as samples :)
entretanto o termometro de ''mercúrio'' chegou aos 32 e poucos :D