温湿度传感器SHT20的驱动与使用

    最近公司里的一个小的项目:基于冰库的温度检测,采用无线通讯的方式,将采集到的温度信息传送给基站,基站通过UDP传输给上位机。

    实验平台

     编译软件: IAR Embedded Workbench for ARM version 6.40

                        KEIL Keil uVision4

      硬件平台:(1) 测温度标签: Nrf24LE1与SHT20  (2) 基站: STM32F107与NRF24LE1

     SHT20的驱动代码可以点击这里

     在原来网上找到的源码,发现IIC写寄存器的时候,有些偏差。因此自己参考了之前驱动ADXL345加速度传感器的模拟IIC程序,对写寄存器部分进行了优化。

以下是读取的函数,将该函数放在while(1)的循环里,即可实现对温度的读取。

float ReadSht20(char whatdo)
{
	float temp;
	uchar MSB,LSB;
	float Humidity;
	float Temperature;

	SET_Resolution();
	I2CStart(); 
	if(I2C_Write_Byte(SHT20ADDR&0xfe)==ACK) 
	{ 
		if(I2C_Write_Byte(whatdo)==ACK) 
		{
			do
			{
			Delay(6);
			I2CStart(); 
			}while(I2C_Write_Byte(SHT20ADDR
  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: sht31湿度传感器是一种数字湿度传感器,可以测量环境的度和湿度。C8T6是一种型号较老的单片机开发板,使用ATmega8芯片。下面是一个可能的SHT31湿度传感器驱动C8T6代码的示例: #include <avr/io.h> #include <util/delay.h> #include <stdint.h> // 定义SHT31传感器的I2C地址 #define SHT31_I2C_ADDR 0x44 // 初始化I2C总线 void i2c_init() { // 设置SCL和SDA引脚为输出模式 DDRD |= (1 << PD0) | (1 << PD1); // 设置TWI控制寄存器的预分频系数为1,设置SCL时钟频率为 400KHz TWSR &= ~(1 << TWPS0); TWSR &= ~(1 << TWPS1); TWBR = 0x0C; } // 启动I2C总线 void i2c_start() { TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); } // 发送I2C设备地址和读写模式 void i2c_send_addr(uint8_t addr, uint8_t rw) { TWDR = addr | rw; TWCR = (1 << TWINT) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); } // 发送数据 void i2c_send_data(uint8_t data) { TWDR = data; TWCR = (1 << TWINT) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); } // 读取数据 uint8_t i2c_read_data() { TWCR = (1 << TWINT) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); return TWDR; } // 停止I2C总线 void i2c_stop() { TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN); _delay_us(50); } // 从SHT31读取度值 float sht31_read_temperature() { // 启动I2C总线 i2c_start(); // 发送传感器的I2C地址和读模式位 i2c_send_addr(SHT31_I2C_ADDR, 0x01); // 等待传感器完成度和湿度测量 _delay_ms(50); // 读取度数据 uint8_t msb = i2c_read_data(); uint8_t lsb = i2c_read_data(); // 停止I2C总线 i2c_stop(); // 计算度值 float temperature = ((msb << 8) | lsb) * 175.0 / 65535.0 - 45.0; return temperature; } // 从SHT31读取湿度值 float sht31_read_humidity() { // 启动I2C总线 i2c_start(); // 发送传感器的I2C地址和读模式位 i2c_send_addr(SHT31_I2C_ADDR, 0x01); // 等待传感器完成度和湿度测量 _delay_ms(50); // 读取湿度数据 uint8_t msb = i2c_read_data(); uint8_t lsb = i2c_read_data(); // 停止I2C总线 i2c_stop(); // 计算湿度值 float humidity = ((msb << 8) | lsb) * 100.0 / 65535.0; return humidity; } 以上代码是一个简单的SHT31湿度传感器驱动代码示例,可以在C8T6开发板上读取度和湿度数值。使用I2C通信协议与传感器进行通信,获取湿度数据,并进行计算转换。需要注意的是,在使用代码前,需要将C8T6开发板上的SCL和SDA引脚连接到SHT31湿度传感器的对应引脚上。 ### 回答2: SHT31湿度传感器是一种广泛应用于物联网和环境监测等领域的传感器。其驱动代码将根据不同的硬件平台和编程语言而有所不同。下面以C语言为例,展示一个简单的SHT31湿度传感器在C8T6开发板上的驱动代码: ```c #include <Wire.h> // 包含I2C库 #define SHT31_ADDR 0x44 // 传感器I2C地址 void setup() { Serial.begin(9600); // 初始化串口 Wire.begin(); // 初始化I2C总线 delay(100); // 延时等待传感器稳定 } void loop() { float temperature, humidity; Wire.beginTransmission(SHT31_ADDR); // 启动传输 Wire.write(0x2C); // 度和湿度读取命令 Wire.write(0x06); // 高精度模式 Wire.endTransmission(); delay(500); // 等待传感器测量 Wire.requestFrom(SHT31_ADDR, 6); // 从传感器读取数据 if(Wire.available() == 6){ uint16_t rawTemp = Wire.read() << 8; rawTemp |= Wire.read(); uint16_t rawHumidity = Wire.read() << 8; rawHumidity |= Wire.read(); Wire.read(); Wire.read(); temperature = -45 + (175 * (float)rawTemp / 65535); humidity = 100 * (float)rawHumidity / 65535; Serial.print("Temperature: "); Serial.print(temperature); Serial.print(" °C, Humidity: "); Serial.print(humidity); Serial.println(" %"); } delay(2000); // 等待2秒后重新进行测量 } ``` 这段代码使用了Wire库进行I2C通信,首先初始化了串口和I2C总线,在主循环里使用I2C读取湿度数据,然后进行数据处理和打印输出。 需要注意的是,SHT31湿度传感器的I2C地址为0x44,读取的命令为0x2C,采用高精度模式。具体的硬件平台和传感器连接方式可能会有所不同,请根据具体情况进行相应的修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值