Advertisement
Denis_Gorshkov

Smart heating main.py

Mar 29th, 2020
1,603
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.92 KB | None | 0 0
  1. import time
  2. from umqttsimple import MQTTClient
  3. import ubinascii
  4. import machine
  5. import micropython
  6. import network
  7. import esp
  8. import ujson
  9. import math
  10. import socket
  11. import sys
  12.  
  13. try:
  14.     import usocket as socket
  15. except:
  16.     import socket
  17.  
  18. esp.osdebug(None)
  19. import gc
  20.  
  21. gc.collect()
  22. flag = False
  23.  
  24. config_file = "config.json"  # Файл конфигурации беспроводной сети  и подключения к брокеру
  25.  
  26.  
  27. def config_load(config_file):
  28.     with open(config_file, 'r') as js:
  29.         config = ujson.load(js)
  30.     return config
  31.  
  32.  
  33. config = config_load(config_file)
  34. ssid = config.get("ssid")
  35. password = config.get("password_wifi")
  36. mqtt_broker = config.get("mqtt_broker")
  37. user_mqtt = config.get("user_mqtt")
  38. password_mqtt = config.get("password_mqtt")
  39. client_id = ubinascii.hexlify(machine.unique_id())
  40. topic_pub = bytes(config.get("topic_pub"), "utf-8")
  41. topic_web_api = bytes(config.get("topic_sub"), "utf-8")  # Топик из которого читаем установленную и текущую температуру
  42.  
  43. """
  44. Подключаемся к Wi-Fi сети
  45. """
  46. station = network.WLAN(network.STA_IF)
  47. station.active(True)
  48. station.connect(ssid, password)
  49. while not station.isconnected():
  50.     pass
  51.  
  52. print('Connection successful')
  53. print(station.ifconfig())
  54.  
  55.  
  56. def sub_cb(topic, msg):
  57.     """
  58.    Данная функция читает сообщение из топика указанного в файле конфигурации
  59.    :param topic:
  60.    :param msg: Сообщение полученное из топика
  61.    :return:
  62.    """
  63.     global flag
  64.     heater = 4
  65.     led_control = 2
  66.     fan = 15
  67.     heater_json = ujson.loads(msg)
  68.     temp_set = heater_json.get("temp_set")
  69.     if temp_set == 101:
  70.         flag = True
  71.     temp_now = float(heater_json.get("temp_now"))
  72.     delta_temp = temp_set - temp_now
  73.     duty = int(1000 - 1000 / (math.exp(delta_temp)))  # Расчет ширины импульса
  74.     if duty <= 0:
  75.         duty = 0
  76.         machine.PWM(machine.Pin(fan), freq=500, duty=0)  # Выключение вентилятора
  77.     elif duty > 0:
  78.         machine.PWM(machine.Pin(fan), freq=500, duty=600)  # Включение вентилятора
  79.     machine.PWM(machine.Pin(led_control), freq=10, duty=duty)
  80.     machine.PWM(machine.Pin(heater), freq=10, duty=duty)  # Формирование ШИМ сигнала для обогревателя
  81.  
  82.  
  83. def connect_and_subscribe(mqtt_broker, user_mqtt, password_mqtt, topic_sub):
  84.     """
  85.    Данная функция выполняет подключение к брокеру MQTT
  86.    :param mqtt_broker:
  87.    :param user_mqtt:
  88.    :param password_mqtt:
  89.    :param topic_sub:
  90.    :return:
  91.    """
  92.     client_id = ubinascii.hexlify(machine.unique_id())
  93.     client = MQTTClient(client_id, mqtt_broker, user=user_mqtt, password=password_mqtt)
  94.     client.set_callback(sub_cb)
  95.     client.connect()
  96.     client.subscribe(topic_sub)
  97.     print('Connected to %s MQTT broker, subscribed to %s topic' % (mqtt_broker, topic_sub))
  98.     machine.Pin(15, machine.Pin.OUT).off()
  99.     return client
  100.  
  101.  
  102. def restart_and_reconnect():
  103.     """
  104.    Данная функция перезегружает ESP в любой не понятной ситуации :)
  105.    :return:
  106.    """
  107.     print('Failed to connect to MQTT broker. Reconnecting...')
  108.     time.sleep(10)
  109.     machine.reset()
  110.  
  111.  
  112. def main():
  113.     global flag  # Данный флаг отвечает за переход контроллера в режим web_repl
  114.     try:
  115.         client_web_api = connect_and_subscribe(mqtt_broker, user_mqtt, password_mqtt, topic_web_api)
  116.     except OSError as e:
  117.         restart_and_reconnect()
  118.     while True:
  119.         try:
  120.             if flag:
  121.                 return
  122.             client_web_api.check_msg()
  123.         except OSError as e:
  124.             print(e)
  125.             restart_and_reconnect()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement