import machine
from machine import Pin, PWM, SoftI2C
from time import sleep
import network
import binascii
from umqttsimple import MQTTClient
import gc
import time
import ntptime
import utime
import machine, neopixel
import ahtx0
gc.collect()
def piezo(state):
pwm = PWM(Pin(16), freq=108000, duty=512)
if state == True:
pwm.init(freq=108000, duty=500)
else:
pwm.init(freq=108000, duty=0)
def configNetwork(netWNames):
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
sleep(2)
wifiMevcut = False
vSsid = ""
while(not wifiMevcut):
networks = wlan.scan()
for ssid, key in netWNames:
for i in networks:
wifiAdi = i[0].decode("utf-8")
if wifiAdi == ssid:
wifiMevcut = True
sleep(2)
if wifiMevcut:
print("Baglaniliyor")
state = wlan.isconnected()
if state == False:
print("{} agina baglaniliyor.".format(ssid))
wlan.connect(ssid, key)
vSsid = ssid
sleep(3)
else:
print("Wifi Bekleniyor.")
mac = binascii.hexlify(wlan.config('mac'))
conf = wlan.ifconfig()
ip, x, gateway, y = conf
return [mac, ip, gateway, vSsid]
def sub_cb(topic, msg):
global auto
global aktif
global limitNem
key = topic.decode("utf-8")
value = msg.decode("utf-8")
print(("topic:{}, msg:{}".format(key, value)))
if key == "armed" and value == "armed=on":
piezo(True)
aktif = True
text = "Nemlendirici Aktif"
client.publish(b'status', text)
ledAktif.on()
if key == "armed" and value == "armed=off":
piezo(False)
aktif = False
text = "Nemlendirici Pasif"
client.publish(b'status', text)
ledAktif.off()
if key == "auto" and value == "auto=on":
auto = True
ledAuto.on()
if limitNem <= 5:
text = "Lutfen Nem Degeri Girin!!!"
client.publish(b'status', text)
text = "auto=off"
client.publish(b'auto', text)
if key == "auto" and value == "auto=off":
auto = False
ledAuto.off()
if key == "limit":
try:
limitNem = int(value)
except:
text = "Nem Hatali"
client.publish(b'status', text)
def connect_and_subscribe():
global client_id, mqtt_server, topic_sub
client = MQTTClient(clientId, mqtt_server, user=mqtt_user, password=mqtt_pass)
client.set_callback(sub_cb)
client.connect()
for i in topic_sub:
client.subscribe(i)
sleep(1/3)
print('Connected to %s MQTT broker, subscribed to %s topic' % (mqtt_server, topic_sub))
return client
def mqttCheck():
while(True):
try:
client.check_msg()
if (time.time() - last_message) > message_interval:
last_message = time.time()
#client.publish(b"status", "x")
except:
pass
def restart_and_reconnect():
print('Failed to connect to MQTT broker. Reconnecting...')
time.sleep(10)
machine.reset()
ledAktif = Pin(3, Pin.OUT)
ledAuto = Pin(5, Pin.OUT)
i2c = SoftI2C(scl=Pin(9), sda=Pin(8))
sensor = ahtx0.AHT10(i2c)
temp = sensor.temperature
humid = sensor.relative_humidity
print("temp: {}, humid: {}".format(temp, humid))
netWNames = [["Fi*****", "****"], ["Fi****", "********"]]
print("Wifi Bağlantısı deneniyor.")
mac, ip, gateway, validSsid = configNetwork(netWNames)
print("Wifi Bağlantısı yapıldı.")
print("MAC:{}, ip:{}, Gateway: {}".format(mac, ip, gateway))
sleep(3)
limitNem = 0
auto = False
aktif = False
ntpDeneme = True
while(ntpDeneme):
try:
ntptime.settime()
ntpDeneme = False
print("clock sync")
except:
print("clock sync failed")
sleep(1/2)
tm = utime.localtime(utime.mktime(utime.localtime()) + 3*3600) # GMT+3 saat dilimi için düzenleme
yil, ay, gun, sa, dk, sn, x, y = tm
print("Tarih: {}/{}/{}".format(gun, ay, yil))
print("Saat: {}:{}:{}".format(sa, dk, sn))
mqtt_server = 'test.mosquitto.org'
mqtt_user = ''
mqtt_pass = ''
clientId = binascii.hexlify(machine.unique_id())
print(clientId)
topic_sub = [b'humid', b'armed', b'auto', b'status', b'limit']
last_message = 0
last_check = 0
message_interval = 8
try:
client = connect_and_subscribe()
except OSError as e:
restart_and_reconnect()
text = "Cihaz Hazir"
client.publish(b'status', text)
text = "armed=off"
client.publish(b'armed', text)
text = "auto=off"
client.publish(b'auto', text)
oneShot = False
while(True):
sleep(1)
humid = sensor.relative_humidity
print("Act Humidity: {:.2f}, oneSh:{}".format(humid, oneShot))
if auto == True and humid < limitNem:
piezo(True)
if oneShot == False:
text = "Nemlendirici Aktif"
client.publish(b'status', text)
oneShot = True
if auto == True and humid >= limitNem:
piezo(False)
if oneShot == True:
text = "Nem, Limite Ulasti"
client.publish(b'status', text)
oneShot = False
if auto == False and aktif == False:
piezo(False)
if oneShot == True:
text = "Auto Off"
client.publish(b'status', text)
oneShot = False
try:
client.check_msg()
if (time.time() - last_message) > message_interval:
last_message = time.time()
#client.publish(b"status", "x")
text = "{:.1f}".format(sensor.temperature)
client.publish(b'temp', text)
text = "{:.0f}".format(sensor.relative_humidity)
client.publish(b'humid', text)
except OSError as e:
restart_and_reconnect()