发作品签到
专业版

#第七届立创电赛#智能花盆

工程标签

1.3w
0
0
4

简介

一个不像花盆的花盆,采用国民技术N32L403KBQ7主控!低功耗!集成ESP8266芯片,可进行联网使用(待完善),串口、电池管理、土壤湿度和环境温湿度检测,可扩展通过环境参数来控制浇水的湿度!

简介:一个不像花盆的花盆,采用国民技术N32L403KBQ7主控!低功耗!集成ESP8266芯片,可进行联网使用(待完善),串口、电池管理、土壤湿度和环境温湿度检测,可扩展通过环境参数来控制浇水的湿度!

开源协议

GPL 3.0

创建时间:2022-08-05 18:31:29更新时间:2022-09-08 09:50:09

描述

采用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

暂无BOM

附件

序号文件名称下载次数
1
Shinning_Star_Code.zip
76
2
3D_PCB1_2022-08-09.SLDASM
34
3
202209071923.mp4
134
克隆工程
添加到专辑
0
0
分享
侵权投诉

评论

全部评论(1
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航