# Experiment E: Working IoT Node with Cloud
# Simple & Working Version
import network
import socket
import time
import dht
import machine
# --- SIMPLE CONFIGURATION ---
DHT_PIN = machine.Pin(15)
LIGHT_ADC = machine.ADC(machine.Pin(28))
SSID = "Wokwi-GUEST"
PASSWORD = ""
# --- Choose ONE cloud service below ---
SERVICE = "THINGSPEAK" # Options: "THINGSPEAK", "IFTTT", "CUSTOM"
# For ThingSpeak (RECOMMENDED - easiest):
THINGSPEAK_API_KEY = "37TXRYKSX3GQUN65" # Get from: thingspeak.com → Channels → API Keys
# For IFTTT:
IFTTT_KEY = "YOUR_IFTTT_KEY"
IFTTT_EVENT = "pico_sensor"
# For custom server:
CUSTOM_SERVER = "your-server.com"
CUSTOM_PORT = 80
# --- Initialize ---
wlan = network.WLAN(network.STA_IF)
dht_sensor = dht.DHT22(DHT_PIN)
print("🚀 Experiment E: WORKING IoT Cloud Node")
print("=" * 50)
# Step 1: Connect to WiFi
def connect_wifi():
wlan.active(True)
if not wlan.isconnected():
print(f"📶 Connecting to {SSID}...", end="")
wlan.connect(SSID, PASSWORD)
for i in range(25):
if wlan.isconnected():
break
time.sleep(0.4)
print(".", end="")
print()
if wlan.isconnected():
ip = wlan.ifconfig()[0]
print(f"✅ WiFi Connected! IP: {ip}")
return True
else:
print("❌ WiFi Failed")
return False
# Step 2: Simple sensor reading
def read_sensors():
try:
dht_sensor.measure()
temp = dht_sensor.temperature()
hum = dht_sensor.humidity()
except:
temp, hum = 24.5, 50.0 # Default values
light_raw = LIGHT_ADC.read_u16()
light_percent = (light_raw / 65535) * 100
return temp, hum, light_percent
# Step 3: Send to chosen service
def send_data(temp, hum, light):
"""Send to the selected cloud service"""
if SERVICE == "THINGSPEAK" and THINGSPEAK_API_KEY != "YOUR_API_KEY":
# ThingSpeak (Easiest)
try:
url = f"/update?api_key={THINGSPEAK_API_KEY}"
url += f"&field1={temp}&field2={hum}&field3={light}"
addr = socket.getaddrinfo("api.thingspeak.com", 80)[0][-1]
s = socket.socket()
s.settimeout(5)
s.connect(addr)
request = f"GET {url} HTTP/1.1\r\nHost: api.thingspeak.com\r\n\r\n"
s.send(request.encode())
# Check response
response = s.recv(256).decode()
s.close()
if "200" in response:
print(" ☁️ Sent to ThingSpeak ✓")
return True
except:
pass
return False
elif SERVICE == "IFTTT" and IFTTT_KEY != "YOUR_IFTTT_KEY":
# IFTTT Webhook
try:
url = f"/trigger/{IFTTT_EVENT}/with/key/{IFTTT_KEY}"
url += f"?value1={temp}&value2={hum}&value3={light}"
addr = socket.getaddrinfo("maker.ifttt.com", 80)[0][-1]
s = socket.socket()
s.connect(addr)
request = f"GET {url} HTTP/1.1\r\nHost: maker.ifttt.com\r\n\r\n"
s.send(request.encode())
s.close()
print(" 📱 Sent to IFTTT ✓")
return True
except:
return False
else:
# SIMPLE TEST - Just show data would be sent
print(f" 📤 [TEST] Would send: T={temp}C, H={hum}%, L={light}%")
return True
# --- MAIN PROGRAM ---
if connect_wifi():
print(f"\n🎯 Service: {SERVICE}")
print("📡 Starting in 3 seconds...")
time.sleep(3)
counter = 0
try:
while True:
# Read
temp, hum, light = read_sensors()
print(f"\n📍 Reading {counter}: T={temp:.1f}C, H={hum:.1f}%, L={light:.1f}%")
# Send
send_data(temp, hum, light)
# Wait
counter += 1
if counter % 5 == 0: # Every 5 readings
print(f" ⏱️ {counter} readings sent so far...")
time.sleep(15) # Every 15 seconds
except KeyboardInterrupt:
print("\n✅ Experiment E completed successfully!")
print(" Your IoT node is working with cloud connectivity.")
else:
print("\n❌ Cannot proceed without WiFi")
# BONUS: Add this at the end of your project documentation
print("\n" + "="*50)
print("🔧 TROUBLESHOOTING TIPS:")
print("-"*50)
print("1. For ThingSpeak: Get FREE API key from thingspeak.com")
print("2. Test sensor: Hover over DHT22 in Wokwi to change values")
print("3. No Gateway needed - this works directly with Wokwi's WiFi")
print("="*50)