零知开源模块篇0-温湿度模块 SHT3X SHT30 SHT31 SHT35

1、说明

MCU:零知开源开发板-零知官方购买渠道:MCU:零知开源开发板

温湿度模块:SHT3X-零知官方购买:温湿度模块:SHT3X

开发工具:零知实验室软件开发工具-在【软件下载】页面下载

功能:测量环境的温度和湿度信息

2、硬件连接

将模块的SCL,SDA分别于零知标准板的A5,A4 I2C接口连接即可。

建好工程后输入以下代码:


							
	/**
	*        使用SHT3X 模块测试温湿度信息        www.lingzhilab.com
	*/
	#include "HTU3X.h"
	#define LED1        PA8
	//Create an instance of the object
	
	HTU3X myHumidity;
	void setup()
	
	{
	  Serial.begin(9600);
	  Serial.println("HTU21D Example!");
	  myHumidity.begin();
	}
	
	void loop()
	
	{
	        digitalWrite(LED1, HIGH);
	        delay(500);
	        digitalWrite(LED1, LOW);
	  float humd, temp;
	  myHumidity.readTempAndHumi(&temp, &humd);
	  Serial.print("时间:");
	  Serial.print(millis());
	  Serial.print(" 温度:");
	  Serial.print(temp, 1);
	  Serial.print(" °C");
	  Serial.print(" 湿度:"); 
	  Serial.print(humd, 1);
	  Serial.print("%");
	  Serial.println();
	  delay(1000);
	}
	
	
	/**
	*   file : HTU3X.H
	*/
	
	
	
	#if defined(ARDUINO) && ARDUINO >= 100
	#include "Arduino.h"
	#else
	#include "WProgram.h"
	#endif
	
	#include <SoftWire.h>
	#define HTU3X_ADDR 0x44  //Unshifted 7-bit I2C address for the sensor
	#define ERROR_I2C_TIMEOUT         2
	#define ERROR_BAD_CRC                    3
	
	
	
	#define CMD_MEAS_PERI_2_H   0x2236
	
	#define CMD_MEAS_CLOCKSTR_H 0x2C06
	
	
	
	class HTU3X {
	
	
	
	public:
	
	  HTU3X();
	
	
	
	  //Public Functions
	
	  void begin(SoftWire &wirePort = Wire); //If user doesn't specificy then Wire will be used
	
	  byte readTempAndHumi(float *temp, float *humi);
	
	
	
	  //Public Variables
	
	
	
	private:
	
	  //Private Functions
	
	  SoftWire *_i2cPort; //The generic connection to user's chosen I2C hardware
	
	
	
	  byte checkCRC(uint16_t message_from_sensor, uint8_t check_value_from_sensor);
	
	  byte readValue(uint16_t *res);
	
	
	
	  //Private Variables
	
	
	
	};
	
	
	
	/**
	
	*   file : HTU3X.cpp
	
	*/
	
	#include "HTU3X.h"
	
	
	
	HTU3X::HTU3X()
	
	{
	
	  //Set initial values for private vars
	
	}
	
	
	
	//Begin
	
	/*******************************************************************************************/
	
	//Start I2C communication
	
	void HTU3X::begin(SoftWire &wirePort)
	
	{
	
	  _i2cPort = &wirePort; //Grab which port the user wants us to use
	
	  
	
	  _i2cPort->begin();
	
	}
	
	
	
	#define MAX_WAIT 100
	
	#define DELAY_INTERVAL 10
	
	#define MAX_COUNTER (MAX_WAIT/DELAY_INTERVAL)
	
	
	
	//read 2-byte value with CRC from the HTU3X
	
	byte HTU3X::readValue(uint16_t *res)
	
	{
	
	
	
	  byte msb, lsb, checksum;
	
	
	
	  msb = _i2cPort->read();
	
	  lsb = _i2cPort->read();
	
	  checksum = _i2cPort->read();
	
	
	
	  uint16_t rawValue = ((uint16_t) msb << 8) | (uint16_t) lsb;
	
	
	
	  if (checkCRC(rawValue, checksum) != 0) 
	
	    return (ERROR_BAD_CRC); //Error out
	
	
	
	  *res = rawValue;
	
	
	
	  return true;
	
	}
	
	
	
	byte HTU3X::readTempAndHumi(float *temp, float *humi)
	
	{
	
	    //Request a humidity reading
	
	  _i2cPort->beginTransmission(HTU3X_ADDR);
	
	  uint16_t cmd = CMD_MEAS_CLOCKSTR_H;
	
	  _i2cPort->write(cmd>>8); //Measure value (prefer no hold!)
	
	  _i2cPort->write(cmd);
	
	  _i2cPort->endTransmission();
	
	  
	
	  delay(500);
	
	
	
	  _i2cPort->requestFrom(HTU3X_ADDR,6);
	
	
	
	  uint16_t rawTemp, rawHumi;
	
	  readValue(&rawTemp);
	
	  readValue(&rawHumi);
	
	
	
	  _i2cPort->endTransmission();
	
	
	
	  *temp = 175.0f * (float)rawTemp / 65535.0f - 45.0f; 
	
	  *humi = 100.0f * (float)rawHumi / 65535.0f; 
	
	
	
	}
	
	
	
	
	
	#define SHIFTED_DIVISOR 0x988000 //This is the 0x0131 polynomial shifted to farthest left of three bytes
	
	
	
	byte HTU3X::checkCRC(uint16_t message_from_sensor, uint8_t check_value_from_sensor)
	
	{
	
	  uint8_t bit;        
	
	  uint8_t crc = 0xFF;
	
	  uint8_t byteCtr;   
	
	   uint8_t data[2] = {message_from_sensor>>8, (uint8_t)message_from_sensor};
	
	  for(byteCtr = 0; byteCtr< 2; byteCtr++)
	
	  {
	
	          crc ^= (data[byteCtr]);
	
	          for(bit = 8; bit > 0; --bit)
	
	          {
	
	                  if(crc & 0x80)
	
	                          crc = (crc << 1) ^ 0x131;
	
	                  else           
	
	                          crc = (crc << 1);
	
	          }
	
	  }
	
	   
	
	  if(crc != check_value_from_sensor)
	
	          return 1;
	
	  else                                
	
	          return 0; 
	
	}
						
						

3、测试结果

4、完整工程

将该文件解压后放到IDE安装目录的stm32duino文件夹下面的stm32examples中【12.TempHumi】目录中,在开发工具中的示例12下面就可以从示例中看到该工程示例。
sht3x-lingzhilab.rar(点击下载)