STM32HAL库电子广告牌显示广告+温湿度+时间

  • 概述
  • 第一天进度
    • 材料采购
    • 1.新建KEIL工程
    • 2.软件编写
  • 第二天进度
    • 1.开始接线
    • 2.开始调试
  • 总结

概述

电子广告牌多用于显示一些简短的信息,像高铁显示行程等数据。在门市上常用于循环显示广告等功能,这次就使用STM32快速开发一个电子广告牌来帮助学长毕业啦!此电子广告牌显示的内容为:
(喜迎23级新生到校->2023年?月?日 当前天气气温?度湿度?%RH-> 恭喜19级学生顺利毕业!->2023年?月?日 当前天气气温?度湿度?%RH)
然后一直循环…

第一天进度

材料采购

元器件 number
MAX7219点阵模块 ¥75.4
STM32F103C8T6最小系统开发板 ¥14.5
JD3-33蓝牙模块 ¥6.0
DHT11温湿度传感器 ¥5.70
硅胶线30AWG ¥7.0

这些常用的元器件在某宝上就可以轻松找得到

1.新建KEIL工程

  • 先使用STM32CubeMX配置好基本时钟驱动,引脚驱动。

    注意:MAX7219驱动不仅可以使用GPIO直接驱动,还可以使用SPI进行更高的 速率驱动。这里使用哪个都可以。
  • 然后再配置好RTC实时时钟。这里时钟源的配置需要注意一下:

  • 选择外部晶振可能会不稳定,最终选用内部时钟源驱动。
  • 最后生成KEIL5的工程文件。

2.软件编写

其他模块的驱动就不用多说了。


