【腾讯连连IoT开发大赛】滑坡灾害监测设备

2021-01-11 09:13:50 浏览数 (3)

0 Introduction

不得不再次感叹一下,ddl是第一生产力!!

历经了7天的磨练,这个小东西终于被搞定了。

其实是每天下班后,还不想加班的我,回来完成一个小任务后开始躺尸。

看着群里面的大佬们每天在讨论H5啥啥啥的高端的玩意儿,总觉得自己菜的不行……

言归正传,鹅厂这次搞得【腾讯连连IoT开发大赛】不得不说是个特别好玩的东西

其实作为一个滑坡灾害监测设备的话,一般应该是安装在户外,也就是用4G或者NB-IoT的通讯方式更好。

でもね、手头目前缺少设备- -,就用了上次从鹅厂嫖到的TOS_EVB_G0开发板作为核心。

主要设备:

  • TOS_EVB_G0开发板(STM32G0核心 ESP8266通讯模块)
  • MIRAN拉绳式位移传感器
  • SCA100T倾斜度传感器

接下来是个全家福

小东西的全家福小东西的全家福

先上一个视频

视频内容

1 硬件工作准备

首先做好硬件开发准备工作,把传感器连接到核心板上,写好驱动代码,读取传感器数值。

1.1 位移传感器工作准备

位移传感器是一个三线制传感器,行程1000mm,供电5-10V(实测3V3工作正常,反正是个滑动变阻器……)

传感器基本上是线性的,所以用ADC读取后,可以直接用公式进行转换

位移传感器的接线位移传感器的接线

输出端口接到ADC1上,然后在软件中对ADC1进行配置

代码语言:c复制
  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc1.Init.LowPowerAutoWait = DISABLE;
  hadc1.Init.LowPowerAutoPowerOff = DISABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.NbrOfConversion = 1;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc1.Init.DMAContinuousRequests = DISABLE;
  hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_1CYCLE_5;
  hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_1CYCLE_5;
  hadc1.Init.OversamplingMode = DISABLE;
  hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }
  

然后驱动ADC1,读取数值,将其转换成实际位移

代码语言:c复制
//读取ADC的值,数据存放在param_dis_adc
HAL_ADC_Start(&hadc1);
HAL_Delay(1000);
printf("Distance:rn");
//获取adc的值
param_dis_adc=HAL_ADC_GetValue(&hadc1);
printf("adc value %d rn", param_dis_adc);
		
//将ADC的值转换为位移量
adcConvertedDist =(double)param_dis_adc*1000/4096;
printf("dist value %.2f mm rn", adcConvertedDist);

1.2 倾斜度传感器工作准备

倾斜度传感器选用的是SCA100T,这是一个SPI总线的倾斜度传感器

数字式传感器可以有效解决因为噪声导致的干扰

倾斜度传感器SCA100T倾斜度传感器SCA100T

在驱动了板载硬件SPI后,调试未果,便采用了模拟SPI时序的方法进行驱动

SCA100T—SPI时序图SCA100T—SPI时序图

以X轴加速度读取为例:

代码语言:c复制
CS_ONE();
tos_task_delay(4);
CS_ZERO();      //这一阶段开始读数据
tos_task_delay(4);

for(i=0; i<8; i  ){								
	Temp = RDA & 0X80;				
	RDA <<= 1;
	//开始加载数据
	if(Temp == 0x80){SDI_ONE();}
	else{SDI_ZERO();}				
	SCLK_ZERO();
	tos_task_delay(4);
	SCLK_ONE();				//时钟给定上升沿
	tos_task_delay(4);
}	
tos_task_delay(4);		
for(i=0; i<11; i  ){
	SCLK_ONE();			//数据在下降沿改变
	tos_task_delay(4);	
	SCLK_ZERO();																						
	tos_task_delay(4);
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7)){
		ACC_X <<= 1; ACC_X  = 1;
	}else{
		ACC_X <<= 1;
	}					
}	
CS_ONE();
tos_task_delay(4);

最后获得到当前的XY轴加速度,然后根据下面的公式进行换算

这里要吐槽一下编辑器不支持mathtype这里要吐槽一下编辑器不支持mathtype

其中

然后进行一个计算校准

代码语言:c复制
int miay;
miay = (ACC_Y-1024);
Angle_Y = ((float)miay/1638)*180.0/PI;
printf("Angle_Y = %.2frn", Angle_Y);

这里很奇怪的是,直接做减法后强制类型转换得到的结果值有错误……

所以用了个中间变量做转换……疑惑脸

0 人点赞