1、说明
MCU:零知开源开发板
温湿度模块:SHT3X
开发工具:零知实验室软件开发工具
功能:测量环境的温度和湿度信息
2、硬件连接
将模块的SCL,SDA分别于零知标准板的 A5,A4, I2C接口连接即可。
3、测试 第一步:打开零知实验室开发工具,在温湿度检测可以看到SHT3X的示例程序 第二步:连接正确的串口,然后上传程序 第三步:打开调试窗口即可看到结果 从调试结果是可以看到温度和湿度都有在变化的,而且SHT3X这个模块比较灵敏哦,轻轻用手捂一下或轻吹一口气都可看到变化的。
3、核心代码 [C++] #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 <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;
}
|