/*** @brief 汉字循环滚动显示* @param*/
void roll_show_hz() {char time_buff[3];char hour_buf[4];char min_nuf[3];char sec_buf[2];char mon_buf[1];char month[1];   //字符串缓存区uint8_t times[4] ;uint8_t step;u8 i = 0;int  sx = 64;const char buc[] = "123456";char buf[] = "a_b_c_e_f_g_h_i_";    //欢迎新生char buf0[] = "--j_k_l_e_m_n_o_p_q_r_";                        //欢送老生u8 temp;u8 humidity=0;char temp_buf[1];char humidity_buf[1];u8 buf_temp[] = "z_a-b-c-c-d-";   //当前天气气温step = 0;   //显示的步数while (1) {i++;if (i % 20 == 0) {         Get_RTC_data(GetData, GetTime);  //获取系统实时时钟 temp = leddz_struct.temputure;humidity=leddz_struct.humidity;   //获取湿度times[0] = GetTime.Hours;times[1] = GetTime.Minutes;times[2] = GetTime.Seconds;if(!GetData.WeekDay){times[3] = 7;}else{times[3]=GetData.WeekDay;}sprintf(hour_buf, ":%2d:",times[0]);sprintf(month, "%d", times[3]);       sprintf(min_nuf, "%2d:", times[1]);sprintf(sec_buf, "%2d", times[2]);if (!step) {leddz_clear();leddz_show_fonthz_ex(sx, 0, buf);leddz_show_reflash();sx--;if (sx <=-17*8) {step = 1;sx = 16;};}if (step == 1) {leddz_clear();char _23  = GetData.Year;char date = GetData.Month;char day  = GetData.Date;  char num0[4], num1[2], num2[2];sprintf(num0, "20%d", _23);leddz_show_string(sx, 0, num0, 16);leddz_show_fonthz_ex(sx + 8 * 4, 0, "s_");         //年sprintf(num1, "%d", date);leddz_show_string(sx + 8 * 6, 0, num1, 16);leddz_show_fonthz_ex(sx + 8 * 7, 0, "t_");          //月sprintf(num2, "%d", day);leddz_show_string(sx + 8 * 9, 0, num2, 16);leddz_show_fonthz_ex(sx + 8 * 11, 0, "u_");         //日       leddz_show_reflash();  sx--;if (sx <= -13*8) { step = 2;   sx = 64;     };}if(step==2){leddz_clear();leddz_show_fonthz_ex(sx , 0, "z_a-b-c-c-d-");  //当前天气气温sprintf(temp_buf, "%d", temp);leddz_show_string(sx + 8 * 12, 0, temp_buf, 16);leddz_show_fonthz_ex(sx + 8 * 14, 0, "e-");         //度           leddz_show_fonthz_ex(sx+8*16, 0, "s-e-");  //添加湿度汉字sprintf(humidity_buf, "%d", humidity);leddz_show_string(sx + 8 *20,0, humidity_buf, 16);  leddz_show_string(sx + 8 * 22, 0, "%RH", 16);//度%RHleddz_show_reflash();  sx--;if (sx <= -22*8) { step = 3;  sx = 64;     };}                           if (step == 3) {              leddz_clear();leddz_show_fonthz_ex(sx, 0, "v_w_");                //时间leddz_show_string(sx +   8 *4, 0,   hour_buf, 16);        leddz_show_string(sx +  8 * 8, 0,  min_nuf, 16);          leddz_show_string(sx + 8 * 11, 0, sec_buf, 16);           leddz_show_fonthz_ex(sx + 8 * 13, 0, "x_y_");       //星期                            leddz_show_string(sx + 8 * 17, 0, month, 16);leddz_show_reflash();sx--;         if (sx <= -20*8) {        step = 4;              sx = 64;           };         }                     if (step == 4) {leddz_clear();leddz_show_fonthz_ex(sx, 0, buf0);    //恭喜顺利毕业leddz_show_reflash();sx--;if (sx <= -23*8) {step = 5;sx = 64;};}if (step == 5) {leddz_clear();char _23  = GetData.Year;char date = GetData.Month;char day  = GetData.Date;  char num0[4], num1[2], num2[2];sprintf(num0, "20%d", _23);leddz_show_string(sx, 0, num0, 16);leddz_show_fonthz_ex(sx + 8 * 4, 0, "s_");         //年sprintf(num1, "%d", date);leddz_show_string(sx + 8 * 6, 0, num1, 16);leddz_show_fonthz_ex(sx + 8 * 7, 0, "t_");          //月sprintf(num2, "%d", day);leddz_show_string(sx + 8 * 9, 0, num2, 16);leddz_show_fonthz_ex(sx + 8 * 11, 0, "u_");         //日                leddz_show_reflash();sx--;if (sx <= -13*8) {step =6;sx = 64;};            }if(step==6){leddz_clear();leddz_show_fonthz_ex(sx , 0, "z_a-b-c-c-d-");  //当前天气气温sprintf(temp_buf, "%d", temp);leddz_show_string(sx + 8 * 12, 0, temp_buf, 16);leddz_show_fonthz_ex(sx + 8 * 14, 0, "e-");         //度               leddz_show_fonthz_ex(sx+8*16, 0, "s-e-");  //添加湿度汉字sprintf(humidity_buf, "%d", humidity);leddz_show_string(sx + 8 *20,0, humidity_buf, 16);  leddz_show_string(sx + 8 * 22, 0, "%RH", 16);//度%RHleddz_show_reflash();  sx--;if (sx <= -22*8) { step = 7;  sx = 64;     };}           if(step==7){leddz_clear();leddz_show_fonthz_ex(sx, 0, "v_w_");     //时间leddz_show_string(sx + 8 *4, 0, hour_buf, 16);leddz_show_string(sx + 8 * 8, 0, min_nuf, 16);leddz_show_string(sx + 8 * 11, 0, sec_buf, 16);leddz_show_fonthz_ex(sx + 8 * 13, 0, "x_y_");     //星期leddz_show_string(sx + 8 * 17, 0, month, 16);leddz_show_reflash(); sx--;if (sx <= -18*8) {step = 0;sx = 64;};  }i = 0;HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);}delay_ms(1);}}
  • 程序很简单,就是堆上去的!
  • 时间的的更改,为了保证当前的时间是准确的,肯定要能够调节时间,不然每次上一次程序断电后就不准了!
    之前元器件采用到了蓝牙模块,那就派上了用场了。直接接收手机端蓝牙调试器发送过来的数据进行读取,然后就能够调节时间了!
    串口就配置成正常的异步通讯就行,我这里采用了DMA接收。

/*** @brief 串口重定向打印数据* @param ch* @param f* @return*/
int fputc(int ch, FILE* f) {HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xffff);return ch;}RTC_DateTypeDef SetData;   //设置日期结构体
RTC_TimeTypeDef SetTime;   //设置时间结构体
uint8_t buff[12];
char Data_data[14];
//  DMA加串口空闲中断
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{if(huart->Instance == USART1){static uint8_t i=0;char buff_data[1];HAL_UARTEx_ReceiveToIdle_DMA(&huart1,buff,sizeof(buff));//因为是normal模式再次开启DMA的空闲中断接受sprintf(buff_data,"%c",buff[0]);Data_data[i++]=atoi(buff_data);   if(buff[0]==0x72){i=0;for(uint8_t j=0;j<sizeof(Data_data);j++){Data_data[j]=0;}}SetData.Year=Data_data[0]*1000+Data_data[1]*100+Data_data[2]*10+Data_data[3];SetData.Month=Data_data[4]*10+Data_data[5];SetData.Date=Data_data[6]*10+Data_data[7];SetTime.Hours=Data_data[8]*10+Data_data[9];SetTime.Minutes=Data_data[10]*10+Data_data[11];SetTime.Seconds=Data_data[12]*10+Data_data[13];if(i>sizeof(Data_data)-1){Set_RTC_data(&SetData,&SetTime);printf("setting sucessfully!");step=0;i=0;}}HAL_UARTEx_ReceiveToIdle_DMA(&huart1,buff,sizeof(buff)); //串口1开启DMA接受
}
  • 通信协议的话直接采用例子:20200402122156 就是2020年4月2日12点21分56秒 stm32 会自动计算出星期几。

  • R就是复位按键

  • 注意:这里采用了atoi()函数将字符串转换为变量的值。由于手机端的串口调试器是将变量转换为字符串进行发送的。

  • 到这里第一天的的进度就差不多了。

第二天进度

1.开始接线

  • 刚好等到材料都到齐了,开始接线。
    MAX7219一共有五个引脚
引脚名称 功能
Vcc 电源正极(5V)
GND 电源地
DIN 数据输入端
CS 片选信号端(拉低使能)
CLK 时钟信号
  • 这三根信号线可以直接使用SPI来驱动
  • 把这些线依次与STM32 配置的引脚相对应接好就行了。

2.开始调试

  • 先检查每根线的波形是不是正确的,可以使用示波器观察。

  • 然后接上MAX7219调试细节部分。

总结

  • 此次意外接到的毕设让我在慌乱中抽出一点时间来完成,也祝愿学长顺利毕业吧!
  • 后续我将编写、制作更多的小制作供大家共同学习进步,前行路上欢迎一键三连,感谢各位大佬!
  • 最后附上源码工程:
  • 百度网盘: https://pan.baidu.com/s/1J1Btn-NyuARS4HNFKl8TZQ
  • 链接: ntl2

STM32HAL库电子广告牌显示广告+温湿度+时间设置相关推荐

  1. mt4服务器时间显示,mt4服务器时间设置

    mt4服务器时间设置 内容精选 换一换 在使用负载均衡服务时,确保至少有一台后端服务器在正常运行,可以接收负载均衡转发的客户端请求.如果请求的需求流量上升,用户需要向负载均衡器添加更多后端服务器处理需 ...

  2. STM32HAL库调用内部API却显示未定义解决方法

    STM32HAL库调用内部API却显示未定义解决方法 问题描述 在使用hal库进行开发时,碰到明明已经在项目管理里添加了STM32 hal库的驱动文件,并且头文件也已经添加了正确的路径,但是编译时仍然 ...

  3. 2021电赛F题智能送药小车方案分析(openMV数字识别,红线循迹,STM32HAL库freeRTOS,串级PID快速学习,小车自动返回)

    2021全国大学生电子设计竞赛F题智能送药小车 前提:本篇文章重在分享自己的心得与感悟,我们把最重要的部分,摄像头循迹,摄像头数字识别问题都解决了,有两种方案一种是openARTmini摄像头进行数字 ...

  4. STM32HAL库微秒延时(μs)

    STM32HAL库微秒延时(μs) 单片机:STM32F407ZET6 软件版本:STM32CubeMX 4.20.1 单片机固件包:STM32Cube FW_F4 V1.15.0 本代码是我于201 ...

  5. 【Android开发】范例2-开启新线程实现电子广告牌

    利用之前学过的多线程处理技术,我们做一个开启新线程实现电子广告牌的项目 界面布局文件,加入ImageView图片控件,用于显示一个图片,一个TextView控件,用于显示广告说明语. res/layo ...

  6. 交互式电子广告牌实现

    目录 一.实现流程 二.代码实现 三.效果展示 一.实现流程 1.首先要知道电子广告牌的宽度,类比现实生活中一格一格的显示屏,程序中使用空格代替: 2.需要设置时间间隔,广告语中每个字的停留时间: 3 ...

  7. 华为手机锁屏上显示广告遭用户吐槽 官方回应:不是我们干的

    据 Android Police 报道,近日有不少网友抱怨,华为数款手机的锁定屏幕上出现了广告. 据悉,所有广告都是来自Booking.com,疑似华为是将用户设定启用随机风景桌布置换成广告.这些广告 ...

  8. STM32HAL库-移植mbedtls开源库示例(一)

    目录 概述 一.使用方法 二.STM32CubeMx配置 三.Examples 四.运行结果 五.总结 概述 本篇文章介绍如何使用STM32HAL库,移植mbedtls开源库支持mqtt证书加密示例. ...

  9. STM32串口显示DHT11温湿度数据,YL-69土壤湿度

    用的控制器是STM32F103C8T6,如果你用STMF103的其他芯片来跑这个代码也能跑通,基本配置都是一样的. 先介绍DHT11温湿度数据的采集,有两个文件,一个DHT11.c,还有一个DHT11 ...

最新文章

  1. 深度学习学习指南-工具篇
  2. linux安装包文件格式,linux多种安装包格式的安装方法
  3. 60 SD配置-科目分配-分配总帐科目
  4. Oracle安装-------实例化EM 配置文件时出错问题 ( 转 )
  5. 光驱安装centos7系统过程_centos7可以ping通外网_可以ping通内网其他机器_但是其他机器就是ping不通centos7_太神奇了---linux工作笔记041
  6. 6.2创建Docker镜像文件
  7. C# - [实践] 电子词典
  8. 如何使用plink进行二分类性状的GWAS分析并计算PRS得分
  9. React-cra项目初始化 必做操作
  10. mysql sphinx windows安装_window下安装sphinx实例
  11. python在化工模拟中的应用_python完成模拟博客园登陆
  12. CSS实现3D正方体动态旋转效果【源码+GIF图】
  13. ansible一键部署zabbix并配置自动发现
  14. 丰田召回事件的深层次原因
  15. GUVV-T20GD-U 太阳光紫外线传感器TO-39U韩国GENICOM光电二极管杀菌灯监控
  16. 震网三代漏洞复现(CVE-2017-8464)
  17. i.MX RT开发笔记-02 | i.MX RT1062开发环境搭建(MDK芯片包、NXP SDK详解)
  18. JAVA中J2SE和J2EE和 J2me关系
  19. Spring cloud多模块开发下openFeign的使用,自动注入出现bean找不到问题解决
  20. Multi2Sim 5.0安装

热门文章

  1. 同一网段两个主机通信(交换机) 不同网段两个主机通信(路由器)
  2. Tomcat优化思路
  3. 信息系统基本知识(六)
  4. 电流镜自动布局 布局对称性: 量化和应用以消除非线性过程梯度
  5. 浅析贝叶斯神经网络(Based on Variational Bayesian)
  6. 什么是特征工程?如何进行特征工程?超详细解读
  7. 2021年流动式起重机司机考试题及流动式起重机司机证考试
  8. RRDTool中文手册
  9. Oscar-实验过程记录
  10. android 文件名编码,安卓删除纯乱码文件名的文件