1、说明
MCU:零知开源开发板
温湿度模块:SHT3X
开发工具:零知实验室软件开发工具
功能:测量环境的温度和湿度信息
2、硬件连接
将模块的SCL,SDA分别于零知标准板的 A5,A4, I2C接口连接即可。 3、核心代码 - /**
- * 使用SHT3X 模块测试温湿度信息
- */
-
- #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.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;
- }
复制代码
更多详细资料可到零知官免费获取。
|