Professional Documents
Culture Documents
Nama Praktikan
NPM
: 1106050922
No. Modul
:9
Nama Eksperimen
: SHT11
Laboratorium Komputer
Departemen Fisika
Fakultas Matematika dan Ilmu Pengetahuan Alam
Universitas Indonesia
2014
Modul IX
SHT11
A. Tujuan Percobaan
Menggunakan modul sensor SHT11 sebagai sensor suhu dan
kelembaban pada input mikrokontroller.
B. Teori Dasar
Mikrokontroler merupakan salah satu pengontrol utama perangkat
elektronika saat ini. Mikrokontroler yang terkenal dan mudah didapatkan di
Indonesia saat ini antara lain 89S51, AVR ATmega 8535, Atmega16, Atmega32
dan Atmega128.
Mikrokontroler memiliki beberapa Port yang dapat digunakan sebagai I/O
(input/Output). ATmega128 memiliki kemampuan yang lebih besar, yaitu 128 KB
ISP Flash Memory, 4K EEPROM, 4K internal SRAM dan memiliki 5 port I/O.
kelembaban relatif dan sebuah pita regangan yang digunakan sebagai sensor
temperatur. Output kedua sensor digabungkan dan dihubungkan pada ADC 14 bit
dan sebuah interface serial pada satu chip yang sama. Sensor ini mengahasilkan
sinyal keluaran yang baik dengan waktu respon yang cepat. SHT11 ini dikalibrasi
pada ruangan denagn kelembaban yang teliti menggunakan hygrometer sebagai
referensinya. Koefisien kalibrasinya telah diprogramkan kedalam OTP memory.
Koefisien tersebut akan digunakan untuk mengaklibrasi keluaran dari sensor
selama proses pengukuran.
<mega128.h>
<stdio.h>
<stdlib.h >
<delay.h>
<math.h>
<alcd.h>
float f;
} value;
enum {TEMP,HUMI};
#define DATA_OUT
#define DATA_IN
#define SCK
#define noACK 0
#define ACK
1
PORTD.6
PIND.6
PORTD.7
//adr
command
#define
#define
#define
#define
#define
r/w
STATUS_REG_W
STATUS_REG_R
UKUR_SUHU
UKUR_HUMI
RESET
0x06
0x07
0x03
0x05
0x1e
//000
0011
0
//000
0011
1
//000
0001
1
//000
0010
1
//000
1111
}
//--------------------------------------------------------------------------------// menghasilkan sinyal awal untuk transmisi data
//
_____
________
// DATA:
|_______|
//
___
___
// SCK :
__|
| ___|
|______
//--------------------------------------------------------------------------------//Untuk memulai transmisi data
void start_SHT(void)
{
DDRD = 0b11000000;
// DATA Output
DATA_OUT=1; SCK=0;
//Inisial state
delay_us(2);
SCK=1;
delay_us(2);
DATA_OUT=0;
delay_us(2);
SCK=0;
delay_us(5);
SCK=1;
delay_us(2);
DATA_OUT=1;
delay_us(2);
SCK=0;
DDRD = 0b10000000;
// DATA Input
}
//--------------------------------------------------------------------------------// reset: DATA-line=1 dengan 9 SCK cycle di awal
// ________________________________________
//
DATA:
|_______|
//
_
_
_
_
_
_
_
_
_
__
___
// SCK : __| | __| |__| |__| |__| |__| |__| |__| |__| |___|
|
_____|
|______
//--------------------------------------------------------------------------------//Untuk mereset koneksi
void reset_SHT(void)
{
unsigned char i;
DDRD = 0b11000000;
DATA_OUT=1; SCK=0;
for(i=0;i<9;i++)
{ SCK=1;
delay_us(1);
SCK=0;
delay_us(1);
}
start_SHT();
DDRD = 0b10000000;
}
dengan SHT11
// DATA output
//Inisial state
//9 SCK cycle
*p_value,
unsigned
char
start_SHT();
//start transmisi data
error=tulis_SHT(STATUS_REG_R); //mengirim command ke sensor
*p_value=baca_SHT(ACK);
//baca status register (8-bit)
*p_checksum=baca_SHT(noACK);
//baca checksum (8-bit)
return error;
//error=1 jika tidak ada respon dari
sensor
}
//Membaca data hasil pengukuran
char ukur_SHT(unsigned char *p_value, unsigned char *p_checksum,
unsigned char mode)
{
unsigned error=0;
unsigned int temp=0;
start_SHT();
//start transmisi data
switch(mode){
//mengirim command ke sensor
case TEMP
: error+=tulis_SHT(UKUR_SUHU); break;
case HUMI
: error+=tulis_SHT(UKUR_HUMI); break;
default
: break;
}
DDRD = 0b10000000;
// DATA input
while (1)
{
if(DATA_IN==0) break;
//tunggu hingga sensor selesai melakukan pengukuran
}
if(DATA_IN) error+=1;
// jika sudah timeout (2 detik)
switch(mode){
case TEMP
case HUMI
default
}
*p_checksum =baca_SHT(noACK);
return error;
//baca checksum
}
const
const
const
const
const
float
float
float
float
float
C1=-4.0;
C2=+0.0405;
C3=-0.0000028;
T1=+0.01;
T2=+0.00008;
t_C=*p_temperature*0.01-40;
//mengubah nilai Suhu menjadi derajat Celcius [C]
rh_lin=C3*(p_humidity)*(p_humidity) + C2*(p_humidity) + C1;
//mengubah nilai kelembaban dalam % [%RH]
rh_true=(t_C-25)*(T1+T2*(p_humidity))+rh_lin;
//mengkompensasikan nilai suhu dan kelembaban[%RH]
if(rh_true>100)rh_true=100;
if(rh_true<0.1)rh_true=0.1;
*p_temperature=t_C;
return rh_true;
}
alarm()
{
PORTA=0x00;
delay_ms(100);
PORTA=0xFF;
delay_ms(100);
}
SET_BATAS()
{
// set batas maximum
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Set Suhu Max");
lcd_gotoxy(0,1);
jDigit = 0;
//Suhu
do
{
digit = read_keypad();
if (digit<16){
if(digit==11)
lcd_putsf("");
else if (digit==10)
lcd_putsf("");
else{
sprintf(text,"%d", digit);
lcd_puts(text);
nilai = nilai * 10;
nilai = nilai + digit;
jDigit++;
}
delay_ms(300);}
}
while(jDigit<2);
suhu_max = nilai;
nilai = 0;
jDigit = 0;
//set atas suhu
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Set Hum Max");
lcd_gotoxy(0,1);
//kelembaban
do
{
digit = read_keypad();
if (digit<16){
if(digit==11)
lcd_putsf("");
else if (digit==10)
lcd_putsf("");
else{
sprintf(text,"%d", digit);
lcd_puts(text);
nilai = nilai * 10;
nilai = nilai + digit;
jDigit++;
}
delay_ms(300);}
}
while(jDigit<2);
kelembaban_max = nilai;
nilai = 0;
lcd_gotoxy(2,1);
jDigit = 0;
}
void main(void)
{
// Declare your local variables here
value humi_val,temp_val;
// Input/Output Ports initialization
// Port A 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
PORTA=0xFF;
DDRA=0xFF;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=Out
Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=0
State0=P
PORTB=0x01;
DDRB=0x02;
// Port C initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out
Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0
State0=0
PORTC=0x00;
DDRC=0xFF;
// 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=0xFF;
DDRD=0x00;
// Port E 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
PORTE=0xFF;
DDRE=0xF0;
alarm();
}
else if(humi_val.f>(float)kelembaban_max)
{
alarm();
}
else
{
PORTA=0x00;
}
delay_ms(1000);
};
}
}
lcd_gotoxy(0,1);
//kelembaban
do
{
digit = read_keypad();
if (digit<16){
if(digit==11)
lcd_putsf("");
else if (digit==10)
lcd_putsf("");
else{
sprintf(text,"%d", digit);
lcd_puts(text);
nilai = nilai * 10;
nilai = nilai + digit;
jDigit++;
}
delay_ms(300);}
}
while(jDigit<2);
kelembaban_max = nilai;
nilai = 0;
lcd_gotoxy(2,1);
jDigit = 0;
}
Pada subroutine tersebut, alarm diaktifkan bila nilai suhu atau kelembaban
yang dibaca oleh sensor lebih besar dari nilai yang dimasukkan melalui keypad.
Perintah tersebut ditulis seperti berikut:
if(temp_val.f>(float)suhu_max)
{
alarm();
}
else if(humi_val.f>(float)kelembaban_max)
{
alarm();
}
else
{
PORTA=0x00;
}
delay_ms(1000);
};
sebagai input
Untuk membandingkan dua variabel data dengan fungsi IF
dibutuhkan jenis data yang sama, sesame data float atau integer.
E. Daftar Pustaka
http://elib.unikom.ac.id/files/disk1/458/jbptunikompp-gdl-mochamadbo22888-3-babii.pdf diakses pada 19 Maret 2014 Pukul 08.00
Datasheet ATMEGA128
Datasheet SHT11