1、說明
MCU:零知開源開發(fā)板
溫濕度模塊:SHT3X
開發(fā)工具:零知實(shí)驗(yàn)室軟件開發(fā)工具
功能:測(cè)量環(huán)境的溫度和濕度信息
2、硬件連接
將模塊的SCL,SDA分別于零知標(biāo)準(zhǔn)板的 A5,A4, I2C接口連接即可。 3、核心代碼 - /**
- * 使用SHT3X 模塊測(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("時(shí)間:");
- Serial.print(millis());
- Serial.print(" 溫度:");
- Serial.print(temp, 1);
- Serial.print(" °C");
- Serial.print(" 濕度:");
- Serial.print(humd, 1);
- Serial.print("%");
-
- Serial.println();
- delay(1000);
- }
復(fù)制代碼- /**
- * 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;
- }
復(fù)制代碼
更多詳細(xì)資料可到零知官免費(fèi)獲取。
|