
#第七届立创电赛#智能花盆
简介
一个不像花盆的花盆,采用国民技术N32L403KBQ7主控!低功耗!集成ESP8266芯片,可进行联网使用(待完善),串口、电池管理、土壤湿度和环境温湿度检测,可扩展通过环境参数来控制浇水的湿度!
简介:一个不像花盆的花盆,采用国民技术N32L403KBQ7主控!低功耗!集成ESP8266芯片,可进行联网使用(待完善),串口、电池管理、土壤湿度和环境温湿度检测,可扩展通过环境参数来控制浇水的湿度!开源协议
:GPL 3.0
描述
采用N32L403KBQ7主控,ESP8266作为联网设备,可选择不联网和联网情况下使用,在不联网时也可以调节控制参数
Update:
1.Bug:ESP8266不工作,可能是硬件复位电路没做好的问题,所以联网这块可能得鸽一段时间了。
2.BH1750 ADI没上拉到VCC(已修复)
3.电池电量检测还有点小BUG
功能框图如下
美图鉴赏
外壳初妆
一、各模块功能介绍
1.主控
为了能够在不连接电源的情况下提高续航,采用低功耗的N32L403KBQ7主控,主要的作用有:收集数据并处理,处理图像,发送数据给ESP8266,检测电池电量。切记!未引出BOOT0,只能通过SWD下载。
2.土壤湿度模块
使用优信家的土壤湿度模块,建议买沉金款的,普通款在高湿度环境下容易生锈,导致测量不准确等问题,因为是通过接触土壤的方式来检测,所以必须要插在土壤比较紧实的地方,并且滴箭(插入土壤里的水管)和土壤湿度模块必须相近,否则会导致水分输入过多的情况。
3.温湿度模块
SHT30是一个比较常用的温湿度模块,尽管可以使用像DHT22这样的单总线通信模块,但是考虑体积问题,所以弃用此方案。此外SHT30具有功耗低,反应快,抗干扰能力强的优点。
4.无线模块
本次无线和联网设备采用老朋友ESP8266,原本方案是采用同频率下功耗更低的ESP32-C3作为联网设备,MCU通过串口发送数据给ESP8266,ESP8266再通过MQTT向设备端发送数据,且终端也可发送信息给ESP8266,ESP8266再发给主控,进行环境参数设置,或者产生相应的动作。
5.光线传感器模块
采用BH1750,这个是帮别的学院的同学进行研究,光照对于植物对土壤湿度需求影响的研究(我负责的部分),但是被弃用了,而且放在背面,对于光照的敏感度太低。相关驱动代码已写好,有需要的同学自行领取~
6.拨轮(按键控制)
拨轮相对于其他按键来说,拥有比较高的交互性,并且相对美观,已适配长按和短按驱动。
7.电源管理及充电模块
采用了一颗pmos管进行电源管理,当USB没有电源(VBUS)输入时,通过一颗弱下拉电阻,使得栅极呈低电平,此时DS导通,使用锂电池供电,当有USB电源提供时,VBUS会通过一颗肖特基二极管,给系统供电,此时DS断开,使得在充电的同时也可以给系统供电,若听的不是很明白,可以去看一下工科男孙老师的视频。充电部分采用锂电池电源管理芯片,LTC4054是TP4054的加强版(?),功能和TP4054差不多,不再赘述。
8.水泵
就普通的3V迷你水泵,只能说能用吧。。。。
9.固定部分
焊接铜螺母
2.项目灵感来源
他说还没想好。
二、硬件部分
1.电源
采用两颗AMS1117分别给ESP8266和MCU及设备供电,采用星型连接,分开供电,避免ESP8266在高功耗时AMS1117发热严重,导致温度测量不准确。电池供电使用RC滤波,有效减少低频噪声。充放电共存在上面已有说明。
2.土壤湿度测量
添加了1nf的电容,稳定数据
3.ESP8266
晶振包地,天线下无走线,另外有延时启动,各部分严格按照技术手册要求。
3.I2C
添加了上拉电阻,极大地支持外部I2C设备。
4.拨轮
因为芯片内部可以设定为上拉状态,在上拉输入时可检测拨轮状态。
5.电池电量检测
采用开关式,避免产生多余的功耗
6.水泵驱动
采用PWM驱动MOS调速,低导通,通过定时器输出不同的占空比的PWM来调节水泵马力。
7.复位
没啥好说的,BOOT0通过下拉电阻接地,直接进入系统flash,NRST上拉正常启动,接地复位。
8.充电模块
9.短接点
通过短接,使用短接点,选择USB串口调试。
三、软件部分
实现功能分为八个部分
1.UI 不得不说的方面
UI实际上就是套娃,建立一个主链表,作为父对象,然后包含子对象(其实也是一个链表),当点击确定,子对象不为空时,指向子对象,当退出时,再指回父对象。详情请参考这篇文章,思路参考来自这篇文章(@snqx-lqh)
大部分代码我都做好注释。
链表如下,已做好注释,创建对象时严格按照如下格式
菜单的建立
就和刚刚说的一样,套娃!建立一个对象,这个对象可以是父对象也可以是子对象,子对象的意思就是,被这个父对象包含,当子对象被点击时进入子对象的链表,同时,这个父对象也有可能是另一个对象的子对象(所以说套娃)。
UI刷屏
UI刷屏分别是两个函数控制刷新,一个是菜单页的刷新,一个是数据的刷新
菜单页刷新
数据刷新
UI控制
当按键触发时,转向对应的链表,详情请看源代码
2.OLED驱动
该驱动取自B站UP主Mjgame,主要进行图形库的驱动,以及各种图形接口,唯一缺点是用不了反色。
3.土壤湿度
采用DMA搬运ADC,感觉也没啥好讲的,使能DMA和ADC以后就自动转换数据了。
4.环境温湿度
I2C驱动SHT30,在EV7标志位以后,连续获取信息,每8位进行一次标志位检测再给个EV7结束接收,实际上连续获取的时候检测EV7也是可以的,只要在最后发送终止信号就行
while(!I2C_CheckEvent(I2C2, I2C_EVT_MASTER_DATA_RECVD_FLAG));
data[0] = I2C_RecvData(I2C2);
while(!I2C_CheckEvent(I2C2, I2C_EVT_MASTER_DATA_RECVD_FLAG));
data[1] = I2C_RecvData(I2C2);
while(!I2C_CheckEvent(I2C2, I2C_EVT_MASTER_DATA_RECVD_FLAG));
data[2] = I2C_RecvData(I2C2);
while(!I2C_CheckEvent(I2C2, I2C_EVT_MASTER_DATA_RECVD_FLAG));
data[3] = I2C_RecvData(I2C2);
while(!I2C_CheckEvent(I2C2, I2C_EVT_MASTER_DATA_RECVD_FLAG));
data[4] = I2C_RecvData(I2C2);
I2C_ConfigAck(I2C2, DISABLE);
while(!I2C_CheckEvent(I2C2, I2C_EVT_MASTER_DATA_RECVD_FLAG));
data[5] = I2C_RecvData(I2C2);
I2C_GenerateStop(I2C2, ENABLE);
I2C_ConfigAck(I2C2, ENABLE);
5.马达驱动
很简单,就调整占空比就完事了,占空比算法就是设置的比较值/period。
void Motor_Speed( int16_t speed_level )
{
int16_t level =0;
if( speed_level <=10 )
{
level = speed_level*100;
TIM_SetCmp1( TIM3, level );
}
}
6.Flash
本项目采用了写Flash的方式进行数据的存储,主要是设定上的数据,如马达的转速,设定浇水的土壤湿度,将其存储在第63页,从第0位开始,高8位是记录马达转速,低8位是记录浇水的土壤湿度。
7.延时函数
采用两个通用定时器TIM6和TIM7,想着反正用不到,就用来计时了,分别进行ms级和us级的延时,在系统开始时必须调用一次,否则第一个延时函数将失效。
8.按键
实现了长短按的功能,但是我这项目只用到短按,思路是当检测到按键按下,进入while循环,此时对应按键的数值++,当达到阀值(长按的时间)或者按键不再按下的时候跳出,循环内有判断,会将长按的标志位置位,再进行判断是哪个按键按下,以及长短按的情况
四、功能视频
设计图

BOM


评论