import network
import time
import ujson
from machine import Pin, ADC, I2C, PWM
import onewire, ds18x20
from umqtt.simple import MQTTClient
from ssd1306 import SSD1306_I2C
import machine, onewire, ds18x20, time
# MQTT Налаштування
MQTT_CLIENT_ID = "iot-furnace-i2c-mqtt"
MQTT_BROKER = "broker.mqttdashboard.com"
MQTT_TOPIC_MAZUT = "furnace/mazut"
MQTT_TOPIC_FUEL = "furnace/fuel"
# OLED
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled = SSD1306_I2C(128, 64, i2c)
# DS18B20
ds_pin = machine.Pin(4)
ds_sensor = ds18x20.DS18X20(onewire.OneWire(ds_pin))
roms = ds_sensor.scan()
print('Found DS18B20 devices: ', roms)
pot = ADC(Pin(34)) # Тиск
flow = ADC(Pin(32)) # Витрата газу
servo_control = ADC(Pin(33)) # Слайдер — керування клапаном
for adc in (pot, flow, servo_control):
adc.atten(ADC.ATTN_11DB)
servo = PWM(Pin(18), freq=50)
valve_position = 0
def set_valve_position(percent):
percent = max(0, min(100, percent))
duty = int(26 + (percent / 100) * 102)
servo.duty(duty)
return percent
# Wi-Fi
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!")
# MQTT
print("Connecting to MQTT... ", end="")
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER)
client.connect()
print("Connected!")
# Читання DS18B20
def read_DS18B20_sensor():
ds_sensor.convert_temp()
time.sleep_ms(750)
for rom in roms:
temp = ds_sensor.read_temp(rom)
if isinstance(temp, float):
return round(temp, 2)
return None
while True:
temp_raw = read_DS18B20_sensor()
# Значення температури до 200–350 °C
temp = round(200 + ((temp_raw or 25) / 100) * 150, 2)
# Тиск 0–1 МПа із потенціометра
pressure = round((pot.read() / 4095), 2)
# Витрата паливного газу
gas_flow = round((flow.read() / 4095) * 100, 1)
# Клапан (%)
valve_percent = round((servo_control.read() / 4095) * 100, 1)
set_valve_position(valve_percent)
oled.fill(0)
oled.text("Temp: {:.1f} C".format(temp), 0, 0)
oled.text("Press: {:.2f} MPa".format(pressure), 0, 16)
oled.text("Flow: {:.1f}".format(gas_flow), 0, 32)
oled.text("Valve: {:.1f}%".format(valve_percent), 0, 48)
oled.show()
payload_mazut = ujson.dumps({
"temperature": temp,
"pressure": pressure
})
payload_fuel = ujson.dumps({
"gas_flow": gas_flow,
"valve_position": valve_percent
})
print("Sending MAZUT to MQTT:", payload_mazut)
client.publish(MQTT_TOPIC_MAZUT, payload_mazut)
print("Sending FUEL to MQTT:", payload_fuel)
client.publish(MQTT_TOPIC_FUEL, payload_fuel)
time.sleep(3)
Тиск Мазуту на
вході до печі
Витрата
паливних газів
Температура мазуту
на виході з печі