Introduction: Temperature & Humidity From Arduino to Raspberry Pi

Tracking temperature and humidity is important if you have a greenhouse, or have future plans to upgrade your greenhouse into a mini smart-farm.

For my first Instructable I will demonstrate how to create a prototype:

  • Connect a DHT11 temperature and humidity sensor to an Arduino Mega 2560
  • Program the Arduino in C to read the sensor data
  • Display temperature and humidity data on an LCD connected to the Arduino
  • Instruct the Arduino to send the sensor data to a Raspberry Pi 3 Model B+
  • Write code in Python to display the sensor data

Why use an RPi and Arduino together?

The Arduino and RPi connection can allow for great capabilities if you need I/O which the Arduino excels at and network communication/multithreading/visuals which the RPi is much better at.

In other words, we are going to use the Arduino for control intensive tasks and use the RPi for compute intensive tasks.

Ruggedized versions of Arduinos are available at Rugged-Circuits

Step 1: Getting Arduino & RPi Hardware

Arduino starter kits are readily available and allow you to experiment with different types of sensors and gadgets. Purchasing a starter kit works out cheaper instead of ordering various parts separately. I have supplied some affiliate links below pointing to Banggood and Amazon US.

Arduino Starter Kit (Banggood)

Arduino Starter Kit (Amazon US)

Element14 RPi 3 B+ Motherboard (Amazon US)

Raspberry Pi 3 B+ Case (Amazon US)

32GB Micro SD card (Amazon US).

Step 2: Connect the DHT11 & LCD to the Arduino

Step 3: Program the Arduino

#arduino-dht11-lcd2004
#Author: Vasoo Veerapen
#https://www.instructables.com/member/VasooV/
#Reads data from a DHT11 connected to an Arduino, displays on an LCD2004 and sends data over serial to Raspberry Pi
#include <dht.h>
#include <LiquidCrystal_I2C.h>
//LCD display is defined as device number 0x27 on the I2C bus
LiquidCrystal_I2C lcd(0x27, 20, 4);
//DHT11 is connected to pin 8
dht DHT;
#define sensorPin 8
//Raspberry Pi is connected to Serial 0
#define serialPi Serial
void setup() {
  lcd.begin(20, 4); // Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display
  lcd.init();
  lcd.backlight();
  serialPi.begin(9600);  //Arduino to serial monitor
}
void loop() {
  //Read sensor data
  int sensorData = DHT.read11(sensorPin);
  float temperature = DHT.temperature;
  float humidity = DHT.humidity;
  //Print temperature
  lcd.setCursor(0, 0);
  lcd.print("Temperature ");
  lcd.print(temperature);
  lcd.print(" C");
  //Print humidity
  lcd.setCursor(0, 1);
  lcd.print("Humidity    ");
  lcd.print(humidity);
  lcd.print(" %");
  //Send temperature and humidity data to Raspberry Pi
  serialPi.print("<");
  serialPi.print(temperature);
  serialPi.print(",");
  serialPi.print(humidity);
  serialPi.println(">");
  //Wait for 10 seconds
  delay(10000);
}

Step 4: The Working Arduino, LCD & DHT11 Setup

Step 5: Connect the Raspberry Pi to the Arduino

Step 6: RPi Python Code to Read the USB Port Serial Data

#rpi-arduino-dht11
#Raspberry Pi reads temperature and humidity sensor data from Arduino
import serial, string, time
#In this example /dev/ttyUSB0 is used
#This may change in your case to /dev/ttyUSB1, /dev/ttyUSB2, etc.
ser = serial.Serial('/dev/ttyUSB0', 9600)
#The following block of code works like this:
#If serial data is present, read the line, decode the UTF8 data,
#...remove the trailing end of line characters
#...split the data into temperature and humidity
#...remove the starting and ending pointers (< >)
#...print the output
while True:
        if ser.in_waiting > 0:
            rawserial = ser.readline()
            cookedserial = rawserial.decode('utf-8').strip('\r\n')
            datasplit = cookedserial.split(',')
            temperature = datasplit[0].strip('<')
            humidity = datasplit[1].strip('>')
            print(temperature)
            print(humidity)