/*
* Read HH10D humidity sensor (http://www.sparkfun.com/products/10239)
* It contains a M24C02BN6 Eeprom with calibration values.
*
* Author: Patrik Hermansson, www.patrikhermansson.se
* Date: 110309
*
* Example calibration values:
* Sensitivity: 327
* Offset: 7499
*
* Connections:
* Vss - Gnd
* Vdd - +3.3V
* Fout - D5 (Mega168 pin 11)
* SDA - A4 (pin 27)
* SCL - A5 (pin 28)
*/
#include <Wire.h>
#include <FreqCounter.h> // http://interface.khm.de/index.php/lab/experiments/arduino-frequency-counter-library/
int rv = 0, offset;
float sens;
long int freq;
void setup() {
Wire.begin();
Serial.begin(38400);
Serial.println("Hi!");
readCalib(81,10);
sens = rv;
// Debug, test without I2C connection
//sens = 327;
Serial.print("Sensitivity: ");
Serial.println(sens);
readCalib(81,12);
offset=rv;
// Debug, test without I2C connection
//offset = 7499;
Serial.print("Offset: ");
Serial.println(offset);
delay(1000);
}
void loop() {
// Calculate frequency out from HH10D
FreqCounter::f_comp= 8; // Set compensation to 12
FreqCounter::start(1000); // Start counting with gatetime of 1000ms
while (FreqCounter::f_ready == 0) // wait until counter ready
freq=FreqCounter::f_freq; // read result
float RH = (offset-freq)*(sens/4096);
//int RH = (7499 - freq) * 0.09033203125;
Serial.print("Sens: ");
Serial.println(sens);
Serial.print("offset: ");
Serial.println(offset);
Serial.print("Humidity: ");
Serial.println(RH);
Serial.print("Freq: ");
Serial.println(freq);
Serial.print("offset-freq: ");
Serial.println(offset-freq);
Serial.print("sens/4096: ");
Serial.println(sens/4096);
Serial.print("offset-freq)*sens/4096: ");
Serial.println((offset-freq)*sens/4096);
delay(10000);
}
int readCalib( int deviceaddress, int calibAddress ) // deviceaddress is 1 according to datasheet
{
// Set address
Wire.beginTransmission(deviceaddress);
Wire.write(calibAddress);
Wire.endTransmission();
// Request return value
Wire.requestFrom(deviceaddress, 2);
// Collect return value
for (int c = 0; c < 2; c++ )
if (Wire.available()) rv = rv * 256 + Wire.read();
return rv;
}
Koden tycker att luftfuktigheten i rummet är 6-7% vilket inte känns rimligt. Det jag hittar som skiljer sig mot andras värden är kalibrationsvärdet sens som i mitt fall är 327, någon annan hade fått ett värde på 420 eller så. Borde vara detta som gör att min avläsning blir för låg?
Busenkelt och vad jag kunde se fungerade det bra.
Projektet har dock inte blivit av, men på testbänk under några timmar låg det rätt stadigt på typ 32%Rh
Jag hade kollat på I2C-bussen och utfrekvensen från sensorn att de adresser som skickas och svaren som kommer verkligen är samma som mjukvaran ger i från sig i andra änden. Pullup för bussen antar jag sitter på din Arduino?
Du menar att jag läser ut fel kalibreringsvärden?
Kollar på frekvensen ut från HH10D nu. Arduinoprogrammet säger ca 7419Hz, min DSO Nano säger samtidigt 7,42kHz. Så långt är det rätt i alla fall...
Ja för att avgöra om felet sitter i sensorns hårdvara eller om den skickar rätt värden på bussen som sedan blir manglade pga. konvertering eller fel byteordning i mjukvaran. Eller att fel adresser i eeprommet avläses eller att bussklockan inte är utanför vad det klarar.
Du borde snabbt och enkelt kunna se I2C-kommunikationen med ett digitaloscilloskop, Saleae eller Buspirate.