As I promised in my previous article, I will show you how to connect a temperature sensor to a Raspberry Pi, read real telemetry data, and send it to the Azure IoT Hub:
I am using a Raspberry Pi 4, a DHT11 temperature sensor, and a GPIO Extension Board to connect the sensor to the Raspberry. We’ll be using Azure IoT Python SDK enabling connection to the Azure IoT Hub. And we need DHT11 Python library for reading temperature and humidity from DHT11 sensor on Raspberry Pi.
First, we need to create an IoT Hub and to set up a Raspberry Pi. Repeat the steps described in my article “Connect Raspberry Pi 4 to Azure IoT Hub“:
Connect the sensor to Raspberry Pi
The DHT11 sensor can collect temperature and humidity data. Use the following wiring to connect the sensor to GPIO pins:
DHT11 Sensor pins | GPIO pins |
---|---|
Vcc (+) | 5V (pin 2) |
Ground (-) | GND (pin 6) |
Data | GPIO17 (pin 11) |

Turn on your Raspberry Pi and connect it to your network.
Run the application
When it is done, clone the azure-iot-blog GitHub repository into a folder in your Raspberry Pi:
git clone https://github.com/jevgenij-p/azure-iot-blog.git
Find the Python application send_sensor_data.py in the raspberry-to-iot-hub/send-telemetry folder:
import asyncio import time import board import RPi.GPIO as GPIO import dht11 from azure.iot.device import Message from azure.iot.device.aio import IoTHubDeviceClient CONNECTION_STRING = "" DELAY = 5 TEMPERATURE = 20.0 HUMIDITY = 60 PAYLOAD = '{{"temperature": {temperature}, "humidity": {humidity}}}' async def main(): try: # Create instance of the device client client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING) # Initialize GPIO GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.cleanup() # Read data using pin GPIO17 dhtDevice = dht11.DHT11(pin=17) print("Simulated device started. Press Ctrl-C to exit") while True: try: result = dhtDevice.read() if result.is_valid(): temperature = result.temperature humidity = result.humidity data = PAYLOAD.format(temperature=temperature, humidity=humidity) message = Message(data) # Send a message to the IoT hub print(f"Sending message: {message}") await client.send_message(message) print("Message successfully sent") else: # print("Error: %d" % result.error_code) continue await asyncio.sleep(DELAY) except KeyboardInterrupt: print("Simulated device stopped") GPIO.cleanup() break except Exception as error: print(error.args[0]) if __name__ == '__main__': asyncio.run(main())
IMPORTANT
Make sure you copy-paste the Primary Connection String you saved when you created your IoT device, into the quotes in the Line 9.
Now, open your Raspberry Pi terminal and install Python packages:
pip3 install azure-iot-device
pip3 install asyncio
pip2 install dht11
Run the application:
python3 send_sensor_data.py
If everything is configured and connected correctly, the program will be sending sensor data every 5 seconds to your IoT hub:

Open Azure Portal, find your IoT hub, and select Overview in the left navigation menu. You should see number of messages received by your IoT hub from your device:

Stay tuned. I’ll continue the “Azure IoT” series.