基于嵌入式的智能物流柜( 触摸屏/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…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...