Deep Dive into Reading

Raspberry Pi Z W Monitoring Humidity and Temperature Via OLED Display Module


Supplies

Hardware Required:

  • Raspberry Pi zero w
  • Sensors
  • 128×64 OLED display module (SSD1306)
  • Connecting Wires

If you already know how to setup the sensor, you only need the Python code below, if not, go to step by step instructions.

Python code

#!/usr/bin/python
# -*- coding:utf-8 -*-
import ctypes
import time

import Adafruit_GPIO.SPI as SPI
import Adafruit_SSD1306

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

import subprocess
RST = None     # on the PiOLED this pin isnt used
# Note the following are only used with SPI:
DC = 23
SPI_PORT = 0
SPI_DEVICE = 0
disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST)
disp.begin()

# Clear display.
disp.clear()
disp.display()

# Create blank image for drawing.
# Make sure to create image with mode '1' for 1-bit color.
width = disp.width
height = disp.height
image = Image.new('1', (width, height))

# Get drawing object to draw on image.
draw = ImageDraw.Draw(image)

# Draw a black filled box to clear the image.
draw.rectangle((0,0,width,height), outline=0, fill=0)

# Draw some shapes.
# First define some constants to allow easy resizing of shapes.
padding = -2
top = padding
bottom = height-padding
# Move left to right keeping track of the current x position for drawing shapes.
x = 0


# Load default font.
font = ImageFont.load_default()

class SHTC3:
    def __init__(self):
        self.dll = ctypes.CDLL("./SHTC3.so")
        init = self.dll.init
        init.restype = ctypes.c_int
        init.argtypes = [ctypes.c_void_p]
        init(None)

    def SHTC3_Read_Temperature(self):
        temperature = self.dll.SHTC3_Read_TH
        temperature.restype = ctypes.c_float
        temperature.argtypes = [ctypes.c_void_p]
        return temperature(None)

    def SHTC3_Read_Humidity(self):
        humidity = self.dll.SHTC3_Read_RH
        humidity.restype = ctypes.c_float
        humidity.argtypes = [ctypes.c_void_p]
        return humidity(None)


if __name__ == "__main__":
    shtc3 = SHTC3()
    while True:
        print('Temperature = %6.2f°C , Humidity = %6.2f%%' % (shtc3.SHTC3_Read_Temperature(), shtc3.SHTC3_Read_Humidity()))
        
        draw.rectangle((0,0,width,height), outline=0, fill=0)

        # Shell scripts for system monitoring from here : https://unix.stackexchange.com/questions/119126/command-to-display-memory-usage-disk-usage-and-cpu-load
        cmd = "hostname -I | cut -d\ '\' -f1"
        IP = subprocess.check_output(cmd, shell = True )
        cmd = "top -bn1 | grep load | awk '{printf \"CPU Load: %.2f\", $(NF-2)}'"
        CPU = subprocess.check_output(cmd, shell = True )
        cmd = "free -m | awk 'NR==2{printf \"Mem: %s/%sMB %.2f%%\", $3,$2,$3*100/$2 }'"
        MemUsage = subprocess.check_output(cmd, shell = True )
        cmd = "df -h | awk '$NF==\"/\"{printf \"Disk: %d/%dGB %s\", $3,$2,$5}'"
        cmd = "vcgencmd measure_temp | cut -f 2 -d '='"
        temp = subprocess.check_output(cmd, shell= True )
        Disk = subprocess.check_output(cmd, shell = True )
        tempe =  str('%6.2f°C'% shtc3.SHTC3_Read_Temperature())
        hum = str('%6.2f%%' % shtc3.SHTC3_Read_Humidity())  
        # Write two lines of text. Choose whatever you want to view on the screen!

        draw.text((x, top),       "IP: " + str(IP, 'utf-8'),  font=font, fill=255)
        #draw.text((x, top+8),     str(CPU, 'utf-8') + " " + str(temp,'utf-8'), font=font, fill=255)
        #draw.text((x, top+16),    str(MemUsage, 'utf-8'),  font=font, fill=255)
        #draw.text((x, top+25),    str(Disk, 'utf-8'),  font=font, fill=255)
        #draw.text((x, top+8),     "Temp:" + str(temp, 'utf-8'), font=font, fill=255)
        draw.text((x, top+16),  "Temperature:" + tempe, font=font, fill=255)
        draw.text((x, top+25), "Humidity: " + hum, font=font, fill=255)
        
        
        
        disp.image(image)
        disp.display()
        time. Sleep(.1)
       

Below are the connections of OLED module with Raspberry zero w:

  • SDA ==> GPIO 2(pin 3)
  • SCL ==> GPIO 3(pin 5)
  • VCC ==> 3.3V(pin 1)
  • GND ==> GND(pin 14)

Step by step Instructions

Step 1- Install OS

Install Raspberry Pi OS lite or Desktop environment, instruction here

Step 2- Enable SHH in raspberry Pi

To enable SSH access on your headless Raspberry Pi, simply create an empty file called  ssh at the root of your SD card.

Then, create a file at the root of the SD card called wpa_supplicant.conf. Replace WIFI_NAME and WIFI_PASSWORD with the actual name and password for your WiFi network.

Code:

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=<US>
network={
 ssid="YOUR WIFI_NAME"
 psk="YOUR WIFI_PASSWORD"
}

Find the IP Address of Raspberry Pi, how? In windows terminal type:

ping raspberrypi.local

Connecting to pi via terminal

In windows terminal type: ssh pi@”your_ip_address_here”. The default Raspberry Pi username is pi and the default password is raspberry.

ssh pi@xxx.xxx.x.xxx

Step 3 setting up the sensor

Open the Raspberry Pi terminal and enter the following command to enter the configuration interface.

sudo raspi-config 

In the interface enable iC2: Choose Interfacing Options -> I2C ->yes start i2C kernel driver and, reboot Raspberry Pi with the command:

sudo reboot

If you want to use WiringPi library instead of Python read this first and then install the libraries following these instructions.

Installing Python and libraries. 
sudo apt-get update
#python2
sudo apt-get install python-pip 
sudo pip install RPi.GPIO
sudo pip install spidev
sudo apt-get install python-smbus
#python3
sudo apt-get install python-pip3 
sudo pip3 install RPi.GPIO
sudo pip3 install spidev
sudo apt-get install python3-smbus

Open Python and write the program describe above save it with the name you want, in my case was th.py

To run the program, type on terminal:

sudo python3 th.py

Step 4 working with the display

To find a list of the devices connected to the I2C bus on the Raspberry Pi you can use the following command:

sudo i2cdetect -y 1

 Install Adafruit Python Library for OLED Display Module

git clone  https://github.com/adafruit/Adafruit_Python_SSD13...

Once completes navigate to the library’s directory:

cd Adafruit_Python_SSD1306
sudo python3 setup.py install

Step 5: Running “xxx.py” on Startup

You can easily make it, so this program runs every time you boot your Raspberry Pi.

The fastest and easiest way is to put it in /etc/rc.local. Run the bellow command on terminal:

sudo nano /etc/rc.local

Scroll down, and just before the exit 0 line, enter the following (replace xxx with the name of your file):

sudo python /home/pi/xxx.py &
  • Save and exit.
  • Reboot to verify that the screen comes up on boot!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: