import network
from time import ticks_ms, ticks_diff, sleep_ms
import time
from machine import Pin, PWM, Timer, I2C
from umqtt.robust import MQTTClient
import ujson
import dht
import ssd1306
sensor = dht.DHT22(Pin(15))
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
relay = Pin(18, Pin.OUT)
relay.value(0)
Temp = 1
Humid = 2
i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000)
LCD_ADDR = 0x27
# MQTT Server Parameters
wifi_ssid = "Wokwi-GUEST"
wifi_pwd = ""
MQTT_BROKER = "broker.netpie.io"
MQTT_CLIENT_ID = "39166d21-3952-40df-8e21-bad7316f575f" # Fill in your NETPIE2020 data
MQTT_USER = "vnDbu4mUpgV1vqi7WQECQaAeV9PQHYtq"
MQTT_PASSWORD = "kPBWNS6AJbs5U6fUt1Z5zEQsZSJTjq6s"
MQTT_TOPIC = "wokwi-weather"
private_msg = "" # added in iot_controller3.py
PUBLISH_PERIOD = 2000
shadow_data = {'Temp': 0, 'Humid': 0}
def sub_cb(topic, msg):
global private_msg, cmdtime_prev
print((topic, msg))
if topic == b'@msg/cmd':
rcvdstrs = str(msg).split("'") # get rid of b'
rcvdstr = rcvdstrs[1]
cmdInt(rcvdstr)
# # this delay is needed for nodered implementation
# cmdtime_current = time.ticks_ms()
# delta_cmdtime = cmdtime_current - cmdtime_prev
# if delta_cmdtime > CMD_DELAY:
# cmdtime_prev = cmdtime_current
# cmdInt(rcvdstr)
# added in iot_controller3.py to retrieve shadow data
elif topic == b'@private/shadow/data/get/response':
print(msg)
private_msg = str(msg)
online = True
def wifi_connect():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print('connecting to network...')
wlan.connect(wifi_ssid, wifi_pwd)
while not wlan.isconnected():
pass
def init_client():
global client
print("Trying to connect to mqtt broker.")
try:
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, port=1883, user=MQTT_USER,
password=MQTT_PASSWORD)
client.connect()
print("Connected to ",MQTT_BROKER)
topic_sub = b"@msg/cmd"
print("Subscribed to ",topic_sub)
#added in iot_controller3.py
private_topic_sub = b"@private/#"
print("Subscribed to ",private_topic_sub)
client.set_callback(sub_cb)
client.subscribe(topic_sub)
client.subscribe(private_topic_sub)
except:
print("Trouble to init mqtt.")
if online:
wifi_connect()
init_client()
def update_dashboard():
updatestr = ("{},{}".format(Temp, Humid))
if online:
client.publish('@msg/update', updatestr)
def splitCmd(userstr):
result = userstr.find("=")
if result == -1:
noparm = 1
cmdstr = userstr.strip()
parmstr = '' # not used
else:
noparm = 0
splitstr = userstr.split("=")
cmdstr = splitstr[0].strip()
parmstr = splitstr[1].strip()
return cmdstr, parmstr, noparm
def cmdInt(userstr):
global move_step, angle
cmdstr, parmstr, noparm = splitCmd(userstr)
#print(cmdstr) #debug
if cmdstr.lower() == "":
print("all good")
else:
print("Invalid command")
time_prev = 0
while True:
if online:
client.check_msg()
sensor.measure()
Temp = sensor.temperature()
Humid = sensor.humidity()
shadow_data['Temp'] = Temp
shadow_data['Humid'] = Humid
oled.text("Temp: ", 10, 10)
oled.show()
oled.text(str(Temp), 50, 10)
oled.show()
oled.text("Humid: ", 2, 30)
oled.show()
oled.text(str(Humid), 50, 30)
oled.show()
oled.fill(0)
publish_str = ujson.dumps({"data": shadow_data})
print(publish_str)
client.publish("@shadow/data/update", publish_str)
# added in iot_controller4.py
sleep_ms(1000)
updatestr = ("{},{}".format(Temp, Humid))
client.publish('@msg/update', updatestr)
# added in iot_controller3.py
# receive data from shadow if requested
else:
user_input()