LoRa开发与应用之路八

利用一个完整的示例介绍lora的真实应用过程
摘要由CSDN通过智能技术生成

LoRa 智慧牧场项目集成开发

在前面的课程内容当中,我们已经学习完了一整套 LoRa 开发的过程,并且在前面一节实现了基于时分复用 MAC 协议的自组网络设计,可以说已经具备了 LoRa 集成开发的基础。为了更加巩固我们所学习的成果,我们就拿应用比较多的智慧牧场项目来真正将我们所学习的内容应用在实操上。

开始设计智慧牧场项目之前,我们回顾一下之前学习的 LoRa 自组网络设计的步骤。传输数据确定 → LoRa PingPang 系统 → LoRa 透传系统 → LoRa 自组网。我们可以模仿这个步骤,先规划一下智慧牧场项目我们大概需要以下几步:数据采集 → 数据发送 → 数据接收处理 → 闭环控制。

体征数据采集

需求分析及传感器原理

需求分析——如何获取奶牛计步信息?

采集传感器——六轴运动处理传感器 MPU6050

三轴加速度测量原理:加速度测量计反应的加速向量与当前的受力方向是相反,单位为 g。

三轴陀螺仪测量:陀螺仪,是用来测量角速度的,单位为度每秒(deg/s)。

MPU6050 是使用 IIC 进行数据传输的,其初始化过程如下:

读取加速度初始值过程如下:

读取加速度数据过程如下:

功能配置及源码分析

首先我们需要打开 .ioc 文件,对 STM32 芯片的 IIC 通信接口进行配置。查询原理图可知,芯片的 PB8(SCL)和 PB7(SDA)是 IIC 的数据引脚。

然后生成代码即可。

在项目工程的 User 文件夹里面新建一个 Sensor 文件夹,将 MPU6050 传感器的配置代码放在里面。

  1. /* mpu6050 */  
  2. #include "mpu6050.h"  
  3. #include "string.h"  
  4. #include "stdio.h"  
  5. #include "i2c.h"  
  6. int16_t Accx,Accy,Accz;  
  7.   
  8. // 初始化MPU6050  
  9. void InitMpu6050(void){  
  10.   uint8_t WriteCmd = 0;  
  11.   //解除休眠状态  
  12.   WriteCmd = 0x00;  
  13.   HAL_I2C_Mem_Write(&hi2c1, ADDRESS_Write, PWR_MGMT_1, I2C_MEMADD_SIZE_8BIT, &WriteCmd, 1, 0x10);  
  14.   //时钟速率0x06(1Khz)陀螺仪采样率0x07(125Hz)  
  15.   WriteCmd = 0x07;  
  16.   HAL_I2C_Mem_Write(&hi2c1, ADDRESS_Write, SMPLRT_DIV, I2C_MEMADD_SIZE_8BIT, &WriteCmd, 1, 0x10);        
  17.   WriteCmd = 0x06;  
  18.   HAL_I2C_Mem_Write(&hi2c1, ADDRESS_Write, CONFIG, I2C_MEMADD_SIZE_8BIT, &WriteCmd, 1, 0x10);  
  19.   //不自检,2000deg/s  
  20.   WriteCmd = 0x18;  
  21.   HAL_I2C_Mem_Write(&hi2c1, ADDRESS_Write, GYRO_CONFIG, I2C_MEMADD_SIZE_8BIT, &WriteCmd, 1, 0x10);  
  22.   //(不自检,2G,5Hz)  
  23.   WriteCmd = 0x01;  
  24.   HAL_I2C_Mem_Write(&hi2c1, ADDRESS_Write, ACCEL_CONFIG, I2C_MEMADD_SIZE_8BIT, &WriteCmd, 1, 0x10);  
  25.   HAL_Delay(10);  
  26.   mpu6050_verify(&Accx, &Accy, &Accz); //读取第一次的值  
  27. }  
  28.   
  29. // MPU6050校验  
  30. void  mpu6050_verify(int16_t *x, int16_t *y, int16_t *z){  
  31.   uint8_t ReadBuffer[10] = {0};  
  32.   HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_XOUT_L, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[0],1, 0x10);  
  33.   HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_XOUT_H, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[1],1, 0x10);    
  34.         *x = (ReadBuffer[1]<<8)+ReadBuffer[0];  
  35.   HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_YOUT_L, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[0],1, 0x10);  
  36.   HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_YOUT_H, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[1],1, 0x10);    
  37.         *y = (ReadBuffer[1]<<8)+ReadBuffer[0];  
  38.   HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_ZOUT_L, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[0],1, 0x10);  
  39.   HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_ZOUT_H, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[1],1, 0x10);    
  40.         *z = (ReadBuffer[1]<<8)+ReadBuffer[0];  
  41. }  
  42.   
  43. // MPU6060获取三轴数据  
  44. void  mpu6050_ReadData(float *Mx, float *My, float *Mz){  
  45.   int16_t x,y,z;  
  46.   uint8_t ReadBuffer[10] = {0};  
  47.   HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_XOUT_L, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[0],1, 0x10);  
  48.   HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_XOUT_H, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[1],1, 0x10);    
  49.   x = (ReadBuffer[1]<<8)+ReadBuffer[0];  
  50.   x -= Accx;  
  51.   *Mx = ((float)x)/16384;  
  52.   HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_YOUT_L, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[0],1, 0x10);  
  53.   HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_YOUT_H, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[1],1, 0x10);    
  54.   y = (ReadBuffer[1]<<8)+ReadBuffer[0];  
  55.   y -= Accy;  
  56.   *My = ((float)y)/16384;  
  57.   HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_ZOUT_L, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[0],1, 0x10);  
  58.   HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_ZOUT_H, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[1],1, 0x10);    
  59.   z = (ReadBuffer[1]<<8)+ReadBuffer[0];  
  60.   z -= Accz;  
  61.   *Mz = ((float)z)/16384;  
  62. }  

更多有关 MPU6050 的配置可以查阅数据手册来理解。

然后我们需要在 main.c 当中对数据读取进行配置:定义全局变量 Mx、My、Mz,初始化 IIC,初始化 MPU6050,然后每两秒钟读取一次加速度值即可。

  1. float Mx,My,Mz;  
  2. ...  
  3. int main(void){  
  4.   MX_I2C1_Init();  
  5.   InitMpu6050();  
  6.   ...  
  7.   while(1){  
  8.     ...  
  9.     mpu6050_ReadData(&Mx,&My,&Mz);    
  10.     printf("Mx = %.3f\n",Mx);  
  11.     printf("My = %.3f\n",My);  
  12.     printf("Mz = %.3f\n",Mz);  
  13.     ...  
  14.   }  
  15.   ...  
  16. }  

实验现象:

将传感器安装在奶牛腿上,其体征数据会每两秒返回一次,主机可获得接收并通过串口助手打印出来。

饲养环境采集

需求分析及传感器原理

需求分析——如何获取牛舍温湿度信息?

采集传感器——DHT11 数字式空气温湿度传感器

DHT11 数据传输原理:一次完整的数据传输为 40 bit,高位先出

8bit 湿度整数数据+ 8bit 湿度小数数据;

8bit 温度整数数据+ 8bit 温度小数数据;

8bit 校验和。

由于 DHT11 是单总线协议传输数据,所以是通过高低电平持续的时间长短来进行数据的传输。

启动采集的过程:

获取数据的过程:

数字 0 信号的高低电平状态:

数字 1 信号的高低电平状态:

功能配置及源码分析

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Citric度

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值