import machine, time, dht, network, socket
# ---------------- WiFi / ThingSpeak config ----------------
WIFI_SSID = "Wokwi-GUEST" # Wokwi's simulated open network - gives real internet access
WIFI_PASSWORD = ""
THINGSPEAK_API_KEY = "G5DILGAIGY3MY6Q1" # <-- paste your channel's Write API Key here
THINGSPEAK_HOST = "api.thingspeak.com"
UPDATE_INTERVAL_MS = 20000 # free ThingSpeak tier allows 1 update / 15s - 20s to be safe
# ---------------- Sensor & actuator setup ----------------
soil_sensor = machine.ADC(machine.Pin(34))
soil_sensor.atten(machine.ADC.ATTN_11DB)
temp_sensor = dht.DHT22(machine.Pin(4))
pump_relay = machine.Pin(26, machine.Pin.OUT)
pump_led = machine.Pin(27, machine.Pin.OUT)
MOISTURE_THRESHOLD = 40
MOISTURE_DRY_RAW = 4095
MOISTURE_WET_RAW = 1200
def connect_wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print("Connecting to WiFi...")
wlan.connect(WIFI_SSID, WIFI_PASSWORD)
while not wlan.isconnected():
time.sleep(0.5)
print("WiFi connected, IP:", wlan.ifconfig()[0])
def send_to_thingspeak(moisture, temperature, pump_on):
try:
path = "/update?api_key={}&field1={}&field2={}&field3={}".format(
THINGSPEAK_API_KEY, moisture, temperature, 1 if pump_on else 0
)
addr = socket.getaddrinfo(THINGSPEAK_HOST, 80)[0][-1]
s = socket.socket()
s.settimeout(5)
s.connect(addr)
s.send(bytes("GET {} HTTP/1.0\r\nHost: {}\r\n\r\n".format(path, THINGSPEAK_HOST), "utf8"))
response = s.recv(200)
s.close()
print("ThingSpeak response:", response)
except Exception as e:
print("ThingSpeak upload failed:", e)
def read_moisture_percent():
raw = soil_sensor.read()
pct = (MOISTURE_DRY_RAW - raw) * 100 / (MOISTURE_DRY_RAW - MOISTURE_WET_RAW)
return max(0, min(100, pct))
def read_temperature():
try:
temp_sensor.measure()
return temp_sensor.temperature()
except Exception:
return None
connect_wifi()
pump_on = False
last_upload = time.ticks_ms()
while True:
moisture = read_moisture_percent()
temperature = read_temperature()
if moisture < MOISTURE_THRESHOLD and not pump_on:
pump_relay.value(1)
pump_led.value(1)
pump_on = True
elif moisture >= MOISTURE_THRESHOLD and pump_on:
pump_relay.value(0)
pump_led.value(0)
pump_on = False
print("Soil Moisture: {:.1f}% | Temp: {} C | Pump: {}".format(
moisture, temperature, "ON" if pump_on else "OFF"))
if time.ticks_diff(time.ticks_ms(), last_upload) >= UPDATE_INTERVAL_MS:
send_to_thingspeak(moisture, temperature if temperature is not None else 0, pump_on)
last_upload = time.ticks_ms()
time.sleep(2)