collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: LCD YM1602C 16x2 (Compatível HD44780) + DS1620  (Lida 7038 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline ricardo-reis

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.338
LCD YM1602C 16x2 (Compatível HD44780) + DS1620
« 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 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.. ;)

« Última modificação: 13 de Julho de 2009, 13:59 por metRo_ »

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re:LCD YM1602C 16x2 (Compatível HD44780) + DS1620
« Responder #1 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

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re:LCD YM1602C 16x2 (Compatível HD44780) + DS1620
« Responder #2 em: 13 de Julho de 2009, 12:18 »
Ele tem se dedicado bem aos LCD :D

Offline ricardo-reis

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.338
Re:LCD YM1602C 16x2 (Compatível HD44780) + DS1620
« Responder #3 em: 13 de Julho de 2009, 13:32 »
pronto, pronto.. aqui fica a imagenzinha.. :)




é isto.. ;)
« Última modificação: 13 de Julho de 2009, 13:59 por metRo_ »

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re:LCD YM1602C 16x2 (Compatível HD44780) + DS1620
« Responder #4 em: 13 de Julho de 2009, 15:47 »
Sim senhor, centrado e tudo, tenho que fazer um desses! Para meter na lareira :D

Offline ricardo-reis

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.338
Re:LCD YM1602C 16x2 (Compatível HD44780) + DS1620
« Responder #5 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

Offline amando96

  • Mini Robot
  • *
  • Mensagens: 1.631
  • MAC address? But I have windows...
    • Projects, News, Blog, Tutorials
Re:LCD YM1602C 16x2 (Compatível HD44780) + DS1620
« Responder #6 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....

Offline ricardo-reis

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.338
Re:LCD YM1602C 16x2 (Compatível HD44780) + DS1620
« Responder #7 em: 13 de Julho de 2009, 17:35 »
se n tou em erro eram 4 e tal da manhã kd eu tirei a foto..

Offline ricardo-reis

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.338
Re:LCD YM1602C 16x2 (Compatível HD44780) + DS1620
« Responder #8 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..

Offline amando96

  • Mini Robot
  • *
  • Mensagens: 1.631
  • MAC address? But I have windows...
    • Projects, News, Blog, Tutorials
Re:LCD YM1602C 16x2 (Compatível HD44780) + DS1620
« Responder #9 em: 28 de Julho de 2009, 15:03 »


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