Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import time
- from umqttsimple import MQTTClient
- import ubinascii
- import machine
- import micropython
- import network
- import esp
- import ujson
- import math
- import socket
- import sys
- try:
- import usocket as socket
- except:
- import socket
- esp.osdebug(None)
- import gc
- gc.collect()
- flag = False
- config_file = "config.json" # Файл конфигурации беспроводной сети и подключения к брокеру
- def config_load(config_file):
- with open(config_file, 'r') as js:
- config = ujson.load(js)
- return config
- config = config_load(config_file)
- ssid = config.get("ssid")
- password = config.get("password_wifi")
- mqtt_broker = config.get("mqtt_broker")
- user_mqtt = config.get("user_mqtt")
- password_mqtt = config.get("password_mqtt")
- client_id = ubinascii.hexlify(machine.unique_id())
- topic_pub = bytes(config.get("topic_pub"), "utf-8")
- topic_web_api = bytes(config.get("topic_sub"), "utf-8") # Топик из которого читаем установленную и текущую температуру
- """
- Подключаемся к Wi-Fi сети
- """
- station = network.WLAN(network.STA_IF)
- station.active(True)
- station.connect(ssid, password)
- while not station.isconnected():
- pass
- print('Connection successful')
- print(station.ifconfig())
- def sub_cb(topic, msg):
- """
- Данная функция читает сообщение из топика указанного в файле конфигурации
- :param topic:
- :param msg: Сообщение полученное из топика
- :return:
- """
- global flag
- heater = 4
- led_control = 2
- fan = 15
- heater_json = ujson.loads(msg)
- temp_set = heater_json.get("temp_set")
- if temp_set == 101:
- flag = True
- temp_now = float(heater_json.get("temp_now"))
- delta_temp = temp_set - temp_now
- duty = int(1000 - 1000 / (math.exp(delta_temp))) # Расчет ширины импульса
- if duty <= 0:
- duty = 0
- machine.PWM(machine.Pin(fan), freq=500, duty=0) # Выключение вентилятора
- elif duty > 0:
- machine.PWM(machine.Pin(fan), freq=500, duty=600) # Включение вентилятора
- machine.PWM(machine.Pin(led_control), freq=10, duty=duty)
- machine.PWM(machine.Pin(heater), freq=10, duty=duty) # Формирование ШИМ сигнала для обогревателя
- def connect_and_subscribe(mqtt_broker, user_mqtt, password_mqtt, topic_sub):
- """
- Данная функция выполняет подключение к брокеру MQTT
- :param mqtt_broker:
- :param user_mqtt:
- :param password_mqtt:
- :param topic_sub:
- :return:
- """
- client_id = ubinascii.hexlify(machine.unique_id())
- client = MQTTClient(client_id, mqtt_broker, user=user_mqtt, password=password_mqtt)
- client.set_callback(sub_cb)
- client.connect()
- client.subscribe(topic_sub)
- print('Connected to %s MQTT broker, subscribed to %s topic' % (mqtt_broker, topic_sub))
- machine.Pin(15, machine.Pin.OUT).off()
- return client
- def restart_and_reconnect():
- """
- Данная функция перезегружает ESP в любой не понятной ситуации :)
- :return:
- """
- print('Failed to connect to MQTT broker. Reconnecting...')
- time.sleep(10)
- machine.reset()
- def main():
- global flag # Данный флаг отвечает за переход контроллера в режим web_repl
- try:
- client_web_api = connect_and_subscribe(mqtt_broker, user_mqtt, password_mqtt, topic_web_api)
- except OSError as e:
- restart_and_reconnect()
- while True:
- try:
- if flag:
- return
- client_web_api.check_msg()
- except OSError as e:
- print(e)
- restart_and_reconnect()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement