零知开源分享-温湿度模块 SHT3X SHT30 SHT31 SHT35

1、说明
MCU:零知开源开发板
温湿度模块:SHT3X
开发工具:零知实验室软件开发工具
功能:测量环境的温度和湿度信息

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

零知开源分享-温湿度模块 SHT3X SHT30 SHT31 SHT35_第1张图片

3、核心代码

/**
*        使用SHT3X 模块测试温湿度信息        [url=http://www.lingzhilab.com]www.lingzhilab.com[/url]
*/
 
#include "HTU3X.h"
 
#define LED1        PA8
 
//Create an instance of the object
HTU3X 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, 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 
 
#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; 
}

4、测试结果

零知开源分享-温湿度模块 SHT3X SHT30 SHT31 SHT35_第2张图片

更多详细资料可到零知官网免费获取。

你可能感兴趣的:(硬件设计)