当前位置: 首页 > news >正文

STM32项目分享:基于单片机的图书馆座位监测系统

“我们不做一锤子买卖,只做技术成长的长期伙伴!”

目录

一、视频展示

二、项目简介

三、原理图设计

四、PCB硬件设计

五、程序设计

六、资料分享


一、视频展示

基于单片机的图书馆座位监测系统 -视频分享

二、项目简介

题目:基于单片机的图书馆座位监测系统
主控:STM32
显示:OLED显示屏
DS1302时钟模块
红外光电
红外测温模块
蓝牙模块
红色led+黄色led
声光报警:LED+蜂鸣器
功能:
1、光电负责检测是否有物品在位置上,红外测温负责识别是人体还是其他物品。
2、若为物品占位则开启蜂鸣器报警提醒不得占位。
3、若为人则正常,当人员长时间使用座位时,黄色灯光亮起一分钟以提醒休息。若人员长时间离开座位时,红色灯光亮起,提示工作人员进行清洁。
4、显示屏显示当前座位编号,数据信息。

三、原理图设计

四、PCB硬件设计

五、程序设计

#include "stm32f10x.h"                  // 包含设备头文件
#include "delay.h"                      // 包含延时库
#include "lcd.h"                        // 包含LCD显示库
#include "ds1302.h"                     // 包含DS1302时钟库
#include "IOput.h"                      // 包含输入输出库
#include "usart.h"                      // 包含USART库// 定义全局变量
u8 show_flag, BEEP_flag, on_flag, count;
u8 flag_lightel = 0,flag_wd = 0;
float MAX_WD=37.5,wd;
u8 flag_peo = 0;
u8 flag_real_peo = 0;
u8 flag_wuti = 0;
u8 timeM = 0;
u8 timeS = 0;
// 蜂鸣器控制函数void beep1()
{BEEP = 0; // 打开蜂鸣器// 延时8秒,模拟蜂鸣器响8秒Delay_1ms(1000);Delay_1ms(1000);Delay_1ms(1000);Delay_1ms(1000);Delay_1ms(1000);Delay_1ms(1000);Delay_1ms(1000);Delay_1ms(1000);BEEP = 1; // 关闭蜂鸣器// 延时8秒,模拟蜂鸣器停止8秒Delay_1ms(1000);Delay_1ms(1000);Delay_1ms(1000);Delay_1ms(1000);Delay_1ms(1000);Delay_1ms(1000);Delay_1ms(1000);Delay_1ms(1000);Delay_1ms(1000);}// 显示时间函数
void showtime(void)
{OLED_ShowCH(0,0,"编号:");OLED_ShowNum(40,0,12,2,16);if(flag_peo&&!flag_lightel ){OLED_ShowCH(64,0,"有人");flag_real_peo = 1;BEEP = 1;}else if(!flag_lightel){OLED_ShowCH(64,0,"物体");flag_real_peo = 0;flag_wuti = 1;BEEP = 0;}else{OLED_ShowCH(64,0,"无人");flag_real_peo = 0;flag_wuti = 0;BEEP = 1;}OLED_ShowCH(0, 2, "状态:");        // 显示闹钟标识ds1032_read_realTime();             // 读取当前时间// 显示年份、月份、日期、小时、分钟和秒OLED_ShowNum(0, 4, TimeData.year, 4, 16);OLED_ShowString(35, 4, "/", 16);OLED_ShowNum(43, 4, TimeData.month, 2, 16);OLED_ShowString(60, 4, "/", 16);OLED_ShowNum(70, 4, TimeData.day, 2, 16);OLED_ShowNum(0, 6, TimeData.hour, 2, 16);OLED_ShowString(20, 6, ":", 16);OLED_ShowNum(30, 6, TimeData.minute, 2, 16);OLED_ShowString(50, 6, ":", 16);OLED_ShowNum(60, 6, TimeData.second, 2, 16);
}// 显示修改时间的函数
void show_change_time(void)
{OLED_ShowString(0, 4, "20", 16);OLED_ShowNum(16, 4, lssj.year, 2, 16);OLED_ShowString(35, 4, "/", 16);OLED_ShowNum(43, 4, lssj.month, 2, 16);OLED_ShowString(60, 4, "/", 16);OLED_ShowNum(70, 4, lssj.day, 2, 16);OLED_ShowNum(0, 6, lssj.hour, 2, 16);OLED_ShowString(20, 6, ":", 16);OLED_ShowNum(30, 6, lssj.minute, 2, 16);OLED_ShowString(50, 6, ":", 16);OLED_ShowNum(60, 6, lssj.second, 2, 16);Delay_50ms(2); // 延时
}// 定时函数,检查是否到达设定的闹钟时间
void DINGSHI(u8 minute_flag,u8  flag_led)
{if(TimeData.minute == minute_flag && TimeData.second < 30){BEEP_flag = 1;}if(BEEP_flag == 1){if(flag_led){OLED_ShowCH(40,2,"该休息了");YELLOW = 1;}else{RED = 1;OLED_ShowCH(40,2,"该打扫了");}if(TimeData.second > 30){RED = 0;YELLOW = 0;on_flag = 0;BEEP_flag = 0;}}}
void check_people(void)
{u8 WENDU_H,WENDU_L;//	OLED_ShowCH(0,0,"  红外体温计  ");	
//	OLED_ShowCH(0,2,"温度阈值:");	
//	OLED_ShowCH(0,4,"当前体温:");
//	OLED_Showdecimal(72,2,MAX_WD,2,1,16);if(USART_RX_STA&0X8000)//接收到一次数据{WENDU_H=USART_RX_BUF[2];		WENDU_L=USART_RX_BUF[3]/10;WENDU_H=WENDU_H&0X00FF;if(WENDU_H>=55){WENDU_H=0;WENDU_L=0;wd = (float)WENDU_H+(float)WENDU_L;UsartPrintf(USART1,"编号:%d\r\n",12);if(flag_real_peo){UsartPrintf(USART1,"有人\r\n");}else if(flag_wuti){UsartPrintf(USART1,"有物品\r\n");}else{UsartPrintf(USART1,"没人\r\n");}UsartPrintf(USART1,"\r\n\r\n");OLED_ShowNum(104,0,wd,2,16);if(wd>1 && wd < 39.5){flag_peo = 1;}else{flag_peo = 0;}USART_RX_STA=0;//启动下次接收}else{wd = (float)WENDU_H+(float)WENDU_L;UsartPrintf(USART1,"编号:%d\r\n",12);if(flag_real_peo){UsartPrintf(USART1,"有人\r\n");}else if(flag_wuti){UsartPrintf(USART1,"有物品\r\n");}else{UsartPrintf(USART1,"没人\r\n");}UsartPrintf(USART1,"\r\n\r\n");OLED_ShowNum(104,0,wd,2,16);if(wd>1 && wd < 39.5){flag_peo = 1;}else{flag_peo = 0;}USART_RX_STA=0;//启动下次接收}}delay_ms(200);//发送测温指令 0XFA 0XCA 0XC4USART2_SendData(0XFA);USART2_SendData(0XCA);USART2_SendData(0XC4);
}
// 主函数
int main(void)
{delay_init(); // 初始化延时NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 配置优先级分组OLED_Init(); // 初始化OLEDdelay_ms(1);OLED_Clear(); // 清屏ds1302_gpio_init(); // 初始化DS1302input_init(); // 初始化输入output_init(); // 初始化输出Usart1_Init(9600);Usart2_Init(9600);//发送体温模式指令 0XFA 0XC5 0XBFUSART_SendData(USART2,0XFA);USART_SendData(USART2,0XC5);USART_SendData(USART2,0XBF);delay_ms(50);while(1){check_people();flag_lightel= GD;key_scan();if(key1_flag == 1){key1_flag = 0;show_flag++;if(show_flag == 7){show_flag = 0;lssj.month = (lssj.month) / 10 * 16 + (lssj.month) % 10;lssj.day = (lssj.day) / 10 * 16 + (lssj.day) % 10;lssj.hour = (lssj.hour) / 10 * 16 + (lssj.hour) % 10;lssj.minute = (lssj.minute) / 10 * 16 + (lssj.minute) % 10;lssj.second = (lssj.second) / 10 * 16 + (lssj.second) % 10;lssj.year = lssj.year;ds1032_init(); // 初始化DS1032}}if(show_flag == 0){showtime(); // 显示时间lssj.year = TimeData.year - 2000;lssj.month = TimeData.month;lssj.day = TimeData.day;lssj.hour = TimeData.hour;lssj.minute = TimeData.minute;lssj.second = TimeData.second;lssj.week = TimeData.week;if(flag_real_peo == 1){OLED_ShowCH(40,2,"位置有人");
//				flag_real_peo = 0;on_flag++;if(on_flag == 1){timeM = TimeData.minute;timeS = TimeData.second;}}else {on_flag = 0;}if(on_flag){DINGSHI(timeM+1,1);//有人黄灯提醒}else{DINGSHI(timeM+1,0);//无人红灯提醒OLED_ShowCH(40,2,"位置没人");}//            count++; // 增加计数
//            if(count >= 100)
//            {
//                // 通过串口打印时间和闹钟状态
//                UsartPrintf(USART1, "时间:\r\n%d年", TimeData.year);
//                UsartPrintf(USART1, "%d月", TimeData.month);
//                UsartPrintf(USART1, "%d日\r\n", TimeData.day);
//                UsartPrintf(USART1, " %d", TimeData.hour);
//                UsartPrintf(USART1, ":%d", TimeData.minute);
//                UsartPrintf(USART1, ":%d\r\n", TimeData.second);
//                if(on_flag == 1)
//                {
//                    UsartPrintf(USART1, "闹钟:开\r\n");
//                }
//                else
//                {
//                    UsartPrintf(USART1, "闹钟:关\r\n");
//                }
//                count = 0; // 重置计数
//            }}// 以下是调整年、月、日、小时、分钟和秒的功能if(show_flag == 1){show_change_time();if(key2_flag == 1){key2_flag = 0;lssj.year++;}if(key3_flag == 1){key3_flag = 0;lssj.year--;}if(lssj.year > 100)lssj.year = 0;OLED_ShowChar(24, 4, '_', 16);Delay_50ms(2);}if(show_flag == 2){show_change_time();if(key2_flag == 1){key2_flag = 0;lssj.month++;}if(key3_flag == 1){key3_flag = 0;lssj.month--;}if(lssj.month > 12)lssj.month = 1;if(lssj.month < 1)lssj.month = 12;OLED_ShowChar(51, 4, '_', 16);Delay_50ms(2);}if(show_flag == 3){show_change_time();if(key2_flag == 1){key2_flag = 0;lssj.day++;}if(key3_flag == 1){key3_flag = 0;lssj.day--;}if(lssj.day > 31)lssj.day = 1;if(lssj.day < 1)lssj.day = 31;OLED_ShowChar(78, 4, '_', 16);Delay_50ms(2);}if(show_flag == 4){show_change_time();if(key2_flag == 1){key2_flag = 0;lssj.hour++;if(lssj.hour > 23)lssj.hour = 0;}if(key3_flag == 1){key3_flag = 0;lssj.hour--;if(lssj.hour > 200)lssj.hour = 23;}OLED_ShowChar(8, 6, '_', 16);Delay_50ms(2);}if(show_flag == 5){show_change_time();if(key2_flag == 1){key2_flag = 0;lssj.minute++;if(lssj.minute > 59)lssj.minute = 0;}if(key3_flag == 1){key3_flag = 0;lssj.minute--;if(lssj.minute > 200)lssj.minute = 59;}OLED_ShowChar(38, 6, '_', 16);Delay_50ms(2);}if(show_flag == 6){show_change_time();if(key2_flag == 1){key2_flag = 0;lssj.second++;if(lssj.second > 59)lssj.second = 0;}if(key3_flag == 1){key3_flag = 0;lssj.second--;if(lssj.second > 200)lssj.second = 59;}OLED_ShowChar(68, 6, '_', 16);Delay_50ms(2);}}
}

六、资料分享

点击即可查看当前资料分享。

http://www.xdnf.cn/news/1421947.html

相关文章:

  • Git 版本管理工具基本操作汇总—命令总结
  • 液态神经网络(LNN)2:LTC改进成CFC详细推导过程
  • 使用 BayesFlow 神经网络简化贝叶斯推断的案例分享(二)
  • 液态神经网络:智能制造的新引擎
  • Android Framework打电话禁止播放运营商视频彩铃
  • FastLED库完全指南:打造炫酷LED灯光效果
  • 线程池发生了异常该怎么处理?
  • 多校区学校押金原路退回系统之免安装使用教程——东方仙盟
  • 本地部署开源临时文本分享服务 PrivateBin 并实现外部访问( Windows 版本)
  • AOSP 目录及其作用
  • Minecraft(我的世界)服务器信息查询免费API接口详解
  • golang 14并发编程
  • 轻量实现 OCPP 1.6 JSON 协议(欧洲版)的充电桩调试平台
  • Google Gemini 2.5 Flash Image(Nano-Banana)震撼登场!人人都能免费用的AI修图神器!
  • SQL执行过程及原理详解
  • AI + 机器人:当大语言模型赋予机械 “思考能力”,未来工厂将迎来怎样变革?
  • 三、SVN实践练习指南
  • 轻量级注意力模型HOTSPOT-YOLO:无人机光伏热异常检测新SOTA,mAP高达90.8%
  • Swift 解法详解:LeetCode 368《最大整除子集》
  • 【牛客JZ31】—栈的压入弹出序列判断算法详解
  • FPGA中的亚稳态与跨时钟域数据撕裂现象
  • 眼底病害图像分类数据集
  • MYSQL速通(4/5)
  • KL Loss
  • Python OpenCV图像处理与深度学习:Python OpenCV图像滤波入门
  • [系统架构设计师]论文(二十三)
  • 基于SpringBoot+MYSQL开发的师生成果管理系统
  • 美术馆预约小程序|基于微信小程序的美术馆预约平台设计与实现(源码+数据库+文档)
  • zotero.sqlite已损坏
  • 第9篇:监控与运维 - 集成Actuator健康检查