[原创] 【ST B-L475E-IOT01A1蓝牙Wi-Fi开发板】7-利用wifi向服务端发送温度等传感器数据

qiao---   2024-4-19 15:23 楼主

在上期测评中成功的用ISM43362模组连接到了手机热点,这期测评就用它向服务端发送我们之前已经测出来的数据。本期测评的代码均建立在上期测评的基础上。

 

我们上期测评链接到了手机wifi,这期测评我们可以用板子连接电脑的wifi,这样方便我们用电脑看板子的ip。代码还是和上期的一样。

image.png  

这里我用电脑观察到板子的ip如下所示:

image.png  

 

于是我用板子作为客户端,调用我们上期测评移植好的库,代码如下所示

image.png  

其中第一参数是封装的连接的句柄num,这里我选择1,方式为TCP连接,名字命名为“iot”,然后写上ipaddr和远程服务端的端口号和本地的端口号。

ipaddr为一个四个字节的数组,如下所示,这个根据自己的实际情况设置。

image.png  

这两部做好了以后可以打开网络调试助手看看能否通信

image.png     

这里我打算在主循环里循环发送字符串看看效果

image.png  

效果,服务端这边也是成功接收到了客户端发来的数据,如下所示:

VID_20240420_021454

 

接下来我打算用六轴传感器发送传感器的温度值和二轴的偏移角。

首先对传感器进行初始化,代码如下所示:

image.png  

	/*
   *  Initialize mems driver interface
   */
  lsm6dsl_ctx_t lsm6dsl_ctx;
  lsm6dsl_ctx.write_reg = platform_write;
  lsm6dsl_ctx.read_reg = platform_read;
  lsm6dsl_ctx.handle = &hi2c2;
  /*
   *  Check device ID
   */


	static axis3bit16_t data_raw;
	static axis3bit32_t acceleration_mg;
	static axis3bit32_t angular_rate_mdps;
	static axis1bit16_t temperature_deg_c;
	static uint8_t whoamI, rst;
	static uint8_t USBbuffer[1000];
	char str[50];
  lsm6dsl_device_id(&lsm6dsl_ctx, &whoamI);
	printf("%d\r\n",1);
	printf("%d",whoamI);
  if ( whoamI != LSM6DSL_ID )
    while(1); /*manage here device not found */
  /*
   *  Restore default configuration
   */
  lsm6dsl_reset_set(&lsm6dsl_ctx, PROPERTY_ENABLE);
	printf("%d\r\n",2);
  do {
    lsm6dsl_reset_get(&lsm6dsl_ctx, &rst);
  } while (rst);
  /*
   *  Set xl Full Scale
   */
  lsm6dsl_xl_full_scale_set(&lsm6dsl_ctx, FS_4g);
  /*
   *  Set gyro Full Scale
   */
  lsm6dsl_gyro_full_scale_set(&lsm6dsl_ctx, FS_2000dps);
  /*
   *  Enable Acc Block Data Update
   */
  lsm6dsl_block_data_update_set(&lsm6dsl_ctx, PROPERTY_ENABLE);
  /*
   * Set xl Output Data Rate
   */
  lsm6dsl_xl_data_rate_set(&lsm6dsl_ctx, XL_12Hz5);
  /*
   * Set gyro Output Data Rate
   */
  lsm6dsl_gyro_data_rate_set(&lsm6dsl_ctx, GY_26Hz);
  /*
   * Read samples in polling mode (no int)
   */
	 float xl_X,xl_Y,xl_Z;
	 float gy_X,gy_Y,gy_Z;

 

然后在while中不断解析数据,并向服务端发送数据,如下所示:

