基于嵌入式的智能物流柜( 触摸屏/0.96寸oled屏)
演示
智能物流柜(基础版)
智能物流柜(升级版)
前言
这是本人在大二在学校接的一个简单的实验室项目,之前发布了一个,由于那是在暑假,家里器材有限,代码敲完之后,用面包板接完,现象正常之后,就没去理过了,最近正好比较闲,我决定把他整理出来,供大家进行学习。
简介
这里有两个版本,一个是触摸屏,另一个是0.96寸oled➕矩阵按键,他们除了这里有所区别,其他地方都是完全一模一样的,我们就以基础版(0.96寸oled➕矩阵按键)进行讲解。
具体功能
✨通过按键输入密码进行物体的储存放置
✨存放后设置接收短信手机 进行密码接收
✨点击存储按钮存储物品 并发送密码短信
✨通过手机APP查看手机号以及取件码 输入取件码可打开柜门
✨通过led灯显示柜子状态
✨语音模块进行播报,实时进行状态播报
✨手机APP可以远程进行柜子的开关
硬件框图

主控部分
STM32F103C8T6 是一种微控制器,基于 ARM Cortex-M3 内核,运行频率可达 72 MHz。它有 64 KB 闪存和 20 KB SRAM,支持多种外设如定时器、ADC、DAC、USART、SPI 和 I2C,适用于各种嵌入式应用。
主控部分通过逻辑控制,通过输入模块,显示模块、上位机通讯、驱动模块,实现我们项目的完整功能,这里用到了STM32的多个外设,I2C、定时器、GPIO、USART......
驱动模块
SG90 180°舵机
舵机的控制信号为周期是20ms 的脉宽调制(PWM)信号,其中脉冲宽度从0.5ms-2.5ms,相对应舵盘的位置为0—180度,呈线性变化。也就是说,给它提供一定的脉宽,它的输出轴就会保持在一个相对应的角度上,无论外界转矩怎样改变,直到给它提供一个另外宽度的脉冲信号,它才会改变输出角度到新的对应的位置上。舵机内部有一个基准电路,产生周期20ms,宽度1.5ms的基准信号,有一个比较器,将外加信号与基准信号相比较,判断出方向和大小,从而产生电机的转动信号。控制电路板接受来自信号线相应的PWM控制信号,进而控制电机转动,电机带动一系列齿轮组,减速后传动至输出舵盘。舵机的输出轴和位置反馈电位计是相连的,舵盘转动的同时,带动位置反馈电位计,电位计将输出一个电压信号到控制电路板,进行反馈,然后控制电路板根据所在位置决定电机的转动方向和速度,从而达到目标停止。舵机的控制需要MCU产生一个周期为20ms的脉冲信号,以0.5ms到2.5ms的高电平来控制舵机转动的角度。我们通过STM32的定时器外设,输出相应的PWM波形,从而控制输入的占空比,从而改变舵机旋转的角度,实现了柜门的开关。
LED发光二极管
STM32 微控制器通过其 I/O 引脚控制 LED 的开关,将GPIO设置为推挽输出模式。LED 被连接到一个 STM32 的 I/O 引脚,通常通过一个限流电阻,以限制通过 LED 的电流,保护 LED 不被烧毁,这里LED亮灭表示了柜子的开光状态,用于提示用于柜门开关。
语音播报模块JQ8900-16P
JQ8900-16P 选用的是 SOC 方案,集成了一个 16 位的 MCU,以及一个专门针对音频解码的 ADSP,采用硬解码的方式,更加保证了系统的稳定性和音质。小巧尺寸更加满足嵌入其它产品的需求。此芯片最大的优势在于能够灵活的更换 SPI-flash 内的语音内容,省去了传统语音芯片需要安装 上位机更换语音的麻烦,SPI FLASH 直接模拟成 U 盘,跟拷贝 U 盘一样,非常方便。使得产品研发和生产变得便捷简单。一线串口控制模式、RX232 串口控制可选,为研发提供更多的选择性。我们利用一线串口模式,通过编写对应的通信协议,在需要播报特定语音的时候,STM32通过一线串口,发送对应的信息,语音模块就会播放提前存好在自己FLASH内的语音内容,实现播报特定的语音。
显示模块
0.96寸OLED屏幕。
0.96寸 OLED 屏幕是一种小型显示器,通常用于嵌入式项目中。能够独立发光,不需要背光,显示对比度高,屏幕对角线长度为 0.96 英寸,显示区域小巧,适合紧凑型设备。分辨率通常为 128 x 64 像素,用于显示简单的图形和文本。接口类型:使用 I2C(Inter-Integrated Circuit)通信协议,通过四根针脚进行连接:VCC(电源)、GND(接地)、SCL(时钟线)、SDA(数据线)。优点为低功耗、高对比度、视角宽广,适合低功耗设备和需要清晰显示的应用。OLED 屏幕通过 I2C 接口与微控制器STM32通信,实现数据传输和显示内容更新,来进行柜子UI界面的显示。
2.8寸TFTLCD屏幕
这个操作起来就比前面的oled复杂很多,由于这个屏幕引脚很多,而且需要使用到FSMC外设,我们要将主控换掉,我自己采用的是STM32F407ZGT6,不仅仅引脚多,Flash、ROM和RAM都大很多,可以搭载大型的项目。
输入模块
4x4矩阵按键
4x4 矩阵按键是一种常见的输入设备,通常由 16 个按键组成,按键排列在 4 行 4 列的矩阵中。结构由4行和4列交错排列的按键组成,通过行列扫描来识别按键输入。当按键被按下时,行列交点接通,单片机扫描行列组合来确定哪个按键被按下。
单片机应用中的优势:节省引脚,通过矩阵扫描,4x4 的按键矩阵只需要 8 个引脚(4 行 + 4 列)来处理 16 个按键,大大减少了所需的 I/O 引脚数量。通过扫描行列,能够快速检测多个按键的状态,适合需要较多输入的场景。
在 STM32 中,通过配置 STM32 的 GPIO 引脚为输入或输出,用于行列扫描。编写扫描程序,通过轮询或中断方式检测按键状态,并处理输入。实现按键去抖动,确保输入的稳定性和准确性。可选用中断来提高响应速度和效率。通过矩阵按键,STM32 可以有效地处理多个按键输入,减少硬件复杂度。
触摸模块
使用触摸芯片为XPT2046,使用i2c进行通信,通过检测哪里被按下,可以进行i2c告诉主控有地方被按下并且告诉按下的坐标位置,实现触摸功能。
我们柜子需要有很多按键,比如数字键 0-9,确认键,删除键,存储键、等等,通过识别出哪个按键被按下,从而单片机进行逻辑控制。
上位机
机智云手机APP
使用机智云手机 app 作为 STM32 的上位机,通过 ESP8266 进行连接的流程可以分为以下几个步骤:
1.硬件准备:STM32:主控制器,用于处理数据和控制外设。ESP8266:无线模块,用于与互联网连接。机智云:云平台,用于接收和发送数据。
2.ESP8266 配置:通过 AT 命令或其他方式将 ESP8266 连接到 Wi-Fi 网络。
3.云平台连接:配置 ESP8266 以连接到机智云平台,通过 MQTT 或 HTTP 协议进行通信。
4.STM32 编程:数据处理:编写程序来读取传感器数据或处理控制信号。串口通信:使用串口(UART)与 ESP8266 进行数据传输。
5.机智云配置:设备注册:在机智云平台上注册并配置 STM32 设备。数据流设置:创建数据流或接口,以接收和发送 STM32 和手机 app 之间的数据。
6.手机 app 配置:下载和安装:在手机上下载机智云 app。设备绑定:通过 app 绑定和管理 STM32 设备。数据监控:查看来自 STM32 的数据和控制设备。数据交换:
7.发送数据:STM32 将数据通过 ESP8266 发送到机智云。
8.接收数据:手机 app 从机智云获取数据,进行显示或控制操作。
通过这些步骤,可以实现 STM32 与机智云手机 app 的无缝连接,实现数据监控和控制,从而实时显示出我们柜子的状态,柜子的取件码以及手机号码。
软件流程介绍
工程文件夹介绍

