基于STM32的Lora无线抄表系统
目录
一、项目功能
二、视频演示
三、原理图
四、部分代码
五、设计资料
资料下载地址:基于STM32的Lora无线抄表系统
一、项目功能
基于LoRa的无线通信的电力抄表系统,采集节点数据,通过LoRa无线通信进行数据传输,最后再网关节点上显示。
二、视频演示
基于STM32的Lora无线抄表系统
三、原理图
主机原理图
从机原理图
四、部分代码
/*** @brief 串口X初始化函数* @param baudrate: 波特率, 根据自己需要设置波特率值* @note 注意: 必须设置正确的时钟源, 否则串口波特率就会设置异常.* 这里的USART的时钟源在sys_stm32_clock_init()函数中已经设置过了.* @retval 无*/
void usart_init(uint32_t baudrate)
{/*UART 初始化设置*/g_uart1_handle.Instance = USART_UX; /* USART_UX */g_uart1_handle.Init.BaudRate = baudrate; /* 波特率 */g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* 字长为8位数据格式 */g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* 一个停止位 */g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* 无奇偶校验位 */g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* 无硬件流控 */g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* 收发模式 */HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()会使能UART1 *//* 该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量 */HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); __HAL_UART_DISABLE_IT(&g_uart1_handle,UART_IT_TC);__HAL_UART_ENABLE_IT(&g_uart1_handle, UART_IT_RXNE);//使能接收中断__HAL_UART_ENABLE_IT(&g_uart1_handle,UART_IT_IDLE);//使能空闲中断HAL_NVIC_SetPriority(USART1_IRQn, 5, 0);HAL_NVIC_EnableIRQ(USART1_IRQn);__HAL_UART_CLEAR_IDLEFLAG(&g_uart1_handle);
}/*** @brief UART底层初始化函数* @param huart: UART句柄类型指针* @note 此函数会被HAL_UART_Init()调用* 完成时钟使能,引脚配置,中断配置* @retval 无*/
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{GPIO_InitTypeDef gpio_init_struct;if (huart->Instance == USART_UX) /* 如果是串口1,进行串口1 MSP初始化 */{USART_TX_GPIO_CLK_ENABLE(); /* 使能串口TX脚时钟 */USART_RX_GPIO_CLK_ENABLE(); /* 使能串口RX脚时钟 */USART_UX_CLK_ENABLE(); /* 使能串口时钟 */gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* 串口发送引脚号 */gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* 复用推挽输出 */gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* IO速度设置为高速 */HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct);gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* 串口RX脚 模式设置 */gpio_init_struct.Mode = GPIO_MODE_AF_INPUT; HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* 串口RX脚 必须设置成输入模式 */#if USART_EN_RXHAL_NVIC_EnableIRQ(USART_UX_IRQn); /* 使能USART1中断通道 */HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* 组2,最低优先级:抢占优先级3,子优先级3 */
#endif}else if (huart->Instance == ATK_MW1278D_UART_INTERFACE) /* 如果是ATK-MW1278D UART */{ATK_MW1278D_UART_TX_GPIO_CLK_ENABLE(); /* 使能UART TX引脚时钟 */ATK_MW1278D_UART_RX_GPIO_CLK_ENABLE(); /* 使能UART RX引脚时钟 */ATK_MW1278D_UART_CLK_ENABLE(); /* 使能UART时钟 */gpio_init_struct.Pin = ATK_MW1278D_UART_TX_GPIO_PIN; /* UART TX引脚 */gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* 复用推挽输出 */gpio_init_struct.Pull = GPIO_NOPULL; /* 无上下拉 */gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */HAL_GPIO_Init(ATK_MW1278D_UART_TX_GPIO_PORT, &gpio_init_struct); /* 初始化UART TX引脚 */gpio_init_struct.Pin = ATK_MW1278D_UART_RX_GPIO_PIN; /* UART RX引脚 */gpio_init_struct.Mode = GPIO_MODE_INPUT; /* 输入 */gpio_init_struct.Pull = GPIO_NOPULL; /* 无上下拉 */gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */HAL_GPIO_Init(ATK_MW1278D_UART_RX_GPIO_PORT, &gpio_init_struct); /* 初始化UART RX引脚 */HAL_NVIC_SetPriority(ATK_MW1278D_UART_IRQn, 0, 0); /* 抢占优先级0,子优先级0 */HAL_NVIC_EnableIRQ(ATK_MW1278D_UART_IRQn); /* 使能UART中断通道 */__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE); /* 使能UART接收中断 */__HAL_UART_ENABLE_IT(huart, UART_IT_IDLE); /* 使能UART总线空闲中断 */}
}/*** @brief 串口数据接收回调函数数据处理在这里进行* @param huart:串口句柄* @retval 无*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if (huart->Instance == USART_UX) /* 如果是串口1 */{if ((g_usart_rx_sta & 0x8000) == 0) /* 接收未完成 */{if (g_usart_rx_sta & 0x4000) /* 接收到了0x0d(即回车键) */{if (g_rx_buffer[0] != 0x0a) /* 接收到的不是0x0a(即不是换行键) */{g_usart_rx_sta = 0; /* 接收错误,重新开始 */}else /* 接收到的是0x0a(即换行键) */{g_usart_rx_sta |= 0x8000; /* 接收完成了 */}}else /* 还没收到0X0d(即回车键) */{if (g_rx_buffer[0] == 0x0d)g_usart_rx_sta |= 0x4000;else{g_usart_rx_buf[g_usart_rx_sta & 0X3FFF] = g_rx_buffer[0];g_usart_rx_sta++;if (g_usart_rx_sta > (USART_REC_LEN - 1)){g_usart_rx_sta = 0; /* 接收数据错误,重新开始接收 */}}}}}
}/*** @brief 串口X中断服务函数注意,读取USARTx->SR能避免莫名其妙的错误* @param 无* @retval 无*/
void USART_UX_IRQHandler(void)
{if((__HAL_UART_GET_FLAG(&g_uart1_handle,UART_FLAG_IDLE) != RESET)){ volatile uint32_t temp=0; __HAL_UART_CLEAR_IDLEFLAG(&g_uart1_handle);temp = g_uart1_handle.Instance->SR; temp = g_uart1_handle.Instance->DR; temp = 0; if(RS485_Uart1.Cnt >=4){RS485_Uart1.RcvFinish = 1;//HAL_NVIC_EnableIRQ (USART1_IRQn );}}if((__HAL_UART_GET_FLAG(&g_uart1_handle,UART_FLAG_RXNE) != RESET)){if(RS485_Uart1.Cnt >= 50) RS485_Uart1.Cnt=0;RS485_Uart1.Buf[RS485_Uart1.Cnt] = g_uart1_handle.Instance->DR;RS485_Uart1.Cnt++;}
五、设计资料
本设计有详细使用和说明文档,上手容易!!
基于STM32的Lora无线抄表系统相关推荐
- 基于STM32的无线抄表系统
目录 一.项目描述 二.原理图 三.实物 四.代码 六.论文 七.资料清单 资料下载地址:基于STM32无线抄表系统 一.项目描述 1.通过串口获取电表数据,并在OLED液晶上显示: 2. 通过ESP ...
- ZigBee无线抄表系统集中器设计
0 引言 随着城市居民住宅建设日益发展,独立电能表数量迅速增多,抄表计量也日趋复杂.近年来用电形势越来越紧张,分时电价已势在必行.由于长距离室内外的布线存在着短路.断线隐患,错综复杂的线路使系统调试和 ...
- 无线抄表系统服务器,无线抄表系统(CN201610173907.7)-中国专利【掌桥科研】
技术领域 本发明涉及无线信息传输领域,特别涉及一种智能抄表系统. 背景技术 传统的抄表系统一般由基表(如温度表.水表.气表等).采集器.集中器和服务器4大部分组成.其中,基表通过无线433或是470与 ...
- 无线抄表系统服务器,基于无线通信的远程抄表系统
摘要: 信息化时代的到来,使得以IT技术为主要特征的智能化建筑成为现代城市的一大特色,其中电能的计量,自动抄收以及收费管理是智能建筑,楼宇自动化的重要组成部分.如何实现电能的准确计量,自动抄收是影响电 ...
- 无线抄表与服务器,基于Modbus协议的远程无线抄表系统的设计与实现
摘要: 随着人民生活水平的日益提高,智能计量表在日常生活和工作中的使用越来越普及.但是传统人工抄表需要消耗大量的人力和物力,并且抄表人员需亲临现场或恶劣的环境,鉴于安全性和便捷性的考虑,远程智能抄表系 ...
- RS485远程无线抄表系统方案及工作原理Wireless Infrared Meter Reading controller
RS-485远程抄表系统是有线远程抄表系统,这类抄表方式适合于低压集中抄表,一般电表都有RS-485接口,这类抄表方案硬件便宜,适用于小区.写字楼等电表比较集中的地方. 远程抄表分为综合应用层,数据管 ...
- 无线抄表系统服务器,无线集中抄表系统设计与实现
摘要: 我国社会经济的发展,居民用电越来越普及,且用电量剧增,这需要更加合理化,精确化的电网管理.传统的小区采用人工上户抄表的方式,浪费大量人力物力,还容易引起漏抄,错抄,而且,由于用户较多,抄表员为 ...
- 基于flask的web集中抄表系统实现
响应国网加快推进泛在电力物联网建设的要求 现设计基于flask的集中抄表系统 使用python语言开发 导入socketio flask sqlite3 Echarts库 史上最简单的web抄表系统, ...
- LoRa无线抄表物联网解决方案
一.方案背景 在偏远地区的大型工厂中,电表水表数据的自动抄表有着重要的实用价值,准确.及时的数据传输直接影响到管理决策和经济效益. 传统的手工抄表费时费力,数据出现延迟和误差,没有可靠的保障,这导致了 ...
最新文章
- html表单颜色选择器,如何在Django管理中使用HTML5颜色选择器
- 【android-tips】如何在android应用中插入百度广告(附源码)
- hdu 5248(二分+贪心)
- JAVA中通过时间格式来生成唯一的文件名
- leetcode1338. 数组大小减半(贪心算法)
- .NET Web实时消息后台服务器推送技术-GoEasy
- 【课程作业】表达学习 人脸图像复原 实验记录
- Dijkstra算法求单源最短路径
- GIMP教程 1 图片剪裁
- Magicodes.IE已支持通过模板导出票据
- Java中IO流详细整合(含案例)
- android developer tiny share-20170603
- Geode中使用PDX序列化最佳实践
- 程序员找工作遇到的“了解、熟悉、精通”的三种技能要求实际上是这样的标准!
- 最后一个问题得到解决
- IDEA搜索关键字的快捷键
- LeetCode笔记:526. Beautiful Arrangement
- (四)Redis——搭建哨兵机制
- 帧数达不到144用144hz_为了“吃鸡”大出血 144Hz究竟是否必要
- 人群环境中基于深度强化学习的移动机器人避障算法
热门文章
- 计算机网络——共享式以太网
- 创新工场2014笔试算法题汇总
- 研报精选230512
- server 和 location 中的 root,和location语法
- Daniel J. Bernstein其人其事
- 软件过程各类模型详细介绍(重要)
- 大象php id移除技术,大象ID移除(切勿用于违法犯罪)
- 基于ROS搭建简易软件框架实现ROV水下目标跟踪(六)--电机模型文件
- Android media sistem,App Store 上的“Николай Стариков. Библиотека”
- python降维方法_机器学习数据降维方法总结(附python代码)