You are on page 1of 14

Laporan Praktikum Mikrokontroler

Nama Praktikan

: Taufik Mulya Budiman

NPM

: 1106050922

No. Modul

:9

Nama Eksperimen

: SHT11

Hari dan Tanggal

: Rabu, 7 April 2014

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.

Gambar 1.1. Chip ATmega 128


Sensor suhu adalah alat yang digunakan untuk mengubah besaran panas
menjadi besaran listrik yang dapat dengan mudah dianalisis besarnya. Ada
beberapa metode yang digunakan untuk membuat sensor ini, salah satunya dengan
cara menggunakan material yang berubah hambatannya terhadap arus listrik
sesuai dengan suhunya.
SHT11 adalah sebuah single chip sensor suhu dan kelembaban relatif
dengan multi modul sensor yang outputnya telah dikalibrasi secara digital.
Dibagian dalamnya terdapat kapasitas polimer sebagai eleman untuk sensor

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.

Gambar 1.2. Sensor SHT11

C. Eksperimen dan Pembahasan


Pada percobaan ini praktikan menggunakan sensor SHT11 sebagai input
mikrokontroller. Praktikan membuat program untuk mengaktifkan alarm berupa
LED yang berkedip ketika suhu dan kelembaban yang dibaca oleh sensor
mencapai batas tertentu.
List program yang dibuat adalah sebagai berikut:
#include
#include
#include
#include
#include
#include

<mega128.h>
<stdio.h>
<stdlib.h >
<delay.h>
<math.h>
<alcd.h>

unsigned char key, digit, jDigit;


unsigned int nilai;

unsigned int kelembaban_max, suhu_max;


unsigned char read_keypad(void)
{
char key_index;
PORTE=0xFF;
PORTE.4=0;
key_index=(~PINE & 0x0F);
switch (key_index) {
case 1: return key=1;
break;
case 2: return key=4;
break;
case 4: return key=7;
break;
case 8: return key=10;
break;
};
PORTE.4=1; PORTE.5=0;
key_index=(~PINE & 0x0F);
switch (key_index) {
case 1: return key=2;
break;
case 2: return key=5;
break;
case 4: return key=8;
break;
case 8: return key=0;
break;
};
PORTE.5=1;PORTE.6=0;
key_index=(~PINE & 0x0F);
switch (key_index) {
case 1: return key=3;
break;
case 2: return key=6;
break;
case 4: return key=9;
break;
case 8: return key=11;
break;
};
PORTE.6=1; PORTE.7=0;
key_index=(~PINE & 0x0F);
switch (key_index) {
case 1: return key=0x0C;
break;
case 2: return key=0x0D;
break;
case 4: return key=0x0E;
break;
case 8: return key=0x0F;
break;
default: return key=0x10;
break;
};
}
// Declare your global variables here
//Deklarasi varaibel
char text[16];
unsigned char error,checksum;
char inp;
typedef union
{ unsigned int i;

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

unsigned int nilaisuhu[2]={0,0};


unsigned int batassuhu[2]={0,0};
//Untuk menulis data ke SHT11
char tulis_SHT(unsigned char bytte)
{
unsigned char i,error=0;
DDRD = 0b11000000;
for (i=0x80;i>0;i/=2) //shift bit
{
if (i & bytte)
DATA_OUT=1;
else DATA_OUT=0;
SCK=1;
// clk
delay_us(5);
SCK=0;
}
DATA_OUT=1;
DDRD = 0b10000000;
// DATA Output
SCK=1;
//clk #9 ack
delay_us(2);
error=DATA_IN;
//cek ack (DATA akan di pull down oleh
SHT11)
delay_us(2);
SCK=0;
return error;
//cek jika ada error
}
//Untuk membaca data dari SHT11
char baca_SHT(unsigned char ack)
{
unsigned char i,val=0;
DDRD = 0b10000000;
// DATA Input
for (i=0x80;i>0;i/=2)
//shift bit
{ SCK=1;
//clk
delay_us(2);
if (DATA_IN) val=(val | i);
//baca bit
delay_us(2);
SCK=0;
}
DDRD = 0b11000000;
// DATA Output
DATA_OUT=!ack;
//"ack==1" pull down DATA-Line
SCK=1;
//clk #9 ack
delay_us(5);
//delay 5 us
SCK=0;
DATA_OUT=1;
//DATA-line
return val;

}
//--------------------------------------------------------------------------------// 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

//start transmisi data


// DATA Input

//Mengecek status register sensor


