#################################################################################
# Temperature and Humidity monitoring using Thingspeak #
#################################################################################
#
# Temperature and Humidity monitoring using Thingspeak IoT platform
#
# DHT22 sensor + OLED display with Raspberry Pi Pico / W
#
# Check out the link for Code explanation and Hardware details
# Link:
# http://tech.arunkumarn.in/blogs/raspberry-pi-pico/
#
#
from machine import Pin, I2C
import dht
import time
import json
import framebuf
from icons import pico_logo
from ssd1306 import SSD1306_I2C
# Display interface
i2c=I2C(1,scl=Pin(3),sda=Pin(2),freq=400000)
display = SSD1306_I2C(128, 64, i2c)
# Sensor interface
sensor = dht.DHT22(Pin(21))
# Wifi Configeration
ssid = "Wokwi-GUEST"
password = "aavishkarah"
wifi_connected = False
# Thingspeak Configeration
api_key = "API_KEY"
host = "api.thingspeak.com"
def erase_lines(y, line=1):
display.rect(0,y, 128, 8*line, 0, True)
def blink_display(n=1, delay=250):
for _ in range(n):
display.invert(1)
display.contrast(100)
display.show()
time.sleep_ms(delay)
display.invert(0)
display.contrast(0)
display.show()
time.sleep_ms(delay)
def display_datasent_status(status):
erase_lines(40, 2)
if status == "200":
display.text("Data Sent", 24, 44)
elif status == "400":
display.text("400 ERROR", 24, 44)
blink_display(2, 150)
else:
display.text("ERROR: Check WiFi", 0, 44)
blink_display()
display.show()
time.sleep_ms(1000)
erase_lines(40, 2)
display.show()
def do_connect(ssid, password):
global wifi_connected
import network
time.sleep_ms(2000)
sta_if = network.WLAN(network.STA_IF)
wifi_connected = sta_if.isconnected()
if not wifi_connected:
sta_if.active(True)
sta_if.connect(ssid, password)
loc = 10
for i in range(10):
display.text("*",loc,45)
display.show()
time.sleep_ms(2500)
wifi_connected = sta_if.isconnected()
if wifi_connected:
display.fill(0)
display.text('Wifi Connected',10,30)
display.show()
time.sleep_ms(1000)
blink_display(4, 100)
break
loc += 10
if not wifi_connected:
display.fill(0)
display.text(" NO INTERNET ",0,20)
display.show()
time.sleep_ms(2000)
blink_display(4, 100)
else:
display_wifi_connected()
def send_data(temperature, humidity):
try:
import socket
path = f"/update?api_key={api_key}&field1={temperature:0.2f}&field2={humidity:0.2f}"
addr = socket.getaddrinfo(host, 80)[0][-1]
s = socket.socket()
s.connect(addr)
s.send(bytes('GET /%s HTTP/1.0\r\nHost: %s\r\n\r\n' % (path, host), 'utf8'))
while True:
data = str(s.recv(1024)).replace('b','').replace("'", "")
# print(data)
if data:
if data.startswith("HTTP/"):
status_code = data.split()[1]
else:
break
s.close()
display_datasent_status(status_code)
except:
display_datasent_status(False)
global wifi_connected
wifi_connected = False
def welcome_message():
# display Raspberry Pi Pico Logo
display.fill(0)
display.blit(pico_logo, 48, 0)
display.show()
time.sleep_ms(2500)
# display Aavishkarah
display.text('Welcome to',25,34)
display.show()
time.sleep_ms(250)
display.text("Aavishkarah",20,45)
display.show()
time.sleep_ms(2500)
welcome_message()
display.fill(0)
display.text("Connecting to",10,20)
display.text("Wifi",45,34)
display.text("*",0,45)
display.show()
time.sleep_ms(50)
# connect to wifi
do_connect(ssid, password)
# Clear the display
display.fill(0)
while True:
sensor.measure()
temperature = sensor.temperature()
humidity = sensor.humidity()
# display temperature & humidity
erase_lines(12, 3)
display.text("Temper.t. :", 0, 12)
display.text("Humidity :", 0, 24)
display.text(str(temperature), 85, 12)
display.text(str(humidity), 85, 24)
display.show()
# Send data to thingspeak
send_data(temperature, humidity)
# Thingspeak accepts data for every 15 sec
# 15 sec delay
time.sleep_ms(15000)