DHT11 Library and Usage for Raspberry Pi
by Lan_Makerfabs in Circuits > Raspberry Pi
1156 Views, 0 Favorites, 0 Comments
DHT11 Library and Usage for Raspberry Pi
Raspberry Pi is a low-cost, credit-card-sized computer. It is a capable little device that can implement interesting projects of your mind. I plan to use it as a hardware development for my projects. Now I will show you the basic usage of the DHT11 and Raspberry Pi.
DHT11 Module
DHT11 is a basic, low-cost digital temperature and humidity sensor. It is often used in some electronic projects. Compared to other temperature sensors, they spent low-cost and using easily. Although it measuring with not high accuracy, it is popular to use in projects. DHT11 is good for 5~95% humidity readings with 5% accuracy and -20~60°C temperature readings with +-2°C accuracy.
DHT11 module has four-pin, which three one used for VCC, GND and DATA, and the last one is no connected. It uses the one-wire protocol to transfer data that all the sensor readings are sent using a single bus. The one-wire bus is a device communications bus that controller and device communicating with one wire. The data change and control are completed through this single line. Besides, it would reduce the cost of the wire and the use of the GPIO.
DHT11 Circuit Board
The DHT11 sensors usually require an external pull-up resistor of 10KΩ (R1) between VCC and Out pin for proper communication. When the bus is idle, the voltage status is High.
Raspberry Pi
Raspberry pi has a strong ability for computing. For suitable and low-cost, Raspberry pi Zero W is the best choice for a hardware project, which has enough calculating and smaller size. I used the PI hat designed by Makerfabs that based on Raspberry Pi Zero W to develop. Pi hat has a 3.2inch SPI display with touch for display something. It also provides many kinds of ports, such as UART, I2C, ADC, GPIO, that are very suitable for the embedded projects to expand. Besides, it has a speaker for the audio output. I can connect the DHT11 module with it by the cable easily.
DHT11 Library
Raspberry Pi Zero communicates with DHT11 by executing the special library DHT11.py. How the DHT11.py to perform the communication, let’s focus on the code:
First, the Pi Zero transmit the started signal to DHT11 module. Set the GPIO which the pin connected with the one-wire bus to output, and set the voltage level of the GPIO to high 50ms for preparation, then set to low 20ms for transmitting the start signal.
RPi.GPIO.setup(self.__pin, RPi.GPIO.OUT) # send initial high self.__send_and_sleep(RPi.GPIO.HIGH, 0.05) # pull down to low self.__send_and_sleep(RPi.GPIO.LOW, 0.02)
Next, Pi zero release the control permission of the GPIO that set the GPIO to input mode. After the DHT11 module received the start signal. The DHT11 module will set the bus status to low 83us and set it to High 87us for responding to the started signal. Then the DHT11 module would start to transmit the 40bits data one by one.
# change to input using pull up RPi.GPIO.setup(self.__pin, RPi.GPIO.IN, RPi.GPIO.PUD_UP) # collect data into an array data = self.__collect_input()
As you see, the data collected include the Responsive signal, and it has to calculate second time.
# parse lengths of all data pull up periods pull_up_lengths = self.__parse_data_pull_up_lengths(data) # if bit count mismatch, return error (4 byte data + 1 byte checksum) if len(pull_up_lengths) != 40: return DHT11Result(DHT11Result.ERR_MISSING_DATA, 0, 0)
The 40bit data include the humidity data, temperature data, and checksum: the 1~8bit are the integer part of humidity, the 9~16bit are the decimal part of humidity, the 17~24bit are the integer part of temperature, the 25~32bit are the decimal part of temperature, the 33~40bit are the checksum part. Such as:
The 40bit data I got from the oscilloscope are 01000011 00000000 00011010 00000100 01100001. The humidity one is 01000011 00000000, which means 67.0% humidity. The temperature one is 00011010 00000100, which means 26.6°C.
Checksum: 01100001 = 01000011 + 00000000 + 00011010 + 00000100
If the checksum is not equal to the sum of others, the data is wrong.
# calculate bits from lengths of the pull up periods bits = self.__calculate_bits(pull_up_lengths) # we have the bits, calculate bytes the_bytes = self.__bits_to_bytes(bits) # calculate checksum and check checksum = self.__calculate_checksum(the_bytes) if the_bytes[4] != checksum: return DHT11Result(DHT11Result.ERR_CRC, 0, 0) # ok, we have valid data, return it return DHT11Result(DHT11Result.ERR_NO_ERROR, the_bytes[2], the_bytes[0])
Loading Code and Show.
All code can be obtained from Github. Run the default code and operate it, it would get the DHT11 readings and display them on the LCD.