零知开源模块篇1-温湿度模块 SHT2X SHT20 SHT21 SHT25

1、说明

MCU:零知开源开发板
温湿度模块:SHT2X
开发工具:零知实验室开发工具
功能:测量环境的温度和湿度信息

2、硬件连接

3、代码


							
	/**
	*        使用SHT2X 模块测试温湿度信息
	*/
	 
	#include "SparkFunHTU21D.h"
	 
	#define LED1        PA8
	 
	HTU21D myHumidity;
	 
	void setup()
	{
	  Serial.begin(9600);
	  Serial.println("HTU21D Example!");
	 
	  pinMode(LED1, OUTPUT);
	 
	  myHumidity.begin();
	}
	 
	void loop()
	{
	        digitalWrite(LED1, HIGH);
	        delay(500);
	        digitalWrite(LED1, LOW);
	         
	  float humd = myHumidity.readHumidity();
	  float temp = myHumidity.readTemperature();
	 
	  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);
	}
	 
	#if defined(ARDUINO) && ARDUINO >= 100
	#include "Arduino.h"
	#else
	#include "WProgram.h"
	#endif
	 
	#include <SoftWire.h>
	 
	#define HTU21D_ADDRESS 0x40  //Unshifted 7-bit I2C address for the sensor
	 
	#define ERROR_I2C_TIMEOUT         998
	#define ERROR_BAD_CRC                999
	 
	#define TRIGGER_TEMP_MEASURE_HOLD  0xE3
	#define TRIGGER_HUMD_MEASURE_HOLD  0xE5
	#define TRIGGER_TEMP_MEASURE_NOHOLD  0xF3
	#define TRIGGER_HUMD_MEASURE_NOHOLD  0xF5
	#define WRITE_USER_REG  0xE6
	#define READ_USER_REG  0xE7
	#define SOFT_RESET  0xFE
	 
	#define USER_REGISTER_RESOLUTION_MASK 0x81
	#define USER_REGISTER_RESOLUTION_RH12_TEMP14 0x00
	#define USER_REGISTER_RESOLUTION_RH8_TEMP12 0x01
	#define USER_REGISTER_RESOLUTION_RH10_TEMP13 0x80
	#define USER_REGISTER_RESOLUTION_RH11_TEMP11 0x81
	 
	#define USER_REGISTER_END_OF_BATTERY 0x40
	#define USER_REGISTER_HEATER_ENABLED 0x04
	#define USER_REGISTER_DISABLE_OTP_RELOAD 0x02
	 
	class HTU21D {
	 
	public:
	  HTU21D();
	 
	  void begin(SoftWire &wirePort = Wire); //If user doesn't specificy then Wire will be used
	  float readHumidity(void);
	  float readTemperature(void);
	  void setResolution(byte resBits);
	 
	  byte readUserRegister(void);
	  void writeUserRegister(byte val);
	 
	 
	private:
	  SoftWire *_i2cPort; 
	 
	  byte checkCRC(uint16_t message_from_sensor, uint8_t check_value_from_sensor);
	  uint16_t readValue(byte cmd);
	 
	 
	};
	 
	#include "SparkFunHTU21D.h"
	 
	HTU21D::HTU21D()
	{
	}
	 

	/*******************************************************************************************/
	void HTU21D::begin(SoftWire &wirePort)
	{
	  _i2cPort = &wirePort; 
	   
	  _i2cPort->begin();
	}
	 
	#define MAX_WAIT 100
	#define DELAY_INTERVAL 10
	#define MAX_COUNTER (MAX_WAIT/DELAY_INTERVAL)
	 
	uint16_t HTU21D::readValue(byte cmd)
	{
	  //Request a humidity reading
	  _i2cPort->beginTransmission(HTU21D_ADDRESS);
	  _i2cPort->write(cmd); //Measure value (prefer no hold!)
	  _i2cPort->endTransmission();
	   
	  byte toRead;
	  byte counter;
	  for (counter = 0, toRead = 0 ; counter < MAX_COUNTER && toRead != 3 ; counter++)
	  {
	    delay(DELAY_INTERVAL);
	 
	    toRead = _i2cPort->requestFrom(HTU21D_ADDRESS, 3);
	  }
	 
	  if (counter == MAX_COUNTER) return (ERROR_I2C_TIMEOUT); //Error out
	 
	  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
	 
	  return rawValue & 0xFFFC; 
	}
	 
	float HTU21D::readHumidity(void)
	{
	  uint16_t rawHumidity = readValue(TRIGGER_HUMD_MEASURE_NOHOLD);
	   
	  if(rawHumidity == ERROR_I2C_TIMEOUT || rawHumidity == ERROR_BAD_CRC) return(rawHumidity);
	 
	  float tempRH = rawHumidity * (125.0 / 65536.0); //2^16 = 65536
	  float rh = tempRH - 6.0; //From page 14
	 
	  return (rh);
	}
	/*******************************************************************************************/
	float HTU21D::readTemperature(void)
	{
	  uint16_t rawTemperature = readValue(TRIGGER_TEMP_MEASURE_NOHOLD);
	 
	  if(rawTemperature == ERROR_I2C_TIMEOUT || rawTemperature == ERROR_BAD_CRC) return(rawTemperature);
	 
	  float tempTemperature = rawTemperature * (175.72 / 65536.0); //2^16 = 65536
	  float realTemperature = tempTemperature - 46.85; 
	 
	  return (realTemperature);
	}
	 
	/*******************************************************************************************/
	void HTU21D::setResolution(byte resolution)
	{
	  byte userRegister = readUserRegister(); 
	  userRegister &= B01111110; 
	  resolution &= B10000001; 
	  userRegister |= resolution; 
	  writeUserRegister(userRegister);
	}
	byte HTU21D::readUserRegister(void)
	{
	  byte userRegister;
	  _i2cPort->beginTransmission(HTU21D_ADDRESS);
	  _i2cPort->write(READ_USER_REG); 
	  _i2cPort->endTransmission();
	 
	  _i2cPort->requestFrom(HTU21D_ADDRESS, 1);
	 
	  userRegister = _i2cPort->read();
	 
	  return (userRegister);
	}
	 
	void HTU21D::writeUserRegister(byte val)
	{
	  _i2cPort->beginTransmission(HTU21D_ADDRESS);
	  _i2cPort->write(WRITE_USER_REG); //Write to the user register
	  _i2cPort->write(val); //Write the new resolution bits
	  _i2cPort->endTransmission();
	}
	#define SHIFTED_DIVISOR 0x988000 //This is the 0x0131 polynomial shifted to farthest left of three bytes
	 
	byte HTU21D::checkCRC(uint16_t message_from_sensor, uint8_t check_value_from_sensor)
	{
	  uint32_t remainder = (uint32_t)message_from_sensor <<8; 
	  remainder |= check_value_from_sensor; 
	 
	  uint32_t divsor = (uint32_t)SHIFTED_DIVISOR;
	 
	  for (int i = 0 ; i < 16 ; i++) 
	  {
	    //Serial.print("remainder: ");
	    //Serial.println(remainder, BIN);
	    //Serial.print("divsor:    ");
	    //Serial.println(divsor, BIN);
	    //Serial.println();
	 
	    if ( remainder & (uint32_t)1 < (23 - i) ) 
	      remainder ^= divsor;
	 
	    divsor >>= 1; 
	  }
	 
	  return (byte)remainder;
	}
						
						

注:使用的库文件参照Arduino平台改写

4、测试结果

5、完整工程

将该文件解压后放到IDE安装目录的stm32duino文件夹下面,在开发工具中就可以从示例中看到该工程示例。

sht2x-lingzhilab.rar(点击下载)