
本文的预约:SHT3X是一个极好的温度计。在0x44地址使用I2C接口。它的驱动因素和原则非常丰富,互联网上没有准备很多代码。我不会在这里解释太多。本文的主要特征是解释在前OLED控制器的前提下如何以对象为导向的SHT31的编程方法。 1 OLED控制器初始化I2C总线,因此本文没有总线控制器。如果将SPI或其他方法用于数据屏幕,则必须通过添加I2C总线来初始化它。 2实现步骤2.1创建传感器。 //从地址4.5.Float Temp; 6。 7.简介未集成read_status; 8. Int(*Init)(null); /*硬件初始化*/9. void(*read)(struct sensordevice*ptdev); //读取温度和湿度10。名称=“ SHT31”,3。slaveaddr = 0x44.4。 //.init = sht3xdrvgpioinit,5.mp = 0.6。嗡嗡声= 0.7。 read_status = 0.8。 read = sht3x_read,9。}; 10.11。结构SensordevicE *SHT31GetDevice(void)12。{13。返回gsht31dev; 14.}接下来,写出发送并显示等待时间函数[剪贴板打印中的plaincopy]? 1。静态void i2c2waittxcplt(void)2。{3.Uint16_t wtimaut = 1; 4。wheren(!gi2csxcplt wtimaut)5。{6.hal_delay(1); 7.wtime-out-; 8。 8。9.GI2TC2TC2TC2T= false; 10.} 11.12。静态void i2c2waitrxcplt(空)13。{14.Uint16_t wtimaut = 10; 15.Whion(!gi2c2rxcpltwtimaut)16。编写CRC函数,以查看读数温度和数据是否正确:在剪贴板的打印中显示简单的副本。 /*2./namecrc_83.@brief CRC-8验证4.*@param crc_ptr-验证第一个地址。 crc_8(uint8_t *crc_ptr,uint8_t len)9。{10.Uint8_t crc_value = 0xff; 11.Uint8_t i = 0,j = 0; 12.13。 (i = 0; i14。{15.crc_value ^= *(crc_ptr+i); 16.for(j); 16.for(j); 16.for(j = 0; j ++)17。{18.if(crc_value 0x80)19.crc_value =(crc_value =(crc_value =(crc_value 1) (crc_value 1);} 23.} 24. return crc_value;d_status = 0; sht3x_read(struct sensorkevice *ptdev)2。0x24.0x0011。}; 12。g_sau_i2c_master_ctrl.slave= ptdev- slaveaddr; 13。err = r_sau_i2c_write(g_sau_i2c_master_ctrl,cmd,2,true); 14。I2C2WAITTXCPLT(); 15。if(fsp_success!= er)16。{17。 ptdev- read_status = 0; 18。PRINTF(“打开I2C1!rn”设备的错误); 19.返回; 20.}二十个。 hal_delay(2); 22.23。 er = r_sau_i2c_read(g_sau_i2c_master_ctrl,temp_array,6,true); 24。I2C2WAITRXCPLT(); 25。if(fsp_success!= er)26。{27。 ptdev- read_status = 0; 28. printf(“打开I2C1!rn”设备的错误); 29。返回; 30.}31。Else32。 {33。 //计算温度34。if(crc_8(temp_array,2)== temp_array [2])//执行CRC-8验证35。{36。 temp_uint = temp_array [0]*256+temp_array [1]; //获得16位的温度值37。ptdev-temp =(((float)早期_UINT)*0.267032-4500; //根据手动公式计算。为了精确,将值首先计算为 *10038。 ptdev-早期= ptdev- temp*0.01; //正常温度值39.} 40.41 .//湿度42.if(temp_array [3],2)== temp_array [5])//执行CRC-8刚性43。temp_array[3]*256+temp_array [4]; // 16-1位的水分值45.ptdev-hum =(((float)temp_uint)*0.152590; // 46.ptdev-hum =(uint8_t)(ptdev-hum*0.01)醋。 //除以100,以获得正常的湿度值47.ptdev- read_status = 1; 48.} 49.50.51。 } 52.} 3数据显示测试代码在主函数中写入如下:一旦获得温度数据,显示温度和水分。如果恢复是一个错误,将显示出怪异。这是代码:您想在剪贴板的印象中显示platecopy吗? void red_blink(void)2。{3.4。 uartdevicesregister(); 5.6。 displayDevice *ptdispdev = oledgetDevice(); 7。if(null == ptdispdev)8。{9。 printf(“ OLED!rn屏幕”); 10); 10。返回; 11.}12。UINT8_TCNT; 13。PTDISPDDDEVINIT(PTDISPDDEV); 14。ptdispdev- gui_set_horizontal_mode(ptdispdev,0.128.0,64); 15。Sensordevice *ptsht31dev = sht31getDevice(); 16。if(null == ptsht31dev)17。{18。 printf(无法获得“ sht31!