|
在《2024 DigiKey 汽车应用创意挑战赛》中,设计一个创新的汽车座椅和方向盘加热系统是一个非常有潜力的方向,也是我接下来需要完成的项目任务。 下面是一些创意设计思路和技术实现方案,详细的介绍。
一、项目名称: 基于树莓派PI5汽车座椅方向盘加热系统
二、项目概述本项目是利用树莓派PI5作为核心处理器,结合多种传感器和执行器,包含多个加温控制模块,风扇等,,实现一个智能化的汽车座椅和方向盘加热系统。系统通过AHT10温湿度传感器实时监测环境温湿度,利用STO21加热片模块进行加热,并通过Motor Module直流电机控制风扇散热,确保系统在舒适和安全的环境下运行。串口屏用于显示系统状态和用户交互。 下面主要的功能以一组为示例进行讲解与操作。
系统组成 树莓派PI5:核心处理器,负责数据处理、逻辑控制和通信。 AHT10温湿度传感器:用于实时监测环境温湿度。 GPIO2(SDA,I2C1),GPIO3(SCL,I2C1) STO21加热片模块:用于座椅和方向盘的加热。GPIO4 Motor Module直流电机:用于控制风扇散热。GPIO17 串口屏:用于显示系统状态和用户交互。TX(GPIO15),RX(GPIO14)
系统功能 温湿度监测:通过AHT10传感器实时监测车内温湿度。 加热控制:根据用户设置和环境温度,控制STO21加热片模块进行加热。 散热控制:通过Motor Module直流电机控制风扇,确保系统不过热。 用户交互:通过串口屏显示系统状态,用户可以通过触摸屏进行设置和操作。
硬件连接 AHT10传感器:通过I2C接口连接到树莓派PI5。 STO21加热片模块:通过GPIO口控制,连接到树莓派PI5。 Motor Module直流电机:通过PWM控制,连接到树莓派PI5。 串口屏:通过UART接口连接到树莓派PI5。
软件设计 系统初始化: 初始化I2C、GPIO、PWM和UART接口。 初始化AHT10传感器、STO21加热片模块、Motor Module直流电机和串口屏。
温湿度读取: 通过I2C接口读取AHT10传感器的温湿度数据。 将数据存储在变量中,用于**处理。
加热控制: 根据用户设置和环境温度,控制STO21加热片模块的开关。 通过GPIO口输出高低电平控制加热片。
散热控制: 根据系统温度,控制Motor Module直流电机的转速。 通过PWM信号调节电机转速。
用户交互: 通过串口屏显示当前温湿度、加热状态和风扇状态。 用户可以通过触摸屏设置加热温度和风扇转速。
主循环: 循环读取温湿度数据。 根据数据调整加热和散热控制。 更新串口屏显示内容。
三、实物图
AHT10传感器:
AHT10 传感器特性 测量范围: 温度:-40°C ~ 85°C 湿度:0% ~ 100% RH 精度: 温度:±0.3°C 湿度:±2% RH 通信接口:I2C(默认地址:0x38) 供电电压:2.2V ~ 5.5V 低功耗:适合电池供电设备 封装:DFN(小型化封装)
STO21加热片模块: 【品名】:加热片模块 【规格】:41.6x12.1x11.6mm(长x宽x高) 【颜色】:蓝色 【PCB 材质】:军工级别双面PCB 板 【工作电压】:5V 【工作温度】:-40~85°℃ 【工作方式】:输入低电平或接地信号,加热片工作【产品特点】: 1、采用 5VPTC 恒温发热片 2、放置在容器外部进行加热使用,切勿将加热片置于液体之中进行使用 3、自带电源指示灯 4、提供 3mm 固定安装螺丝孔
Motor Module直流电机: 参数简介 工作电压:3.3V-5V 信号电平:0V-5V最大转速:3500RPM 工作温度:-20℃-80℃定位方式:M3螺丝重量:50.88g 模块尺寸:40mm*30mm(手工测量)
串口屏: 系列&尺寸 X2 6.2时 型号 比例1:3 分辨率360x960 亮度(nit)300 工作电压(V)4.65-6.5 休眠电流(mA)93 flash容量(Bytes)16M 运行内存(Bytes)512K 触摸类型 N:无触摸/C:电容式 TFT类型IPS 有效显示尺寸(mm)147.46(L)x55.30(W) 工作电流(mA)340 工作温度(°C)20~+70 掉电存储容量(Bytes)1K 串口指令缓存区(Bytes)4K
四、软件工作流程
软件控制说明: 初始化 开始 初始化串口通信(/dev/ttyAMA0, 9600波特率) 初始化控制器(CONTROLLER类) 初始化风扇(GPIO17,默认关闭) 初始化加热板(GPIO4,默认关闭) 初始化AHT10传感器 读取当前温度 向串口屏发送初始温度显示值(t2.txt="20") 设置目标温度(aim = 20) 主循环 循环开始 读取串口屏数据 从串口屏读取目标温度值(target) 如果读取到新数据: 更新目标温度(aim = target[-4]) 读取当前温度 调用AHT10.read_data()获取当前温度(temp)
显示当前温度 格式化温度值为字符串(temp_str = "{0:.2f}".format(temp)) 向串口屏发送当前温度值(t2.txt="temp_str") 温度控制逻辑 如果当前温度 < 目标温度
进入加热模式: 关闭风扇(fan.off()) 打开加热板(heat_board.off()) 更新串口屏显示加热图标(p3.pic=1) 如果当前温度 > 目标温度
进入散热模式: 打开风扇(fan.on()) 关闭加热板(heat_board.on()) 更新串口屏显示散热图标(p3.pic=2) 如果当前温度 = 目标温度 进入待机模式: 保持当前状态(device.init()) 更新串口屏显示待机图标(p3.pic=3) 延时 短暂延时(time.sleep(0.05) 主循环延时(time.sleep(0.9) 循环结束
五、点亮效果图
屏点亮效果
PI5控制软件代码:
连接图:
六、代码
- class AHT10:
- def __init__(self, bus=1, address=0x38):
- self.bus = smbus2.SMBus(bus)
- self.address = address
- def read_data(self):
- self.bus.write_i2c_block_data(self.address, 0xAC, [0x33, 0x00])
- time.sleep(0.1)
- data = self.bus.read_i2c_block_data(self.address, 0x00, 6)
- if not (data[0] & 0x80):
- raise RuntimeError("Device not ready")
- raw_temp = ((data[3] & 0x0F) << 16) | (data[4] << 8) | data[5]
- temperature = (raw_temp * 200.0 / 1048576) - 50
- return temperature
- class CONTROLLER:
- def __init__(self):
- self.temp = 0
- # 正向控制 on是开 off是关
- self.fan = LED(17)
- # 反向控制 off是开 on是关 是否加热从硬件外观是看不出的 加热比较慢 耐心等待
- self.heat_board = LED(4)
- self.aht10 = AHT10()
- self.init()
- def init(self):
- self.fan.off()
- self.heat_board.on()
- self.temp = self.aht10.read_data()
- def heat(self):
- self.fan.off()
- self.heat_board.off()
- self.temp = self.aht10.read_data()
- def cool(self):
- self.fan.on()
- self.heat_board.on()
- self.temp = self.aht10.read_data()
- ser = serial.Serial("/dev/ttyAMA0", 9600)
- device = CONTROLLER()
- device.init()
- ser.write('t2.txt="20"'.encode("GB2312"))
- ser.write(bytes.fromhex("ff ff ff"))
- aim = 20
- while 1:
- target = ser.read_all()
- print("---------------")
- if target != b"":
- aim = target[-4]
- print(aim)
- temp = device.temp
- print(temp, aim)
- temp_str = "{0:.2f}".format(temp)
- if int(temp) < aim:
- device.heat()
- ser.write("p3.pic=1".encode("GB2312"))
- ser.write(bytes.fromhex("ff ff ff"))
- elif int(temp) > aim:
- device.cool()
- ser.write("p3.pic=2".encode("GB2312"))
- ser.write(bytes.fromhex("ff ff ff"))
- else:
- device.init()
- ser.write("p3.pic=3".encode("GB2312"))
- ser.write(bytes.fromhex("ff ff ff"))
- time.sleep(0.05)
- ser.write('t2.txt="{}"'.format(temp_str).encode("GB2312"))
- ser.write(bytes.fromhex("ff ff ff"))
- time.sleep(0.9)
复制代码
七、屏软件操作界面
整体界面
多组选择菜单:
模块图:
八、计划框架图
主要是多级控制时的一个架构图:
软件控制操作图:
九、原理图:
十、视频讲解:
https://www.bilibili.com/video/BV1kwPxeGEu7/?vd_source=0e4686609dd9c60a63b3f7fe54080c03
|