import machine
import dht
import network
from umqtt.robust import MQTTClient # Use robust MQTT client if available
from machine import ADC
from math import log
from time import sleep
# Wi-Fi settings
WIFI_SSID = 'Wokwi-GUEST'
WIFI_PASSWORD = ''
# ThingSpeak MQTT settings
channel_id = "2496257"
write_api_key = "L9C6QJRHYAVGPIZT"
topic = "channels/" + channel_id + "/publish/" + write_api_key
mqtt_client_id = "KSUONS4aDykkFhYUORQmJBE"
mqtt_user = "KSUONS4aDykkFhYUORQmJBE"
mqtt_password = "VQ6Fh7hj6BLvl1Pj+GEXuQbu"
mqtt_server = "mqtt3.thingspeak.com"
mqtt_port = 1883
# Connect to WiFi
def connect_to_wifi(ssid, password):
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print('Connecting to network...')
wlan.connect(ssid, password)
while not wlan.isconnected():
pass
print('Network config:', wlan.ifconfig())
connect_to_wifi(WIFI_SSID, WIFI_PASSWORD)
# Initialize DHT22 sensor
sensor = dht.DHT22(machine.Pin(26))
# Read temperature and humidity from DHT22
def read_sensor():
sensor.measure()
temp = sensor.temperature()
hum = sensor.humidity()
print('Temperature:', temp, '°C')
print('Humidity:', hum, '%')
return temp, hum
# Publish data to ThingSpeak using MQTT
def publish_data(temp, hum):
client = MQTTClient(client_id=mqtt_client_id, server=mqtt_server, port=mqtt_port, user=mqtt_user, password=mqtt_password)
payload = "field1={}&field2={}".format(temp, hum)
client.connect()
client.publish(topic, payload)
client.disconnect()
# Initialize ADC for reading NTC sensor
adc = ADC(machine.Pin(34))
adc.atten(ADC.ATTN_11DB) # Set attenuation for full range of 0-3.3V
def read_ntc():
analog_value = adc.read()
# Ensure analog_value is within the expected range to avoid division by zero or negative numbers
if analog_value <= 0:
analog_value = 1 # Prevent division by zero
elif analog_value >= 1023:
analog_value = 1022 # Prevent log(0) or log of a negative number
beta = 3950
try:
celsius_value = 1 / (log(1 / (1023. / analog_value - 1)) / beta + 1.0 / 298.15) - 273.15
print('Analog Temperature:', celsius_value, '°C')
except ValueError as e:
print("Error calculating temperature:", e)
celsius_value = None # or some default value indicating an error
return celsius_value