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

Título: LCD YM1602C 16x2 (Compatível HD44780) + DS1620
Enviado 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.

Código: [Seleccione]
#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)
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) + DS1620
Enviado por: TigPT em 13 de Julho de 2009, 08:46
Sim senhor... estou a ver que andas em forma nestes últimos dias ;) mete só umas fotozinhas para encher mais a vista :P
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) + DS1620
Enviado por: metRo_ em 13 de Julho de 2009, 12:18
Ele tem se dedicado bem aos LCD :D
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) + DS1620
Enviado por: ricardo-reis em 13 de Julho de 2009, 13:32
pronto, pronto.. aqui fica a imagenzinha.. :)

(https://lusorobotica.com/index.php?action=dlattach;topic=1150.0;attach=263)


é isto.. ;)
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) + DS1620
Enviado por: TigPT em 13 de Julho de 2009, 15:47
Sim senhor, centrado e tudo, tenho que fazer um desses! Para meter na lareira :D
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) + DS1620
Enviado por: ricardo-reis em 13 de Julho de 2009, 15:49
foi por acaso.. valeu o delay do tlm.. :P tens k fazer um destes pra pôr a arder? :D lol
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) + DS1620
Enviado por: amando96 em 13 de Julho de 2009, 16:08
bom trabalho :)

só me falta arranjar o termostato...


ish! 27 graus!? aqui rondam os 30 e poucos dentro de casa....
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) + DS1620
Enviado por: ricardo-reis em 13 de Julho de 2009, 17:35
se n tou em erro eram 4 e tal da manhã kd eu tirei a foto..
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) + DS1620
Enviado por: ricardo-reis em 14 de Julho de 2009, 03:48
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..
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) + DS1620
Enviado por: amando96 em 28 de Julho de 2009, 15:03
(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