【Nano应用作品】RT-Thread智能小区车位管理系统的实现

本文作者:

郑振耀(和他一起加入Nano学习QQ群:1033226005)

原文链接:

https://www.rt-thread.org/qa/thread-424254-1-1.html

简介

这个作品实现了一个基于STM32的车位管理系统,初步实现了以下功能:智能控制栏杆、烟雾警报、实时车位状态信息显示、推荐停车位、停车计时、进出车辆检测计数、车牌识别、上位机的实时显示时间、上位机记录车辆进出时间。(源码已公开请点击阅读原文下载)

视频演示

前期准备

上位机是使用LabVIEW软件进行设计编辑的,它用来进行无线传输信息并进行处理显示。

上位机界面如下:

硬件的连接实物图如下:

硬件有:6个红外蔽障模块、2个SG90舵机、2个OV7725摄像头、1个烟雾传感器模块、1个TFT液晶屏、1个ESP8266、1块STM32f103ZET6最小系统模块。

软件设计

作品的软件设计使用RT-Thread系统,线程之间通讯采用了:信号量、消息队列、事件集;本作品也使用了二个软件定时器,一个用于检测模块的状态,另一个是用于更新车位信息。

作品的程序流程如下图:

如图可得,系统所需的线程通讯方式以及软件定时器,因此我定义了以下几种线程通讯方式和软件定时器的控制指针:

 1在Parking_detection_processing.c中定义:
 2static rt_mq_t button_mq = RT_NULL;//消息队列的控制块
 3
 4在Task.c中定义:
 5static rt_timer_t Inspection_ProcessSoftTimer = RT_NULL;//软件定时器控制块指针
 6static rt_thread_t message_thread;//定义线程控制块指针
 7
 8在config.h中定义:
 9EXT rt_sem_t exit_recv_sem;//定义出口信号量控制块指针
10EXT rt_sem_t entr_recv_sem;//定义入口信号量控制块指针
11EXT rt_event_t Inspection_event;//定义事件控制块指针
12EXT rt_timer_t In_ProcessSoftTimer;//软件定时器控制块指针

从图中还可以知道作品的程序中要创建6个线程,我定义了以下6个线程入口函数:

1static void      IWDG_thread_entry     (void *parameter);//看门狗线程入口函数
2static void      Event_thread_entry    (void *parameter);//切换成车位信息显示的线程入口函数
3static void      exit_thread_entry     (void *parameter);// 有车要驶出的线程入口函数
4static void      entr_thread_entry     (void *parameter);// 有车要驶入的线程入口函数
5static void      WIFI_thread_entry     (void *parameter);//连接WIFI、本地服务器的线程入口函数
6
7void button_thread_entry(void *parameter)//用户消息处理入口函数
8

由于红外蔽障模块和烟雾传感器模块的使用与按键方式一样,因此这里采纳了何老师的按键消抖方法。(Nano入门视频QQ群:1033226005)

综上所述,我要创建的线程、及线程通讯方式以及软件定时器的具体情况就一目了然了。其中连接WIFI、本地服务器的线程入口函数采用有限次循环模式,其余线程入口函数采用无限循环模式。(源码已公开请点击阅读原文下载)

心得体会

在此,我讲一下为什么其中在调用车位检测以及车位信息更新函数的定时器需要暂停?

这是因为车位检测以及车位信息更新函数中滞留车辆数目与累计使用车位(含已被推荐)进行比较,如果滞留车辆数目小于累计使用车位(含已被推荐)时会进行推荐车位的标记清除掉一部分使得两者相等。由于有车要驶入的线程入口函数中要推荐停车位时(推荐停车位是在车牌识别结束后显示给车主看),而滞留车辆数目还未增加(滞留车辆数目增加是在舵机升起后增加),此时调用车位检测以及车位信息更新函数就会把之前推荐车位的标记清除了,因此需要合理对该定时器短暂的暂停。这个目的是为了防止有车辆不按照推荐停车位停放,而导致车位浪费。

这是我第一次使用RT-Thread系统进行开发,很直观的感受到了使用操作系统的好处:相对于裸机的代码编辑的逻辑相对要简单,要清晰明了。

在移植过程中也碰到了一些小问题,在此分享一下心得:

1.线程创建时给予的栈大小不够,导致系统崩溃

2.LCD_Init 放在sysinit中调用,导致系统卡死。因为LCD_Init()初始化函数中包含rt_thread_mdelay()函数,而在rt_thread_mdelay()函数中包含系统调度,所以如果将LCD_Init 放在sysinit中调用。而sysinit是在board.c中调用,此时操作系统调度器未启用,而使用rt_thread_mdelay()函数,导致卡死。

原创征稿活动:参与即有机会赢得,RT-Thread T恤、笔记本、技术书籍、京东卡、RT-Thread能力认证优惠券等  

参与入口:https://www.rt-thread.org/qa/thread-424281-1-1.html

你可以添加微信17775982065为好友,注明:公司+姓名,拉进 RT-Thread 官方微信交流群!

RT-Thread


让物联网终端的开发变得简单、快速,芯片的价值得到最大化发挥。Apache2.0协议,可免费在商业产品中使用,不需要公布源码,无潜在商业风险。

长按二维码,关注我们

点击阅读原文,进入RT-Thread 论坛

你点的每个“在看”,我都认真当成了喜

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值