image.png  

			/* USER CODE END WHILE */
			lsm6dsl_status_reg_t status_reg;
			lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_STATUS_REG, (uint8_t *)&status_reg, 1);

			if (status_reg.gda)
			{
				lsm6dsl_angular_rate_raw(&lsm6dsl_ctx, &data_raw);
				angular_rate_mdps.i32bit[0] = FROM_FS_2000dps_TO_mdps( data_raw.i16bit[0] );
				angular_rate_mdps.i32bit[1] = FROM_FS_2000dps_TO_mdps( data_raw.i16bit[1] );
				angular_rate_mdps.i32bit[2] = FROM_FS_2000dps_TO_mdps( data_raw.i16bit[2] );
				gy_X = angular_rate_mdps.i32bit[0]  / 1000.0;
				gy_Y = angular_rate_mdps.i32bit[1] / 1000.0;
				gy_Z = angular_rate_mdps.i32bit[2] / 1000.0;
				sprintf((char*)USBbuffer, "GY:%lf\t%lf\t%lf\r\n", gy_X,
								gy_Y, gy_Z);
				printf("%s",USBbuffer);
				//CDC_Transmit_FS( USBbuffer, strlen((char const*)USBbuffer) );
			}

			if (status_reg.xlda)
			{
				lsm6dsl_acceleration_raw(&lsm6dsl_ctx, &data_raw);
				acceleration_mg.i32bit[0] = FROM_FS_4g_TO_mg( data_raw.i16bit[0] );
				acceleration_mg.i32bit[1] = FROM_FS_4g_TO_mg( data_raw.i16bit[1] );
				acceleration_mg.i32bit[2] = FROM_FS_4g_TO_mg( data_raw.i16bit[2] );
				xl_X =  acceleration_mg.i32bit[0] / 100.0;
				xl_Y =  acceleration_mg.i32bit[1] / 100.0;
				xl_Z =  acceleration_mg.i32bit[2] / 100.0;
				sprintf((char*)USBbuffer, "XL:%.3f\t %.3f\t %.3f\r\n", xl_X,
								xl_Y, xl_Z);
				printf("%s",USBbuffer);
				//CDC_Transmit_FS( USBbuffer, strlen( (char const*)USBbuffer) );
			}
			/*
			 * If the gyroscope is not in Power-Down mode, the temperature data rate
			 * is equal to 52Hz, regardless of the accelerometer and gyroscope
			 * configuration. (Ref AN5040)
			 */
			if (status_reg.tda)
			{
					lsm6dsl_temperature_raw(&lsm6dsl_ctx, &temperature_deg_c);
					temperature_deg_c.i16bit = FROM_LSB_TO_degC( temperature_deg_c.i16bit );

					sprintf((char*)USBbuffer, "temp:%3d\r\n", temperature_deg_c.i16bit);
					printf("%s",USBbuffer);
					WIFI_SendData(1, USBbuffer, a, &a, HAL_TIMEOUT);
					//CDC_Transmit_FS( USBbuffer, strlen( (char const*)USBbuffer) );
			}
			
			IMUupdate(gy_X,gy_Y,gy_Z,xl_X,xl_Y,xl_Z);
			sprintf(str,"pose calculating :%.3f\t\t%.3f\t\t \r\n",Pitch,Roll);
			printf("pose calculating :%.3f\t\t%.3f\t\t \r\n",Pitch,Roll);
			WIFI_SendData(1, str, a, &a, HAL_TIMEOUT);
			HAL_Delay(100);
    /* USER CODE BEGIN 3 */
  }

最后将代码烧录进板子里就OK了。

效果:

VID_20240420_021827

 

可以看到当我将板子进行翻转,服务端接受到的角度也在发生变化,并且和板子实际的角度挺相近的;温度也和我现在的室温差不多,传感器测得数据还是挺准确的。

 

总结:通过本期测评成功的将我们之前测得的温度等的传感器值通过tcp通信传到了服务端,这样如果我们自己做一个上位机,就可以用这套代码进行可视化展示了。通过板子测得数据经模组传输到服务端,传输的数据准确无误。

stm32L475_wifi_tcp.rar (77.52 MB)
(下载次数: 1, 2024-4-19 15:22 上传)
本帖最后由 qiao--- 于 2024-4-20 15:30 编辑

回复评论 (3)

再整套上位机就更加完美啦

点赞  2024-4-23 07:32
引用: Jacktang 发表于 2024-4-23 07:32 再整套上位机就更加完美啦

有道理,整C#

点赞  2024-4-23 14:36
引用: damiaa 发表于 2024-4-23 14:36 有道理,整C#

是的,上位机用这个很合适

 

点赞  2024-4-29 00:03
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复