资讯动态

编写程序实现智能烤箱温度实时监测,达到设定温度后,提示“可以放入食材”。

发布时间:2026/8/6 3:39:22 来源:尧图企业网站定制
智能烤箱温度监测系统 - 烹饪助手解决方案一、实际应用场景描述某家电厂商计划为其嵌入式烤箱产品线增加智能预热功能解决用户在烘焙过程中因温度判断不准确而导致的食材受热不均、烘焙失败等问题。现有烤箱仅配备机械温控旋钮缺乏数字化温度反馈。本系统目标在烤箱内部集成K型热电偶温度传感器通过PID算法实时监测腔体温度当温度达到用户设定的预热温度如180°C并保持稳定后通过OLED显示屏和蜂鸣器发出可以放入食材的提示同时记录温度变化曲线供后续分析。二、引入痛点痛点类型 具体表现 本方案解决方式预热判断不准 凭经验判断温度经常过早或过晚放入食材 实时数字显示精准温控温度波动大 烤箱升温不均匀局部过热或过冷 PID算法平滑控制加热元件烘焙失败率高 温度不稳定导致食材受热不均 预热完成提示温度曲线记录能耗浪费 长时间预热或重复预热 精准温控减少无效能耗三、核心逻辑讲解graph TDA[系统初始化] -- B[传感器校准]B -- C[用户输入目标温度]C -- D[启动加热元件]D -- E[实时读取烤箱温度]E -- F{PID算法计算加热功率}F -- G[调节加热元件输出]G -- H{温度≥目标温度?}H -- 否 -- EH -- 是 -- I[检查温度稳定性]I -- J{连续30秒稳定在±2°C内?}J -- 否 -- EJ -- 是 -- K[触发预热完成提示]K -- L[OLED显示可以放入食材]L -- M[蜂鸣器发声提示]M -- N[记录温度曲线]N -- O[等待用户操作]O -- P{用户放入食材?}P -- 是 -- Q[切换到烹饪模式]P -- 否 -- R[保持保温状态]关键逻辑点1. K型热电偶温度采集通过MAX6675芯片读取毫伏级电压信号转换为0-1024°C温度值2. PID闭环控制比例-积分-微分算法平滑控制加热功率避免温度过冲3. 稳定性判断温度达到目标后需连续30秒波动在±2°C内才确认预热完成4. 多模态提示OLED显示文字蜂鸣器声音LED指示灯三重提示四、代码模块化实现项目结构smart_oven/├── main.py # 主程序入口├── config.py # 配置文件├── sensors/ # 传感器模块│ ├── __init__.py│ └── thermocouple.py # K型热电偶驱动├── control/ # 控制算法模块│ ├── __init__.py│ └── pid_controller.py # PID控制算法├── actuators/ # 执行器模块│ ├── __init__.py│ └── heating_element.py # 加热元件控制├── display/ # 显示模块│ ├── __init__.py│ └── oled_display.py # OLED显示屏控制├── notifications/ # 通知模块│ ├── __init__.py│ └── alert_system.py # 提示系统├── storage/ # 数据存储模块│ ├── __init__.py│ └── data_logger.py # 温度数据记录├── utils/ # 工具函数│ ├── __init__.py│ ├── temperature_converter.py # 温度单位转换│ └── calibration.py # 传感器校准└── tests/ # 单元测试├── __init__.py└── test_pid.py1. 配置文件 (config.py)智能烤箱温度监测系统配置文件包含传感器参数、PID控制、显示设置等# 传感器配置THERMOCOUPLE_TYPE K # 热电偶类型: K型SPI_BUS 0 # SPI总线号SPI_DEVICE 0 # SPI设备号SENSOR_OFFSET 0.0 # 传感器校准偏移量(°C)# 温度控制配置DEFAULT_TARGET_TEMP 180.0 # 默认目标温度(°C)TEMP_TOLERANCE 2.0 # 温度容差(°C)STABILITY_DURATION 30.0 # 稳定性确认时间(秒)MAX_TEMPERATURE 300.0 # 最高安全温度(°C)MIN_TEMPERATURE 50.0 # 最低工作温度(°C)# PID控制参数PID_KP 2.5 # 比例系数PID_KI 0.1 # 积分系数PID_KD 1.0 # 微分系数PID_SAMPLE_TIME 0.1 # PID采样时间(秒)# 加热元件配置HEATER_PIN 17 # 加热元件控制引脚HEATER_MAX_POWER 100 # 最大加热功率百分比HEATER_MIN_POWER 0 # 最小加热功率百分比# 显示配置OLED_I2C_ADDRESS 0x3C # OLED显示屏I2C地址OLED_WIDTH 128 # 显示屏宽度(像素)OLED_HEIGHT 64 # 显示屏高度(像素)DISPLAY_UPDATE_INTERVAL 0.5 # 显示更新间隔(秒)# 通知配置BUZZER_PIN 18 # 蜂鸣器控制引脚BUZZER_FREQUENCY 2000 # 提示音频率(Hz)BUZZER_DURATION 0.5 # 提示音持续时间(秒)LED_PIN 23 # 状态LED引脚# 数据记录配置LOG_FILE oven_temperature.logLOG_INTERVAL 1.0 # 数据记录间隔(秒)MAX_LOG_SIZE 10 * 1024 * 1024 # 日志最大10MB# 安全配置OVERTEMPERATURE_PROTECTION True # 是否启用超温保护SAFETY_SHUTDOWN_DELAY 5.0 # 超温后安全关闭延迟(秒)2. 热电偶传感器模块 (sensors/thermocouple.py)K型热电偶温度采集模块通过MAX6675芯片读取温度数据import spidevimport timefrom config import (SPI_BUS, SPI_DEVICE, THERMOCOUPLE_TYPE,SENSOR_OFFSET, MAX_TEMPERATURE, MIN_TEMPERATURE)class ThermocoupleSensor:def __init__(self):初始化热电偶传感器self.spi spidev.SpiDev()self.spi.open(SPI_BUS, SPI_DEVICE)self.spi.max_speed_hz 4300000 # MAX6675最大时钟频率4.3MHzself.spi.mode 0b00self.offset SENSOR_OFFSETself._validate_sensor()def _validate_sensor(self):验证传感器连接和读数有效性try:temp self.read_temperature()if temp is None or temp -200 or temp 1200:raise RuntimeError(热电偶传感器读数异常请检查连接)print(f✅ {THERMOCOUPLE_TYPE}型热电偶传感器初始化成功)print(f 当前温度: {temp:.1f}°C)except Exception as e:raise RuntimeError(f传感器初始化失败: {e})def read_raw_data(self) - int:读取MAX6675原始数据返回: 16位原始数据try:# MAX6675返回16位数据: D15-D3为温度D2为故障位D1-D0为0data self.spi.xfer2([0x00, 0x00])# 合并两个字节raw (data[0] 8) | data[1]return rawexcept Exception as e:print(f读取原始数据失败: {e})return Nonedef read_temperature(self) - float:读取当前温度值返回: 温度值(°C)读取失败返回Noneraw self.read_raw_data()if raw is None:return None# 检查故障位 (D2)if raw 0x04:print(⚠️ 热电偶传感器故障: 开路或短路)return None# 提取温度数据 (D15-D3共12位)# 每个LSB代表0.25°Ctemperature (raw 3) * 0.25# 应用校准偏移temperature self.offset# 检查温度范围if temperature MIN_TEMPERATURE or temperature MAX_TEMPERATURE:print(f⚠️ 温度超出正常范围: {temperature:.1f}°C)return Nonereturn temperaturedef is_faulty(self) - bool:检查传感器是否故障raw self.read_raw_data()if raw is None:return Truereturn bool(raw 0x04)def set_offset(self, offset: float):设置温度校准偏移量self.offset offsetprint(f温度校准偏移量设置为: {offset}°C)def get_sensor_info(self) - dict:获取传感器信息return {type: THERMOCOUPLE_TYPE,offset: self.offset,faulty: self.is_faulty()}def cleanup(self):清理传感器资源self.spi.close()3. PID控制算法模块 (control/pid_controller.py)PID控制器模块实现比例-积分-微分控制算法用于烤箱温度精确控制import timeclass PIDController:def __init__(self, kp: float, ki: float, kd: float, sample_time: float):初始化PID控制器kp: 比例系数ki: 积分系数kd: 微分系数sample_time: 采样时间(秒)self.kp kpself.ki kiself.kd kdself.sample_time sample_time# PID计算变量self.setpoint 0.0self.last_error 0.0self.integral 0.0self.last_time time.time()self.output 0.0# 输出限制self.output_min 0.0self.output_max 100.0print(f✅ PID控制器初始化成功)print(f 参数: Kp{kp}, Ki{ki}, Kd{kd})def set_setpoint(self, setpoint: float):设置目标温度self.setpoint setpointself.integral 0.0 # 重置积分项print(f目标温度设置为: {setpoint}°C)def set_output_limits(self, output_min: float, output_max: float):设置输出限制self.output_min output_minself.output_max output_maxdef compute(self, current_temperature: float) - float:计算PID输出current_temperature: 当前温度值返回: 控制输出(0-100%)current_time time.time()dt current_time - self.last_time# 确保采样时间不小于设定值if dt self.sample_time:return self.output# 计算误差error self.setpoint - current_temperature# 比例项 (P)proportional self.kp * error# 积分项 (I) - 累积误差带积分限幅防止饱和self.integral error * dtintegral self.ki * self.integral# 微分项 (D) - 误差变化率derivative self.kd * (error - self.last_error) / dt# 计算总输出self.output proportional integral derivative# 输出限幅self.output max(self.output_min, min(self.output_max, self.output))# 保存当前状态self.last_error errorself.last_time current_timereturn self.outputdef reset(self):重置PID控制器状态self.last_error 0.0self.integral 0.0self.output 0.0self.last_time time.time()def get_status(self) - dict:获取PID控制器状态return {setpoint: self.setpoint,output: self.output,kp: self.kp,ki: self.ki,kd: self.kd,integral: self.integral}4. 加热元件控制模块 (actuators/heating_element.py)加热元件控制模块通过PWM控制烤箱加热管的功率输出import RPi.GPIO as GPIOimport threadingimport timefrom config import HEATER_PIN, HEATER_MAX_POWER, HEATER_MIN_POWERclass HeatingElement:def __init__(self):初始化加热元件控制self.pin HEATER_PINself.target_power 0.0 # 目标功率百分比self.current_power 0.0 # 当前实际功率self.pwm Noneself.is_enabled Falseself._lock threading.Lock()self._setup_gpio()def _setup_gpio(self):配置GPIO为PWM输出模式GPIO.setmode(GPIO.BCM)GPIO.setup(self.pin, GPIO.OUT)# 创建PWM实例频率1kHzself.pwm GPIO.PWM(self.pin, 1000)self.pwm.start(0) # 初始占空比0%print(✅ 加热元件控制初始化成功)def set_power(self, power_percent: float):设置加热功率power_percent: 功率百分比 (0-100)with self._lock:# 限制功率范围power_percent max(HEATER_MIN_POWER, min(HEATER_MAX_POWER, power_percent))self.target_power power_percentself.is_enabled power_percent 0def get_power(self) - float:获取当前功率百分比with self._lock:return self.current_powerdef is_heating(self) - bool:检查是否正在加热return self.is_enabled and self.current_power 0def update(self):更新实际输出功率应在主循环中调用实现平滑的功率过渡with self._lock:target self.target_powercurrent self.current_power# 平滑过渡避免功率突变if abs(target - current) 1.0:if target current:self.current_power 1.0else:self.current_power - 1.0else:self.current_power target# 更新PWM占空比self.pwm.ChangeDutyCycle(self.current_power)def emergency_shutdown(self):紧急关闭加热元件with self._lock:self.target_power 0.0self.current_power 0.0self.pwm.ChangeDutyCycle(0)self.is_enabled Falseprint( 加热元件紧急关闭)def get_status(self) - dict:获取加热元件状态return {target_power: self.target_power,current_power: self.current_power,is_enabled: self.is_enabled,is_heating: self.is_heating()}def cleanup(self):清理加热元件资源self.emergency_shutdown()self.pwm.stop()GPIO.cleanup(self.pin)5. OLED显示模块 (display/oled_display.py)SSD1306 OLED显示屏控制模块用于显示温度信息和系统状态import boardimport busioimport adafruit_ssd1306import digitaliofrom PIL import Image, ImageDraw, ImageFontimport timefrom config import OLED_I2C_ADDRESS, OLED_WIDTH, OLED_HEIGHT, DISPLAY_UPDATE_INTERVALclass OLEDDisplay:def __init__(self):初始化OLED显示屏# 创建I2C接口i2c busio.I2C(board.SCL, board.SDA)# 创建SSD1306对象self.oled adafruit_ssd1306.SSD1306_I2C(OLED_WIDTH, OLED_HEIGHT, i2c, addrOLED_I2C_ADDRESS)# 创建图像缓冲区self.image Image.new(1, (OLED_WIDTH, OLED_HEIGHT))self.draw ImageDraw.Draw(self.image)# 加载字体try:self.font_large ImageFont.truetype(/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf, 24)self.font_medium ImageFont.truetype(/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf, 16)self.font_small ImageFont.truetype(/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf, 12)except OSError:# 使用默认字体self.font_large ImageFont.load_default()self.font_medium ImageFont.load_default()self.font_small ImageFont.load_default()# 清屏self.oled.fill(0)self.oled.show()self.last_update 0self.status_message print(✅ OLED显示屏初始化成功)def clear(self):清屏self.draw.rectangle((0, 0, OLED_WIDTH, OLED_HEIGHT), outline0, fill0)def show_temperature(self, current_temp: float, target_temp: float,progress: float 0.0):显示温度信息current_temp: 当前温度target_temp: 目标温度progress: 加热进度 (0.0-1.0)self.clear()# 显示标题self.draw.text((10, 2), Smart Oven, fontself.font_small, fill255)# 显示当前温度temp_text f{current_temp:.0f}°Cself.draw.text((20, 18), temp_text, fontself.font_large, fill255)# 显示目标温度target_text fTarget: {target_temp:.0f}°Cself.draw.text((10, 45), target_text, fontself.font_small, fill255)# 绘制进度条bar_width int(progress * 100)self.draw.rectangle((10, 58, 10 bar_width, 62), outline255, fill255)self.draw.rectangle((10, 58, 110, 62), outline255, fill0)self.oled.image(self.image)self.oled.show()def show_ready_message(self):显示预热完成提示self.clear()# 显示大号READY文字self.draw.text((15, 10), READY!, fontself.font_large, fill255)# 显示提示信息self.draw.text((5, 38), Place food in oven, fontself.font_medium, fill255)# 显示装饰线self.draw.line((10, 55, 118, 55), fill255)self.oled.image(self.image)self.oled.show()def show_error_message(self, error_text: str):显示错误信息self.clear()self.draw.text((10, 10), ERROR, fontself.font_large, fill255)self.draw.text((5, 38), error_text[:20], fontself.font_small, fill255)self.oled.image(self.image)self.oled.show()def show_status(self, status_text: str):显示状态信息self.clear()self.draw.text((10, 25), status_text, fontself.font_medium, fill255)self.oled.image(self.image)self.oled.show()def update(self, force: bool False):更新显示节流控制current_time time.time()if force or (current_time - self.last_update DISPLAY_UPDATE_INTERVAL):self.last_update current_timereturn Truereturn Falsedef cleanup(self):清理显示资源self.oled.fill(0)self.oled.show()6. 提示系统模块 (notifications/alert_system.py)多模态提示系统模块通过蜂鸣器、LED和显示提供用户反馈import RPi.GPIO as GPIOimport timeimport threadingfrom config import BUZZER_PIN, BUZZER_FREQUENCY, BUZZER_DURATION, LED_PINclass AlertSystem:def __init__(self):初始化提示系统self.buzzer_pin BUZZER_PINself.led_pin LED_PINself.is_alerting Falseself.alert_thread Noneself._setup_gpio()print(✅ 提示系统初始化成功)def _setup_gpio(self):配置GPIOGPIO.setmode(GPIO.BCM)GPIO.setup(self.buzzer_pin, GPIO.OUT)GPIO.setup(self.led_pin, GPIO.OUT)# 初始化PWM用于蜂鸣器self.buzzer_pwm GPIO.PWM(self.buzzer_pin, BUZZER_FREQUENCY)self.buzzer_pwm.start(0)def play_tone(self, frequency: int, duration: float):播放指定频率和时长的音调self.buzzer_pwm.ChangeFrequency(frequency)self.buzzer_pwm.ChangeDutyCycle(50) # 50%占空比time.sleep(duration)self.buzzer_pwm.ChangeDutyCycle(0)def flash_led(self, count: int, interval: float):闪烁LED指示灯for _ in range(count):GPIO.output(self.led_pin, GPIO.HIGH)time.sleep(interval)GPIO.output(self.led_pin, GPIO.LOW)time.sleep(interval)def ready_alert(self):预热完成提示三短一长if self.is_alerting:returnself.is_alerting Trueprint( 预热完成发出提示音)def alert_sequence():# 三短音for _ in range(3):self.play_tone(BUZZER_FREQUENCY, 0.2)time.sleep(0.1)# 一长音self.play_tone(BUZZER_FREQUENCY, 0.5)# LED闪烁self.flash_led(3, 0.2)self.is_alerting Falseself.alert_thread threading.Thread(targetalert_sequence, daemonTrue)self.alert_thread.start()def warning_alert(self):警告提示连续短音if self.is_alerting:returnself.is_alerting Truedef alert_sequence():for _ in range(5):self.play_tone(BUZZER_FREQUENCY, 0.1)time.sleep(0.1)self.is_alerting Falseself.alert_thread threading.Thread(targetalert_sequence, daemonTrue)self.alert_thread.start()def error_alert(self):错误提示长音if self.is_alerting:returnself.is_alerting Truedef alert_sequence():self.play_tone(BUZZER_FREQUENCY // 2, 1.0) # 低频长音self.is_alerting Falseself.alert_thread threading.Thread(targetalert_sequence, daemonTrue)self.alert_thread.start()def get_status(self) - dict:获取提示系统状态return {is_alerting: self.is_alerting,buzzer_pin: self.buzzer_pin,led_pin: self.led_pin}def cleanup(self):清理提示系统资源if self.alert_thread:self.alert_thread.join(timeout1.0)self.buzzer_pwm.stop()GPIO.output(self.led_pin, GPIO.LOW)GPIO.cleanup([self.buzzer_pin, self.led_pin])7. 数据记录模块 (storage/data_logger.py)温度数据记录模块记录温度变化曲线和系统事件import csvimport jsonimport osfrom datetime import datetimefrom collections import dequefrom config import LOG_FILE, LOG_INTERVAL, MAX_LOG_SIZEclass TemperatureDataLogger:def __init__(self):初始化数据记录器self.log_file LOG_FILEself.log_interval LOG_INTERVALself.max_log_size MAX_LOG_SIZEself.last_log_time 0self.temp_buffer deque(maxlen1000) # 内存缓冲self._init_log_file()print(✅ 数据记录器初始化成功)def _init_log_file(self):初始化日志文件if not os.path.exists(self.log_file):with open(self.log_file, w, newline) as f:writer csv.writer(f)writer.writerow([timestamp, temperature, target_temp,heater_power, pid_output, status])print(f 创建日志文件: {self.log_file})def log_data(self, temperature: float, target_temp: float,heater_power: float, pid_output: float, status: str):记录温度数据点current_time time.time()# 检查是否到达记录时间if current_time - self.last_log_time self.log_interval:returntimestamp datetime.now().isoformat()# 写入CSV文件with open(self.log_file, a, newline) as f:writer csv.writer(f)writer.writerow([timestamp, temperature, target_temp,heater_power, pid_output, status])# 添加到内存缓冲self.temp_buffer.append({timestamp: timestamp,利用AI解决实际问题如果你觉得这个工具好用欢迎关注长安牧笛

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价