Tuesday, June 24, 2025

DHT 11

 DHT11


Peralatan yang diperlukan :

  1. 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

 



  1. 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 


  1. 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