DIGITAL THERMOMETER DENGAN DS1621
Unknown6:56 AM 1 comments


Perancangan sistem ini mempunyai beberapa tujuan, antara lain :
Mencoba alternatif selain sensor LM35 yang sering digunakan dan menggantinya dengan sensor DS1621 sebagai pengukuran suhu. Dan mengkombinasikan hasil pengukuran suhu dengan menampilkan hasilnya pada
monitor komputer memanfaatkan komunikasi serial (interface).
 
Manfaatnya untuk mengukur suhu dan menampilkannya pada layar monitor dengan komunikasi
serial (interface). Sehingga kita bisa mengetahui data dari tampilan pada monitor
tanpa harus membaca hasil pengukuran pada alat secara langsung atau manual. 

Hasil Simulasi dengan Proteus


Pada Delphi


Short Code
Program pada CodeVisionAVR


#include <mega8.h>
// I2C Bus functions
#asm
   .equ __i2c_port=0x15 ;PORTC
   .equ __sda_bit=4
   .equ __scl_bit=5
#endasm
#include <i2c.h>

// DS1621 Thermometer/Thermostat functions
#include <ds1621.h>

// Alphanumeric LCD Module functions
#include <alcd.h>

// Standard Input/Output functions
#include <stdio.h>
#include <delay.h>

// Declare your global variables here
unsigned char lcd[16];
unsigned char data[16];

float suhu[2];

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out
Func1=Out Func0=Out 
// State7=1 State6=1 State5=1 State4=1 State3=1 State2=1 State1=1
State0=1 
PORTB=0xFF;
DDRB=0xFF;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In
Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T
State0=T 
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock // Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;
 // SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// I2C Bus initialization
i2c_init();

// DS1621 Thermometer/Thermostat initialization
// tlow: 50°C
// thigh: 55°C
// Tout polarity: 0
ds1621_init(0,50,55,0);
ds1621_init(1,50,55,0);

// Alphanumeric LCD initialization
// Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTB Bit 0
// RD - PORTB Bit 1
// EN - PORTB Bit 2
// D4 - PORTB Bit 3
// D5 - PORTB Bit 4
// D6 - PORTB Bit 5
// D7 - PORTB Bit 6
// Characters/line: 16
lcd_init(16);

while (1)
      {
      // Place your code here
      suhu[0] = ds1621_temperature_10(0);
      suhu[1] = ds1621_temperature_10(1);
      
      sprintf(lcd,"Suhu 1 = %0.0f%cC",suhu[0]/10,0XDF);
      lcd_gotoxy(0,0);
      lcd_puts(lcd);
      
      sprintf(lcd,"Suhu 2 = %0.0f%cC",suhu[1]/10,0XDF);
      lcd_gotoxy(0,1);
      lcd_puts(lcd);   
      
      sprintf(data,"#%0.0f#%0.0f#",suhu[0]/10,suhu[1]/10);
      puts(data);
      putchar(13);
      putchar(10);
      delay_ms(500);
      }

Program pada Delphi


unit Utermometer;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms,
  Dialogs, Menus, CPort, StdCtrls, CPortCtl, XPMan, TeEngine, Series,
  ExtCtrls, TeeProcs, Chart, ComCtrls, LPControl,
SLControlCollection,
  LPControlDrawLayers, LPTransparentControl, ULBasicControl,StrUtils,
  ILAnalogInstrument, ILAngularGauge,
  ILThermometer, ILProgressBar, ILSegmentIndicator, ILSegmentGauge,
  ILGlassPanel, ILMatrixDisplay, ILSegmentClock, ILLed;

type
  TForm1 = class(TForm)
    main1: TMainMenu;
    S1: TMenuItem;
    SetingSerial1: TMenuItem;
    Connect1: TMenuItem;
    Disconnect1: TMenuItem;
    ComPort1: TComPort;
    APLIKASI1: TMenuItem;
    Close1: TMenuItem;
    mmo1: TMemo;
    ClearScreen1: TMenuItem;
    tmr1: TTimer;
    xpmnfst1: TXPManifest;
    Clear: TButton;
    ilglspnl1: TILGlassPanel;
    ilnglrg1: TILAngularGauge;
    ilnglrg2: TILAngularGauge;
    ilsgmntg1: TILSegmentGauge;
    ilsgmntg2: TILSegmentGauge;
    pnl1: TPanel;
    btn1: TButton;
    btn2: TButton;
    grp2: TGroupBox;
    lblSerial: TLabel;
    comled1: TComLed;
    mmo2: TMemo;
    lbl3: TLabel;
    lbl4: TLabel;
    lbl1: TLabel;
    procedure SetingSerial1Click(Sender: TObject);
    procedure Close1Click(Sender: TObject);
    procedure Connect1Click(Sender: TObject);
    procedure Disconnect1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure ComPort1RxChar(Sender: TObject; Count: Integer);
    procedure ClearScreen1Click(Sender: TObject);
    procedure ClearClick(Sender: TObject);
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
    procedure btn5Click(Sender: TObject);
    procedure mmo1Change(Sender: TObject);
  private
    { Private declarations }   public
    { Public declarations }
  end;

