
本文指出:SHT3X是一个很好的温度计。它使用I2C接口,以及地址0x44。它的驱动因素和原则很丰富,互联网上没有很多准备好的代码。我不能在这里解释太多。本文的主要功能是在先前的OLED驱动程序的前提下解释专用于对象的SHT31方法的过程。 1小心OLED驾驶员,我开始了I2C巴士,因此本文没有公交车司机。如果您使用SPI或其他方法显示数据,则需要添加I2C总线以启动它。实现2.1创建传感器的2个步骤,并在剪贴板打印中创建一个平台结构视图? 1.Typedef struct sensordevice {2.char *name; 3.Uint8_t slaveaddr; //从地址4.5.Float Temp; 6.嗡嗡声; 7.未签名的简短read_status; 8. Int(*热)(void); /*硬件初始化*/9.Void(*read)(Sensordevice结构*PTDEV); //阅读温度和水分10.}感觉eve, *psensordevice; 2.2 Cr首先吃drv_sensor.c在剪贴板上安装了lapcepopy视图吗? 1.静态Sensordevice GSHT31DEV = {2。 name =“ SHT31”,3。slaveaddr = 0x44,4。 //.init = sht3xdrvgpioinit,5。temp = 0,6。嗡嗡声= 0,7。 read_status = 0,8。 read = sht3x_read,9。}; 10.11。 struct sensordevice *sht31getDevice(void)12。{13。返回gsht31dev; 14.}下一步写入和接收plapopy的plapercopy视图中的夹板印记? 1.静态void i2c2waittxclt(void)2。{3.Uint16_t wtimeout = 1; 4.当(!gi2csxcplt wtimeout)5。{6.hal_delay(1); = false; 10.} 11.12.静态void i2c2waitrxcplt(void)13。{14.uint16_t wtimeout = 10; 15.当(!gi2c2rxcplt wtimeout)16。{17.hal_delay(1); 18.wtimeout-; 19. The temperature of the read and data is correct, write the CRC functionAs follows: See plaincopy on clipboardprint?1./*2.*@name crc_83.*@brief CRC-8 verification 4.*@param crc_ptr- Check first data address 5.Len- Check data length 6.*@retval crc_8 (uint8_t*crc_pt, uint8_t len) 9. CRC_VALUE = 0xff; 11.Uint8_t i = 0,j = 0; 12。20.ELSE21.CRC_VALUE=(CRC_VALUE 1); 22.} 23.} 24. return crc_value; 25。SHT31。剪贴板打印? 1.ptdev- read_status = 0; 7。printf(“ I2C1设备打开时的错误!rn”); 8。 9.}由于转换需要一些时间,因此需要延迟。延迟后,我一次读取6位数据。如果数据成功获得,我将进行CRC和Float转换。认罪成功后,将其放在结构中并更新状态:数据采集的完整代码如下:请参阅剪贴板上的Plaincopy? 1。静态void SHT3X_READ(结构sensordevice *ptdev)2。{3。 if(null == PTDEV)返回; 4。fsp_err_t err; 5。uint32_t temp_uint; 6。//写命令开始转换7。// 0xe000是从SHT30获取数据的指令。主机发送了这位讲师后,它开始读取SHT30 8的温度和水分数据。UINT8_Ttemp_array [6] = {0}; 9。UINT8_TCMD [] = {10。 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!= err)16。{17。 ptdev- read_status = 0; 18。printf(“ i2c1设备打开时的错误!rn”); 19。 20.}21。hal_delay(2); 22.23。 err = r_sau_i2c_read(g_sau_i2c_master_ctrl,temp_array,6,true); 24。I2C2WAITRXCPLT(); 25。if(fsp_success!= err)26。{27。 ptdev- read_status = 0; 28. printf(“ i2c1!rn时错误”设备打开); 29。后背;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 30.} 31。其他PA32。 {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-1位温度值37。Ptdev-temp =(((float)temp_uint)*0.267032-4500; //根据公式计算,为了准确性,首先计算值 *10038。 ptdev- = ptdev- tem*0.01; //除以100以获得正常温度值39.} 40.41 .//计算水分42.F(crc_8(temp_array [3],2)== temp_array [5])//执行CRC-8验证43。 //计算46.ptdev- hum =(uint8_t)(ptdev- hum*0.01); //除以100,以获得正常的水分量47.ptdev- read_status = 1; 48.} 49.50.51。如果获得温度,将显示数据,将显示温度和湿度。如果采集是错误,将显示可怕的。代码如下:请参阅剪贴板上的Plailcopy? 1。有效的LED_BLINK(动词)2。{3.4。 uartdevicesregister(); 5.6。 displayDevice *ptdispdev = oledgetDevice(); 7。if(null == ptdispdev)8。{9。 printf(“无法获得OLED显示器!rn”); 10。 11.}12。UINT8_TCNT; 13。Ptdispdev-热(PTDISPDEV); 14。ptdispdev- gui_set_horizo??ntal_mode(ptdispdev,0,128,0,64); 15。Sensordevice *ptsht31dev = sht31getDevice(); 16。if(null == ptsht31dev)17。{18。 printf(“无法获得SHT31!rn”设备; 19。 20.} 21。而(1)22。{23。 ptsht31dev-读(ptsht31dev); 24.25。如果(CNT 96)CNT = 0; 26。ptdispdev-gui_clear(ptdispdev,0); 27。if(1 == ptsht31dev- read_status)28。{29。 ptdispdev- gui_showstring(ptdispdev,10,16,(uint8_t *)“ temp:”,16,1); 30。ptdispdev-gui_shownum(ptdispdev,64,16,(int)ptsht31dev- temp,2,16,1); 31。ptdispdev-gui_showstring(ptdispdev,16,32,(uint8_t *)“ hum:”,16,1); 32。ptdispdev- gui_shownum(ptdispdev,64,32,(int)ptsht31dev- hum,2,16,1); 33.} 34。其他PA35。 {36。 ptdispdev- gui_showstring(ptdispdev,10,16,(uint8_t *)“ temp:error”,16,1); 37.}38。ptdispdev-gui_drawline(ptdispdev,0,0,cnt,0,1); 39。 40.41。 // hal_delay(1); 42。CNT++; 43.} 44.} 4实验影响5摘要使用面向对象的封装SHT31驱动程序。在Renesas FSP驱动程序中,可以快速实现驱动程序,并且仅需要驾驶员的接口才能实现低耦合操作。