char
StatusReg_SHT(unsigned
char
*p_checksum)
{
unsigned char error=0;

*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

//mengirim command ke sensor


: temp=0;
temp=baca_SHT(ACK);
temp<<=8;
nilaisuhu[0]=temp;
temp=0;
temp=baca_SHT(ACK);
nilaisuhu[0]|=temp;
break;
: temp=0;
temp=baca_SHT(ACK);
temp<<=8;
nilaisuhu[1]=temp;
temp=0;
temp=baca_SHT(ACK);
nilaisuhu[1]|=temp;
break;
: break;

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;

float hitung_SHT(float p_humidity, float *p_temperature)


{
float rh_lin;
// rh_lin: Kelembaban linear
float rh_true;
// rh_true: Suhu untuk kompensasi
kelembaban
float t_C;
// t_C
: nilai Suhu

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;

// Alphanumeric LCD initialization


// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTC Bit 0
// RD - PORTC Bit 2
// EN - PORTC Bit 1
// D4 - PORTC Bit 4
// D5 - PORTC Bit 5
// D6 - PORTC Bit 6
// D7 - PORTC Bit 7
// Characters/line: 16
lcd_init(16);
lcd_clear();
lcd_gotoxy(2,0);
lcd_putsf("Monitor Suhu");
lcd_gotoxy(1,1);
lcd_putsf("dan Kelembaban");
delay_ms(1000);
reset_SHT();
SET_BATAS();
while (1)
{
digit=read_keypad();
if(digit==10)
{
SET_BATAS();
}
else
{// Place your code here
//delay_ms(500);
error=0;
error+=ukur_SHT((unsigned
char*)
( &humi_val.i),&checksum,HUMI); //mengukur kelembaban
error+=ukur_SHT((unsigned
char*)
(&temp_val.i),&checksum,TEMP); //mengukur suhu
error += StatusReg_SHT(&inp, &checksum);
if(error!=0)
{
reset_SHT();
//jika ada error, reset
koneksi
putsf("Error");
}
else
{
//mengubah integer menjadi float
humi_val.f=(float)nilaisuhu[1];
temp_val.f=(float)nilaisuhu[0];
//menghitung suhu, kelembaban
humi_val.f=hitung_SHT(humi_val.f,&temp_val.f);
lcd_clear();
lcd_gotoxy(0,0);
sprintf(text,"SUHU = %0.2f \xdfC",temp_val.f);
lcd_puts(text);
lcd_gotoxy(0,1);
sprintf(text,"RH
= %0.2f %%",humi_val.f);
lcd_puts(text);
}
delay_ms(100);
if(temp_val.f>(float)suhu_max)
{

alarm();
}
else if(humi_val.f>(float)kelembaban_max)
{
alarm();
}
else
{
PORTA=0x00;
}
delay_ms(1000);
};
}
}

Dimana pada program tersebut memerintahkan mikrokontroller membaca


input keypad pada port mikrokontoller kemudian akan menetapkan suhu dan
kelembaban maksimum dari input keypad yang dimasukkan. Setelah itu pada
LCD akan tampil suhu dan kelembaban yang terdeteksi oleh sensor SHT11. Batas
suhu dan kelembaban maksimum juga dapat ditentukan saat program telah
berjalan seperti fungsi interupsi. Saat suhu atau kelembaban mencapai batas
maksimum maka LED pada port A akan berkedip. Program yang digunakan untuk
memasukan batas maksimum adalah syntax berikut:
SET_BATAS()
{
// set batas suhu
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 batas atas kelembaban
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;
}

Kemudian program alarm yang praktikan buat adalah seperti berikut:


while (1)
{
digit=read_keypad();
if(digit==10)
{
SET_BATAS();
}
else
{// Place your code here
//delay_ms(500);
error=0;
error+=ukur_SHT((unsigned
char*)
( &humi_val.i),&checksum,HUMI); //mengukur kelembaban
error+=ukur_SHT((unsigned
char*)
(&temp_val.i),&checksum,TEMP); //mengukur suhu
error += StatusReg_SHT(&inp, &checksum);
if(error!=0)
{
reset_SHT();
//jika ada error, reset
koneksi
putsf("Error");
}
else
{
//mengubah integer menjadi float
humi_val.f=(float)nilaisuhu[1];
temp_val.f=(float)nilaisuhu[0];
//menghitung suhu, kelembaban
humi_val.f=hitung_SHT(humi_val.f,&temp_val.f);
lcd_clear();
lcd_gotoxy(0,0);

sprintf(text,"SUHU = %0.2f \xdfC",temp_val.f);


lcd_puts(text);
lcd_gotoxy(0,1);
sprintf(text,"RH
= %0.2f %%",humi_val.f);
lcd_puts(text);
}
delay_ms(100);
if(temp_val.f>(float)suhu_max)
{
alarm();
}
else if(humi_val.f>(float)kelembaban_max)
{
alarm();
}
else
{
PORTA=0x00;
}
delay_ms(1000);
};
}

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

Dimana pada perbandingan kondisi tersebut kedua variabel sama-sama


diubah menjadi float. Pada awalnya nilai yang dimasukkan melalui keypad berupa
data integer. Untuk mengubah data integer tersebut menjadi float maka variabel
tersebut diberikan tambahan (float) pada awal variabel tersebut.
D. Kesimpulan
Dalam pemograman mikrokontroller, dapat digunakan sensor

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

You might also like