USER
存放main函数以及系统文件和中断文件

HARDWARE
存放硬件驱动文件。

SYSTEM
存放系统初始化文件。

CORE
存放内核驱动文件以及STM32启动文件

FWLIB
标准库移植文件

Gizwits以及Utils
存放网络协议代码

程序实现流程
int main(void){ //延时函数初始化 delay_init(); //引脚配置GPIOD_Init(); //LED灯控制LED1=KG1;LED2=KG2;LED3=KG3;LED4=KG4; //4*4按键初始化 Key_Init();//定时器3初始化,控制舵机和生成随机数Timer0Init(); Timer2_Configuration();//1ms进入一次中断,给机智云协议提供时钟//初始化OLED OLED_Init(); OLED_Clear(); //初始化语音模块voice_init();uart1_init(9600);//初始化串口1//清屏xianshiClear(); //显示-主界面xianshi_zjm();//开机播报//欢迎使用自动存取快递柜//播放指定的铃声lingsheng(11);//延迟5s让语音播报完成delay_ms(1000); delay_ms(1000);delay_ms(1000);delay_ms(1000);delay_ms(1000); lingsheng(1);delay_ms(1000); delay_ms(1000); delay_ms(1000); /*机智云初始化*/userInit();gizwitsInit();/*一件配网模式*///播报:请打开手机app进行连接gizwitsSetMode(2);while(1){//按键扫描和处理anjianchuli(); //生成随机数zhongzi(); //LED灯状态更新LED1=KG1;LED2=KG2;LED3=KG3;LED4=KG4;/*网络参数更新,对数据点的数值变量进行赋值操作*/userHandle();/*联网,上传数据,接收下发数据*/gizwitsHandle((dataPoint_t *)¤tDataPoint); }
}
- 进行各项初始化,包括延时函数初始化、引脚配置、按键初始化、定时器初始化、语音模块初始化、串口初始化、网络配置初始化、屏幕初始化.......
- 之后进入线程的处理,包括按键扫描处理、随机数生成、舵机和LED状态更新、网络参数同步、网络协议任务处理。
- 按键扫描与处理:项目的核心线程,通过不断扫描按键状况,通过逻辑控制进行对应按键的处理,包括:密码的输入、手机号码的输入、存件的确认、密码的删除、柜门的关闭......,之后在根据对应的状态进行对应的控制,比如:语音播报、柜门开关、取件码的更新、手机号码的更新......,柜子的基本功能都在这个线程里面进行处理。
- 随机数的生成:通过定时器不断的计时,通过采样计数器的值,来不断生成随机数,需要用到的时候,可以当作取件码,保证了取件码的随机性,防止快递密码被人为篡改。
- 舵机和LED状态更新:通过全局变量,调控着柜子和LED指示灯的状态,这里如果全局变量改变,我们及时进行状态更新,保证柜子响应正确。
- 网络参数同步:我们这里要和手机APP进行通信,我们网络协议里面规定了APP中的显示数据,包括可读以及可写,我们不断的进行消息的同步,以确保上位机和STM32的正确通信和正确状态显示。
- 网络协议处理:我们上位机会发来消息,我们这个时候,就要调用这个函数,不断的进行对应协议的回复,保证与上位机的正常通信。
总结
以上就是我对这个项目的解释,这里我感觉还没有做到完美,暂且不开源......,读者可以根据我的思路,自己进行设计。
相关文章:
基于嵌入式的智能物流柜( 触摸屏/0.96寸oled屏)
演示 智能物流柜(基础版) 智能物流柜(升级版) 前言 这是本人在大二在学校接的一个简单的实验室项目,之前发布了一个,由于那是在暑假,家里器材有限,代码敲完之后,用面包板…...
VSCode创建C++项目和编译多文件
前言 在刚安装好VSCode后,我简单尝试了仅main.cpp单文件编译代码,没有问题,但是当我尝试多文件编译时,就出现了无法识别cpp文件。 内容 创建项目 首先点击左上角“文件”;在菜单中选择“打开文件夹”;在…...
7个提升网站分页体验的 CSS 和 JavaScript 代码片段
文章目录 前言正文1.简洁直观的悬停分页效果2.实时显示页码的分页3.适合响应式设计的多功能分页4.专为移动设备优化的分页5.无数字的极简分页设计6.触屏友好的分页7.结合无限滚动与分页的设计 总结 前言 分页是内容丰富的网站中不可缺少的导航工具,能帮助用户更轻松…...
C++——用带有默认参数的函数实现,求两个整数或三个整数中的最大数。
没注释的源代码 #include <iostream> using namespace std; int max(int a,int b,int c0); int main() { int a,b,c; cout<<"请输入三个整数:"; cin>>a>>b>>c; cout<<"三个整数的最大值是&am…...
对商品分类系统的若干问题的思考
科学研究的目的就是研究事物的特征,并根据共同的特征加以分类 商品分类是商业,制造业中最普遍的活动,几乎所有的企业,电商平台都要对销售的商品,使用的原材料(BOM)进行分类和编号。 商品分类貌似…...
javascript中Number 类型 在实际开发中常用的一些操作方法
在 JavaScript 中,Number 类型是非常基础的数据类型之一,用于表示整数和浮点数。除了基本的算术运算外,还有许多内置的方法可以帮助你处理数字。下面列举了一些在实际开发中常用的 Number 类型的操作方法: 1. 转换方法 Number()…...
部分解决FDTD安装后,matlab指令fopen报错
今天在新的win11电脑上安装FDTD时,发现在C:\Program Files目录中并没有Lumerical文件夹,把激活文件粘贴过去后虽然能正常启动,但对于matlab link FDTD过程中无法响应以下代码: setenv(PATH, [getenv(PATH) ;C:\Program Files\Lum…...
[python3] 处理函数的重试
tenacity是一个 Python 库,用于简化重试逻辑的实现。它提供了装饰器和工具函数,使得在函数执行失败时可以自动重试。以下是对tenacity库的详细介绍: 一、安装 可以使用pip安装tenacity: pip install tenacity二、主要概念和功能…...
鸿蒙开发之ArkTS 界面篇 一
建好一个工程后,右侧可以预览,看到效果,效率十分可以,如图: State message: string 鸿蒙开发入门篇; 这个字符串改成什么,右侧就显示什么 Entry是类装饰器,可以简单的理解为程序入口的必须的装饰器&…...
嵌入式Linux学习笔记(6)-线程处理、线程同步、线程池(c语言实现)
一、概述 线程是一种轻量级的并发执行的机制。线程是进程中的一个实体,它执行在同一进程的上下文中,共享同一内存空间,但拥有独立的栈空间。 C语言的线程使用pthread库实现,通过包含头文件 pthread.h 来使用相关的函数和数据类型 …...
【HTTP】请求“报头”(Host、Content-Length/Content-Type、User-Agent(简称 UA))
Host 表示服务器主机的地址和端口号 URL 里面不是已经有 Host 了吗,为什么还要写一次? 这里的 Host 和 URL 中的 IP 地址、端口什么的,绝大部分情况下是一样的,少数情况下可能不同当前我们经过某个代理进行转发。过程中…...
【刷题日记】43. 字符串相乘
43. 字符串相乘 其实就是大数乘法题,这道题用草稿纸演练一下,其实很好找到方法,模拟大数乘法即可。需要注意的是进位和迭代值,还有注意向下取整和去除前导0(容易遗漏)。去除前导0的时候还要注意如果全是0&…...
Verilog学习之旅~
记录Verilog的学习日常~ 第一阶段:牛客网刷题 1.Verilog快速入门 基础语法 VL1:四选一多路器:case语句、条件表达符; VL2:异步复位的串联T触发器:T触发器的基本功能及代码实现、异步复位的概念; VL3:奇偶校验:缩…...
linux之mysql安装
1:mysql安装包下载 下载地址 可私信我直接获取安装包 2:linux下wget命令下载 下载地址 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz3:手动安装 将自己的安装包上传到对应的位置 解压 压缩包 使用命令 tar -zxvf mysql-5.7…...
单身狗的逆袭之路之开发相亲交友系统
在这个充满机遇与挑战的时代,单身人士渴望找到属于自己的幸福。然而,在忙碌的工作与生活中,他们往往难以抽出时间去拓展社交圈。相亲交友系统的出现,无疑是为这些“单身狗”提供了一个逆袭的机会。通过相亲交友系统,用…...
【Spring】IocDI详解(6)
本系列共涉及4个框架:Sping,SpringBoot,Spring MVC,Mybatis。 博客涉及框架的重要知识点,根据序号学习即可。 有什么不懂的都可以问我,看到消息会回复的,可能会不及时,请见谅!! 目录 本系列共…...
Redis系列之底层数据结构SDS
Redis系列之底层数据结构SDS 实验的环境 Redis 6.0VSCode 1.88.1 什么是SDS? SDS:Simple Dynamic String,翻译为简单动态字符串。SDS是一种用于存储二进制数据的数据结构,具有动态扩容的特点,代码位于src/sds.h和src/sds.c …...
【STM32】esp8266连接wifi
1.配置stm32cubemx 使用串口二接收esp8266的数据,单片机接收,使用串口1将数据发送给串口助手 串口2波特率设置74880,串口1设置115200 在初始化的时候需要将复位引脚拉低20ms,然后再拉高20ms, 设置GPIOB的输出模式 对PB12做输出处理 2.…...
网络运维故障处理
本篇纯是之前的工作经验做一个分享,大家看个热闹就好。 1.突然的断网,在上家上班的时候,有一天突然下午厂区内开始出现大面积网络卡顿,teams,outlook不好使等情况,且网盘也上不去,所以开始排查…...
C++第十一节课 new和delete
一、new和delete操作自定义类型 new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数(new会自动调用构造函数;delete会调用析构函数) class A { public:A(int a 0): _a(a){cout <&l…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
