DHT11
Peralatan yang diperlukan :
Komponen Raspberry Pi
Raspberry Pi
Berfungsi sebagai otak dari rangkaian serta memonitoring gerak rangkaian
Adaptor Raspberry Pi
Berfungsi sebagai pemasok daya untuk Raspberry Pi
Kabel VGA
Berfungsi untuk menampilkan layar pada monitor dari Raspberry Pi
Perangkat utama
Monitor
Berfungsi Sebagai tampilan visual untuk melakukan setup dan coding pada Raspberry Pi
Mouse
Berfungsi Sebagai komponen kendali untuk monitor
Keyboard
Berfungsi Sebagai komponen kendali untuk mengetik
Komponen elektronika
Breadboard
Berfungsi sebagai tempat dimana komponen diletakkan dan teraliri aliran listrik
Kabel Male-Female
Berfungsi untuk menghubungkan Pin dari Raspberry pada komponen
LCD + I2C module
GPIO Extension Cable
DHT11
Gambar Rangkaian dan Schematic DHT11
Langkah Langkah :
Bukalah terminal lalu ketikkan “sudo apt-get update” lalu enter,
Menyalakan fitur i2c dan SPI di terminal dengan cara,
Ketikkan “sudo raspi-config”
Maka akan tertampil seperti dibawah ini
Arahkan ke Interface Option lalu enter, lalu arahkan ke SPI, lalu enter, lalu arahkan ke Yes lalu enter.
Buka kembali sudo raspi-config
Sama, arahkan ke Interface Option lalu enter, lalu arahkan ke I2C, lalu enter, lalu arahkan Yes dan enter.
Setelah sudah di enable semua, silahkan reboot Raspberry Pi nya.
Setelah reboot buka kembali ke terminal lalu ketikkan “sudo nano /etc/modules”.
Tambahkan “i2c-bcm2708” kalau belum ada, setelah itu silahkan di save.
Ketikkan di terminal yaitu “lsmod | grep i2c”, kalau di terminal tertulis i2c-bcm2708 berarti langkah-langkahnya sudah tepat.
Ketikkan “sudo i2cdetect -y 1” dilihat jika sudah ada angka 27 berarti sudah benar
Persiapan di terminal sudah selesai semuanya. Sekarang buatlah folder baru di /home/pi dengan nama “DHT11”
Setelah itu buka Thonny Python IDE lalu klik New dan ketikkan
import time
import RPi.GPIO as GPIO
class DHT11Result:
'DHT11 sensor result returned by DHT11.read() method'
ERR_NO_ERROR = 0
ERR_MISSING_DATA = 1
ERR_CRC = 2
error_code = ERR_NO_ERROR
temperature = -1
humidity = -1
def __init__(self, error_code, temperature, humidity):
self.error_code = error_code
self.temperature = temperature
self.humidity = humidity
def is_valid(self):
return self.error_code == DHT11Result.ERR_NO_ERROR
class DHT11:
'DHT11 sensor reader class for Raspberry'
__pin = 0
def __init__(self, pin):
self.__pin = pin
def read(self):
GPIO.setup(self.__pin, GPIO.OUT)
# kirim nilai tertinggi awal
self.__send_and_sleep(GPIO.HIGH, 0.05)
# tarik ke bawah
self.__send_and_sleep(GPIO.LOW, 0.02)
# ubah ke input menggunakan pull up
GPIO.setup(self.__pin, GPIO.IN, GPIO.PUD_UP)
# mengumpulkan data ke dalam array
data = self.__collect_input()
# parsing panjang semua periode penarikan data
pull_up_lengths = self.__parse_data_pull_up_lengths(data)
# jika jumlah bit tidak cocok, kembalikan kesalahan (4 byte data + 1 byte checksum)
if len(pull_up_lengths) != 40:
return DHT11Result(DHT11Result.ERR_MISSING_DATA, 0, 0)
# menghitung bit dari lamanya periode pull up
bits = self.__calculate_bits(pull_up_lengths)
# kita punya bitnya, hitung byte
the_bytes = self.__bits_to_bytes(bits)
# menghitung checksum dan memeriksa
checksum = self.__calculate_checksum(the_bytes)
if the_bytes[4] != checksum:
return DHT11Result(DHT11Result.ERR_CRC, 0, 0)
# oke, kami punya data yang valid, kembalikan
return DHT11Result(DHT11Result.ERR_NO_ERROR, the_bytes[2], the_bytes[0])
def __send_and_sleep(self, output, sleep):
GPIO.output(self.__pin, output)
time.sleep(sleep)
def __collect_input(self):
# mengumpulkan data sementara tidak berubah ditemukan
unchanged_count = 0
# ini digunakan untuk menentukan di mana akhir data
max_unchanged_count = 100
last = -1
data = []
while True:
current = GPIO.input(self.__pin)
data.append(current)
if last != current:
unchanged_count = 0
last = current
else:
unchanged_count += 1
if unchanged_count > max_unchanged_count:
break
return data
def __parse_data_pull_up_lengths(self, data):
STATE_INIT_PULL_DOWN = 1
STATE_INIT_PULL_UP = 2
STATE_DATA_FIRST_PULL_DOWN = 3
STATE_DATA_PULL_UP = 4
STATE_DATA_PULL_DOWN = 5
state = STATE_INIT_PULL_DOWN
lengths = [] # will contain the lengths of data pull up periods
current_length = 0 # will contain the length of the previous period
for i in range(len(data)):
current = data[i]
current_length += 1
if state == STATE_INIT_PULL_DOWN:
if current == GPIO.LOW:
# oke, kita sudah melakukan pull down awal
state = STATE_INIT_PULL_UP
continue
else:
continue
if state == STATE_INIT_PULL_UP:
if current == GPIO.HIGH:
# oke, kita mendapat pull up awal
state = STATE_DATA_FIRST_PULL_DOWN
continue
else:
continue
if state == STATE_DATA_FIRST_PULL_DOWN:
if current == GPIO.LOW:
# kita melakukan pull down awal, selanjutnya adalah pull up data
state = STATE_DATA_PULL_UP
continue
else:
continue
if state == STATE_DATA_PULL_UP:
if current == GPIO.HIGH:
# data yang ditarik, lamanya penarikan ini akan menentukan apakah itu 0 atau 1
current_length = 0
state = STATE_DATA_PULL_DOWN
continue
else:
continue
if state == STATE_DATA_PULL_DOWN:
if current == GPIO.LOW:
# ditarik ke bawah, kita menyimpan panjang periode pull up sebelumnya
lengths.append(current_length)
state = STATE_DATA_PULL_UP
continue
else:
continue
return lengths
def __calculate_bits(self, pull_up_lengths):
# temukan periode terpendek dan terpanjang
shortest_pull_up = 1000
longest_pull_up = 0
for i in range(0, len(pull_up_lengths)):
length = pull_up_lengths[i]
if length < shortest_pull_up:
shortest_pull_up = length
if length > longest_pull_up:
longest_pull_up = length
# gunakan setengahnya untuk menentukan apakah periodenya panjang atau pendek
halfway = shortest_pull_up + (longest_pull_up - shortest_pull_up) / 2
bits = []
for i in range(0, len(pull_up_lengths)):
bit = False
if pull_up_lengths[i] > halfway:
bit = True
bits.append(bit)
return bits
def __bits_to_bytes(self, bits):
the_bytes = []
byte = 0
for i in range(0, len(bits)):
byte = byte << 1
if (bits[i]):
byte = byte | 1
else:
byte = byte | 0
if ((i + 1) % 8 == 0):
the_bytes.append(byte)
byte = 0
return the_bytes
def __calculate_checksum(self, the_bytes):
return the_bytes[0] + the_bytes[1] + the_bytes[2] + the_bytes[3] & 255
Lalu save di folder DHT11 yang sudah dibuat tadi dan berilah nama “dht11”.
Buatlah program baru dengan klik New dan ketikkan program berikut ini.
import smbus
import time
import dht11
import RPi.GPIO as GPIO
#tentukan GPIO 14 sebagai pin data DHT11
Temp_sensor=14
# Define some device parameters
I2C_ADDR = 0x27 # Alamat perangkat I2C, jika ada kesalahan, ubah alamat ini menjadi 0x27
LCD_WIDTH = 16 # Karakter maksimum per baris
# Tentukan beberapa konstanta perangkat
LCD_CHR = 1 # Mode - Sending data
LCD_CMD = 0 # Mode - Sending command
LCD_LINE_1 = 0x80 # Alamat RAM LCD untuk baris pertama
LCD_LINE_2 = 0xC0 # Alamat RAM LCD untuk baris kedua
LCD_LINE_3 = 0x94 # Alamat RAM LCD untuk baris ketiga
LCD_LINE_4 = 0xD4 # Alamat RAM LCD untuk baris keempat
LCD_BACKLIGHT = 0x08 # LCD Menyala
#LCD_BACKLIGHT = 0x00 # LCD Mati
ENABLE = 0b00000100 # Menyalakan Bit LCD
# Konstanta waktu
E_PULSE = 0.0005
E_DELAY = 0.0005
#Buka antarmuka I2C
#bus = smbus.SMBus(0) # Rev 1 Pi uses 0
bus = smbus.SMBus(1) # Rev 2 Pi uses 1
def lcd_init():
# Inisialisasi tampilan
lcd_byte(0x33,LCD_CMD) # 110011 Initialise
lcd_byte(0x32,LCD_CMD) # 110010 Initialise
lcd_byte(0x06,LCD_CMD) # 000110 Cursor move direction
lcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off
lcd_byte(0x28,LCD_CMD) # 101000 Data length, number of lines, font size
lcd_byte(0x01,LCD_CMD) # 000001 Clear display
time.sleep(E_DELAY)
def lcd_byte(bits, mode):
# Kirim byte ke pin data
# bit = data
# mode = 1 untuk data
# 0 untuk perintah
bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT
bits_low = mode | ((bits<<4) & 0xF0) | LCD_BACKLIGHT
# bit LCD menyala
bus.write_byte(I2C_ADDR, bits_high)
lcd_toggle_enable(bits_high)
# bit LCD mati
bus.write_byte(I2C_ADDR, bits_low)
lcd_toggle_enable(bits_low)
def lcd_toggle_enable(bits):
# Alihkan aktifkan
time.sleep(E_DELAY)
bus.write_byte(I2C_ADDR, (bits | ENABLE))
time.sleep(E_PULSE)
bus.write_byte(I2C_ADDR,(bits & ~ENABLE))
time.sleep(E_DELAY)
def lcd_string(message,line):
# Kirim string untuk ditampilkan
message = message.ljust(LCD_WIDTH," ")
lcd_byte(line, LCD_CMD)
for i in range(LCD_WIDTH):
lcd_byte(ord(message[i]),LCD_CHR)
def main():
# Block program utama
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM) # Use BCM GPIO numbers
# Initialise display
lcd_init()
instance = dht11.DHT11(pin = Temp_sensor)
while True:
#get DHT11 sensor value
result = instance.read()
# Kirimkan beberapa tes
if result.is_valid():
lcd_string("temp:"+str(result.temperature)+" C",LCD_LINE_1)
lcd_string("humid:"+str(result.humidity)+"%",LCD_LINE_2)
time.sleep(3) # jeda 3 detik
lcd_string("POLITEKNIK ATMI",LCD_LINE_1)
lcd_string("SURAKARTA",LCD_LINE_2)
time.sleep(3)
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
pass
finally:
lcd_byte(0x01, LCD_CMD)
Silahkan save di folder DHT11 yang sudah dibuat tadi dan buatlah nama “dht11temp”
Silahkan run program “dht11.py” terlebih dahulu, setelah itu run program “dht11temp.py”.
Jika benar maka di LCD akan tertampil seperti ini
Jika ada error 121 remote I/O error seperti ini (Kalau tidak ada error abaikan ini!)
Gantilah code pada line “I2C_ADDR = 0x27” pada angka “27” gantilah dengan code yang sudah ada di terminal waktu menuliskan “sudo i2cdetect -y 1”.
HASIL OUTPUT PROGRAM & RANGKAIAN
Hasil Output Program yang benar
Hasil LCD yang akan tertampil
SELESAI
No comments:
Post a Comment