본문 바로가기
라즈베리파이_피코_피코 W/마이크로파이썬

09. 라즈베리파이 피코 DHT11제어

by 땜블리 2023. 3. 3.
728x90
반응형
SMALL

안녕하세요 땜블리 입니다.

라즈베리파이 피코 베이직 트레이닝 보드를 이용한 DHT11 제어실습을 진행 하겠습니다.

베이직 트레이닝 보드는 아래에서 확인이 가능합니다.

https://ttcw.tistory.com/4

 

라즈베리파이 피코 베이직 트레이닝보드 구성

라즈베리파이 피코 보드의 펌웨어실습을 위한 베이직 트레이닝보드를 소개 합니다. 현재 네이버 스마트스토어에서 판매가 진행되고 있습니다. 라즈베리파이 피코 베이직 트레이닝 보드 라즈베

ttcw.tistory.com

1) DHT11 제어 구동 원리

(1) 동작설명

 

DHT11 모양 및 구성

DHT114핀으로 되어있으며 사용하는 핀은 3개입니다.

스팩은 3.3V~5.5V까지 사용할 수 있으며 습도 범위는 5~95%RH 온도는 20~60도 측정됩니다

 

통신 방식은 1-wired 통신으로 신호핀 하나로 출력과 입력을 모두 사용하는 방식입니다.

MCU에서는 18msTrigger 신호를 Ative Low 로 출력하게 되면 보내주시면 이후부터는 40bit의 데이터가 입력이 됩니다.

 

입력되는 신호의 01의 구분은 Pulse width로 결정을 합니다. 1개의 구형파 주기에서 high 구간이 26~28 us라면 0으로 인식하고 70us라면 1로 인식합니다.

 

아래 표는 40bit에 대한 Packet 구조

 

습도 센싱 원리

 

습도 감지 구성 요소에는 수분 보유 기판이 사이에 끼인 두 개의 전극이 있습니다.

이온은 수증기가 기판에 흡수됨에 따라 기판에서 방출되며, 이는 다시 전극 사이의 전도도를 증가시킵니다.

두 전극 사이의 저항 변화는 상대 습도에 비례합니다.

상대 습도가 높으면 전극 사이의 저항이 감소하고 상대 습도가 낮으면 전극 사이의 저항이 증가합니다.

반응형

온도 측정 원리

DHT11에는 온도를 측정하기 위한 NTC/서미스터도 포함되어 있습니다. 서미스터는 온도에 따라 저항이 크게 변하는 열 저항기입니다. "NTC"라는 용어는 "음의 온도 계수"를 의미하며 온도가 증가함에 따라 저항이 감소한다는 의미입니다.

 

2) DHT11 센서의 온도/습도 제어

(1) 동작설명

dht 모듈의 함수를 사용하여 온습도 값을 가져와 UART로 출력 합니다.

 

(2) 코드작성

dht.py

import sys

if sys.platform.startswith("esp"):
    from esp import dht_readinto
elif sys.platform == "mimxrt":
    from mimxrt import dht_readinto
elif sys.platform == "rp2":
    from rp2 import dht_readinto
elif sys.platform == "pyboard":
    from pyb import dht_readinto
else:
    from machine import dht_readinto


class DHTBase:
    def __init__(self, pin):
        self.pin = pin
        self.buf = bytearray(5)

    def measure(self):
        buf = self.buf
        dht_readinto(self.pin, buf)
        if (buf[0] + buf[1] + buf[2] + buf[3]) & 0xFF != buf[4]:
            raise Exception("checksum error")


class DHT11(DHTBase):
    def humidity(self):
        return self.buf[0]

    def temperature(self):
        return self.buf[2]


class DHT22(DHTBase):
    def humidity(self):
        return (self.buf[0] << 8 | self.buf[1]) * 0.1

    def temperature(self):
        t = ((self.buf[2] & 0x7F) << 8 | self.buf[3]) * 0.1
        if self.buf[2] & 0x80:
            t = -t
        return t

main.py

import th

th.py

from machine import UART, Pin
from time import sleep
import dht
led1 = Pin(2,Pin.OUT)
led2 = Pin(3,Pin.OUT)
led1.value(1)
led2.value(1)

dhtIn = Pin(7,Pin.IN) # 온/습도 센서 설정
dhtOut = dht.DHT11(dhtIn)# 온/습도 센서 설정

while True:
    led1.value(0)
    dhtOut.measure()
    temp = dhtOut.temperature()
    humi = dhtOut.humidity()

    print('Temperature = {}C   Humidity = {}%'.format(temp,humi))
    
    led1.value(1)
    sleep(1)

 

(3) 동작결과

 

3) 설정 온도/습도에 따른 릴레이 제어

(1) 동작설명

온도가 28도가 넘어가면 릴레이가 동작 됩니다.

 

(2) 코드작성

dht.py

상단 코드 참조

main.py

import th_Relay

th_Relay.py

from machine import UART, Pin
from time import sleep
import dht
led1 = Pin(2,Pin.OUT)
led2 = Pin(3,Pin.OUT)
led1.value(1)
led2.value(1)
relay = Pin(12,Pin.OUT)#릴레이 설정
dhtIn = Pin(7,Pin.IN) # 온/습도 센서 설정
dhtOut = dht.DHT11(dhtIn)# 온/습도 센서 설정
uart0 = UART(0, baudrate=115200, bits=8, parity=None, stop=1, tx=Pin(16), rx=Pin(17))# UART 설정
uart0.write("pico sensorBoard Test\n")
relayState=0

while True:
    led1.value(0)
    
    dhtOut.measure()
    temp = dhtOut.temperature()
    humi = dhtOut.humidity()
    
    print('Temperature = {}C   Humidity = {}%'.format(temp,humi))
    print('RELAY STATE = {}\n'.format(relayState))
        
    if temp >=28:
        relay.off() #relay on
        relayState=1
    else: 
        relay.on() #relay off
        relayState=0
    
    led1.value(1)
    
    sleep(1)

(3) 동작결과

728x90
반응형
LIST

댓글