import time
import math
from umqtt.simple import MQTTClient
import ubinascii
import machine
import micropython
import network
import esp
from machine import Pin, ADC, PWM, SPI
import dht
import sys
esp.osdebug(None)
import gc
gc.collect()
from time import sleep_ms
from machine import Pin
from machine import SPI
import machine, onewire, ds18x20, time, math
led = machine.Pin(5, machine.Pin.OUT)
sensor = dht.DHT22(Pin(14))
adc = ADC(Pin(2))
adc.atten(ADC.ATTN_11DB)
rl10 = 50e3 #LDR resistance at 10lux
gamma = 0.7 #log(Ra/Rb) / log(La/Lb)
#R2 = R1 * Vout / (Vin - Vout)
def calculate_resistance():
value = adc.read()
voltage_ratio = value / (4095 - value)
return 10e3 * voltage_ratio
#R = R_10 * (lux / 10) ^ -γ => R10/R=(10/lux)^−γ => R/R10=(10/lux)^γ => (R10/R)^(1/γ)=10/lux => lux=10*(R10/R)^(1/γ)
def calculate_lux(resistance):
return 10 * math.pow(rl10/resistance, 1/gamma)
for i in range(len(points) - 1):
if points[i+1][1] <= resistance <= points[i][1]:
x1, y1 = points[i]
x2, y2 = points[i + 1]
light_up_to(i + 2)
return x1 + ((resistance - y1) / (y2 - y1)) * (x2 - x1)
last_message = 0
message_interval = 1
client_id = ubinascii.hexlify(machine.unique_id())
topic_pub_light = b'wokwi/ldr/lux'
topic_pub_temp = b'wokwi/esp/temperature'
topic_pub_hum = b'wokwi/esp/humidity'
mqtt_server = 'test.mosquitto.org'
print("Connecting to WiFi", end="")
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect('Wokwi-GUEST', '')
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1)
print(" Connected!")
def connect_and_subscribe():
global client_id, mqtt_server, topic_sub, topic_sub1, topic_sub2, topic_sub3
client = MQTTClient(client_id, mqtt_server)
client.set_callback(sub_sub)
client.connect()
return client
def restart_and_reconnect():
print('Failed to connect to MQTT broker. Reconnecting...')
time.sleep(10)
machine.reset()
def sub_sub(topic, msg):
print ('%s from topic %s' %(msg, topic))
def read_sensor():
try:
sensor.measure()
temp = sensor.temperature()
# uncomment for Fahrenheit
#temp = temp * (9/5) + 32.0
hum = sensor.humidity()
if (isinstance(temp, float) and isinstance(hum, float)) or (isinstance(temp, int) and isinstance(hum, int)):
temp = (b'{0:3.1f},'.format(temp))
hum = (b'{0:3.1f},'.format(hum))
return temp, hum
else:
return('Invalid sensor readings.')
except OSError as e:
return('Failed to read sensor.')
try:
client = connect_and_subscribe()
except OSError as e:
restart_and_reconnect()
while True:
try:
if (time.time() - last_message) > message_interval:
temp, hum = read_sensor()
print(temp)
print(hum)
client.publish(topic_pub_temp, temp)
client.publish(topic_pub_hum, hum)
last_message = time.time()
except OSError as e:
restart_and_reconnect()