var
  Form1: TForm1;
  buffer: String ;
  time:string ;
  sudut : Integer;
  speed : Integer;
  datasend : string ;
  suhu1 : Integer ;
  suhu2 : Integer;
  //indek:Integer;
  //rxdata: Integer;
implementation

{$R *.dfm}

procedure TForm1.SetingSerial1Click(Sender: TObject);
begin
  ComPort1.ShowSetupDialog ;  
end;

procedure TForm1.Close1Click(Sender: TObject);
begin
  close;
end;

procedure TForm1.Connect1Click(Sender: TObject);
begin
  ComPort1.Open ;
  btn1.Enabled:=False;
  btn2.Enabled:=True;
  Connect1.Enabled:=False;
  Disconnect1.Enabled:=True ;
  SetingSerial1.Enabled:=False;
  Close1.Enabled:=False;
end;

procedure TForm1.Disconnect1Click(Sender: TObject);
begin
  ComPort1.Close ;
  btn1.Enabled:=True;
  btn2.Enabled:=False;
  Connect1.Enabled:=True ;
  Disconnect1.Enabled:=False ;
  SetingSerial1.Enabled:=True;
  Close1.Enabled:=True;
  mmo1.Clear;
  ilnglrg1.Value:=0;
  ilnglrg2.Value:=0;
  ilsgmntg1.Value:=0;
  ilsgmntg2.Value:=0;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  mmo1.Clear;
  mmo2.Clear;
  Disconnect1.Enabled:=False ;   btn2.Enabled:=False;

  ilnglrg1.Value:=0;
  ilnglrg2.Value:=0;
  ilsgmntg1.Value:=0;
  ilsgmntg2.Value:=0;
end;

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
begin
  ComPort1.ReadStr(buffer,Count);
  mmo1.Text:=mmo1.Text + buffer;
end;

procedure TForm1.ClearScreen1Click(Sender: TObject);
begin
  mmo1.Clear;
end;

procedure TForm1.ClearClick(Sender: TObject);
begin
  mmo1.Clear;
  mmo2.Clear;
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
  ComPort1.Open ;
  btn1.Enabled:=False;
  btn2.Enabled:=True;
  Connect1.Enabled:=False;
  Disconnect1.Enabled:=True;
  SetingSerial1.Enabled:=False;
  Close1.Enabled:=False;
  lblSerial.Caption:= 'Connected';
end;
procedure TForm1.btn2Click(Sender: TObject);
begin
  ComPort1.Close ;
  btn1.Enabled:=True;
  btn2.Enabled:=False;
  Connect1.Enabled:=True;
  Disconnect1.Enabled:=False;
  SetingSerial1.Enabled:=True;
  Close1.Enabled:=True;
  lblSerial.Caption:='Disconnected'  ;
  mmo1.Clear;
  mmo2.Clear;
  ilnglrg1.Value:=0;
  ilnglrg2.Value:=0;
  ilsgmntg1.Value:=0;
  ilsgmntg2.Value:=0;
end;

procedure TForm1.btn5Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.mmo1Change(Sender: TObject);
var   indek1,indek2,indek3 : Integer ;
  data1,data2 :string ;
begin
  indek1:= Pos('#',mmo1.Text);
  indek2:= PosEx('#',mmo1.Text,indek1+1);
  indek3:= PosEx('#',mmo1.Text,indek2+1);

  if (indek1 > 0) and (indek2 > 0) then
  begin
      data1:= MidStr(mmo1.Text,indek1+1,indek2-2);
      suhu2:= StrToInt(data1);
      ilnglrg1.Value:=suhu2;
      ilsgmntg1.Value:=suhu2;
  end;
  if (indek2 > 0)and (indek3 > 0) then
  begin
     data2:= MidStr(mmo1.Text,indek1+indek2,indek3-indek1-indek2);
     suhu2:= StrToInt(data2);
     ilnglrg2.Value:=suhu2;
     ilsgmntg2.Value:=suhu2;
  end;

  mmo2.Text:=mmo2.Text + data1;
  mmo2.Text:=mmo2.Text + data2;

end;

end. 

Cara kerja 
Alat ini akan membaca suhu yang ada di sensor DS 1621 dan akan menampilkan
di monitor komputer dengan hasil yang dibaca oleh sensor.Dengan menggunakan
komunikasi serial antara alat dengan sistem dapat dihubungkan dengan memakai port
com yang ada.Untuk tombol CONNECT untuk menghidupkan sistem dan akan
menampilkannya ke layar monitor dengan ada 2 pembacaan data yaitu data serial dan
data parsing.untuk data serial sendiri adalah data  yang belum diolah dan masih dalam
bentuk string sedangkan data parsing adalah data yang sudah diolah atau dikonversi
dalam bentuk desimal.untuk tombol DISCONNECT berfungsi untuk mematikan sistem. 

Perancangan sistem ini bisa berfungsi untuk monitoring suatu suhu tanpa harus
terkendala oleh jarak karena alat ini dapat mengirimkan data suhu melalui interface dari
sistem ke monitor.