"""
Room Monitoring System - ThingSpeak IoT
- Measures and assesses suitability for reading activity.
- Sends data (Temp, Hum, Lux) to ThingSpeak for remote monitoring.
- Tested with CircuitPython 8.0.0-beta.6
"""
import os
import ipaddress
import wifi
import socketpool
import time
import microcontroller
import board
import digitalio
# Removed simpleio (buzzer)
import adafruit_requests
import ssl
import adafruit_dht
import analogio
import random
# Get wifi and thingspeak write API details from a settings.toml file
print(os.getenv("test_env_file"))
WIFI_SSID = "UniMAP-WiFi"
WIFI_PASSWORD = "221061458"
tswriteAPI = os.getenv("POOTQMFGGS423B68")
# Thingspeak API url.
API_URL = "http://api.thingspeak.com"
# --- Hardware Initialization ---
# DHT22 (Temperature & Humidity)
dht22 = adafruit_dht.DHT22(board.GP0)
# LDR (Light Intensity)
ldr = analogio.AnalogIn(board.GP27)
R = 10000 # ohm resistance value (Resistor in voltage divider)
# --- Sensor Reading Functions ---
def readDHT22():
"""Reads temperature in Celsius and relative humidity."""
temperature = dht22.temperature
humidity = dht2humi
return temperature, humidity
def rtolux():
"""Converts LDR resistance reading to Lux (light intensity)."""
raw = ldr.value
vout = (raw * 3.3) / 65536
RLDR = (vout*R)/(3.3-vout)
# Conversion resitance to lumen (Approximation)
lux = 500/(RLDR/1000)
return lux
# --- Suitability Assessment Function ---
def assess_suitability(temp, humi, lux):
"""
Assesses room conditions for reading activity based on common recommendations.
Returns a string assessment and an integer suitability score.
Score: 1 (Suitable), 0 (Not Ideal), -1 (Unsuitable)
"""
suitability_score = 1 # Start as suitable
assessment_list = []
# 1. Light Intensity (Lux)
# Recommended lux for reading/studying is generally 300 to 750 lux.
if lux < 300:
assessment_list.append("Light is TOO LOW for reading (<300 lx).")
suitability_score = max(suitability_score, 0) # Not ideal
elif lux > 1000:
assessment_list.append("Light is TOO HIGH, potential glare (>1000 lx).")
suitability_score = max(suitability_score, 0) # Not ideal
else:
assessment_list.append("Light intensity is GOOD (300-1000 lx).")
# 2. Temperature (°C)
# Ideal temperature for comfort/studying is typically 20°C to 24°C.
if temp < 18:
assessment_list.append("Temperature is TOO COLD for comfort (<18°C).")
suitability_score = -1
elif temp > 26:
assessment_list.append("Temperature is TOO WARM for focus (>26°C).")
suitability_score = -1
else:
assessment_list.append("Temperature is GOOD (18°C-26°C).")
# 3. Humidity (%)
# Ideal humidity for comfort/air quality is typically 40% to 60%.
if humi < 30:
assessment_list.append("Humidity is TOO DRY (<30%).")
suitability_score = max(suitability_score, 0) # Not ideal
elif humi > 70:
assessment_list.append("Humidity is TOO HIGH/Muggy (>70%).")
suitability_score = max(suitability_score, 0) # Not ideal
else:
assessment_list.append("Humidity is GOOD (30%-70%).")
# Final Assessment String
if suitability_score == 1:
final_assessment = "ROOM IS SUITABLE for Reading Activity."
elif suitability_score == 0:
final_assessment = "ROOM IS MARGINALLY SUITABLE (Some parameters are not ideal)."
else:
final_assessment = "ROOM IS UNSUITABLE for Reading Activity (Temperature issue)."
return final_assessment, assessment_list, suitability_score
# --- Main Loop ---
# Connect to Wi-Fi AP
print(f"Initializing Room Monitoring System...")
wifi.radio.connect(ssid, password)
print("Connected to WiFi!")
pool = socketpool.SocketPool(wifi.radio)
print("IP Address: {}".format(wifi.radio.ipv4_address))
requests = adafruit_requests.Session(pool, ssl.create_default_context())
while True:
try:
# Check and reconnect Wi-Fi if necessary
while not wifi.radio.ipv4_address or "0.0.0.0" in repr(wifi.radio.ipv4_address):
print(f"Wi-Fi connection lost. Reconnecting...")
wifi.radio.connect(ssid, password)
# Read the Sensors
dhtval = readDHT22()
luxval = rtolux()
temp = round(dhtval[0],2)
humi = round(dhtval[1],2)
lux = round(luxval,2)
# Assess Suitability
assessment, details, suitability_score = assess_suitability(temp, humi, lux)
print("\n--- Room Conditions ---")
print(f"Temperature: {temp}°C | Humidity: {humi}% | Light Intensity: {lux} lx")
print("-----------------------")
print(f"**Suitability Assessment:** {assessment}")
for detail in details:
print(f" - {detail}")
print("-----------------------")
# Prepare Data for ThingSpeak
# field1: Temperature, field2: Humidity, field3: Lux, field4: Suitability Score (1, 0, or -1)
get_url = (
API_URL + "/update?api_key=" + tswriteAPI +
"&field1=" + str(temp) +
"&field2=" + str(humi) +
"&field3=" + str(lux) +
"&field4=" + str(suitability_score)
)
r = requests.get(get_url)
print("ThingSpeak Update Status:")
print(f"Data Count (Channel Entry ID): {r.text}")
print("OK: Data sent successfully.")
# Wait for the next update cycle
time.sleep(20)
except Exception as e:
print(f"A critical error occurred: {e}")
print("Resetting the microcontroller in 5 seconds...")
time.sleep(5)
microcontroller.reset()