基于嵌入式的智能物流柜( 触摸屏/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…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
