/* ADT7470 address selection FOR 7470's PIN 11: High (10k to Vcc) = 010 1111 (0x5E left justified or 0x2F right justified) Low (10k to GND) = 010 1100 (0x58 left justified or 0x2C right justified) Float (none) = 010 1110 (0x5C left justified or 0x2E right justified) */ #include #DEFINE ADT_ADDR 0x58 #DEFINE ADT_ADDR_LOW 0x5E #DEFINE ADT_ADDR_FLOAT 0x58 #DEFINE ADT_ADDR_HIGH 0x5C //#DEFINE PIN_I2C 10 #DEFINE PIN_FULL 11 #DEFINE START_FULL 1 #DEFINE START_FULL_DURATION 1000 //how many sensors do we have? byte temp_numsensors = 10; //when was the temp taken? unsigned long temp_millis = 0; unsigned long temp_age () { return millis() - temp_millis; } //start measurements //wait 200ms per sensor in chain void temp_measure(bool delay = true) { //set register address 0x40 Bit[7] = 1 byte config = conf_get1(); Wire.beginTransmission(byte(ADT_ADDR)); Wire.write(byte(0x40)); if (enable) { bitSet(config,7); } else { bitClear(config,7); } Write.write(config); Wire.endTransmission(); //wait for 200ms * temp_numsensors if (delay) { delay(200*temp_numsensors); temp_millis = millis(); } else { temp_millis = millis() + 200*temp_numsensors; } //temps are ready } //get temp of specific byte temp_get (byte sensor) { //sensor 0 at 0x20 //sensor 9 at 0x29 if (sensor <= 9) { Wire.beginTransmission(byte(ADT_ADDR)); Wire.write(byte(0x20)+sensor); Wire.endTransmission(); Wire.requestFrom(byte(ADT_ADDR),1); if (1 == Wire.available()) return Wire.read(); } return 0; } void temp_getmax (void) { //read max TMP05 temperature Wire.beginTransmission(byte(ADT_ADDR)); Wire.write(byte(0x78)); Wire.endTransmission(); Wire.requestFrom(byte(ADT_ADDR),1); if (1 == Wire.available()) return Wire.read(); return 0; } void fans_full_speed (bool stuck) { //pull PIN_FULL low until cleared } void fans_full_speed_time (int ms) { //pull PIN_FULL low for ms } int fans_rpm (byte fan) { //page 23+24 //tach 0 low at 0x2A //tach 0 high at 0x2B if (fan <= 3) { Wire.beginTransmission(byte(ADT_ADDR)); Wire.write(byte(0x2A)+(fan*2)); Wire.endTransmission(); Wire.requestFrom(byte(ADT_ADDR),2); if (2 == Wire.available()) return ((unsigned int)Wire.read() << 8 ) + Wire.read(); } return 0; } void fans_setpct (int fan, byte pct) { fans_set(fan,pct/0.39); } void fans_set (int fan, byte duty) { //page 25 if (fan <= 3) { Wire.beginTransmission(byte(ADT_ADDR)); Wire.write(byte(0x32) + fan); Wire.write(duty); Wire.endTransmission(); } } //----configuration---- //get config register 1, 0x40 byte conf_get1 () { Wire.beginTransmission(byte(ADT_ADDR)); Wire.write(byte(0x40)); Wire.endTransmission(); Wire.requestFrom(byte(ADT_ADDR),1); if (1 == Wire.available()) return Wire.read(); else return 0; } //get config register 2, 0x74 byte conf_get2 () { Wire.beginTransmission(byte(ADT_ADDR)); Wire.write(byte(0x74)); Wire.endTransmission(); Wire.requestFrom(byte(ADT_ADDR),1); if (1 == Wire.available()) return Wire.read(); else return 0; } //page 30 + 36 void conf_monitor (bool enable) { //set 1 in bit0 of register 1 (0x40) to monitor all tachs and temps //typo? - set 0 in bit7??? of register 1 (0x40) to monitor all tachs and temps (pg7) byte config = conf_get1(); Wire.beginTransmission(byte(ADT_ADDR)); Wire.write(byte(0x40)); if (enable) { bitSet(config,0); } else { bitClear(config,0); //need verify cuz possible datasheet typo } Write.write(config); Wire.endTransmission(); } void conf_lowspeed (){} void conf_measure_tach (int tach, bool enable) { //page 36 } //----device---- byte device_id () { //get 0x3d, should be 0x70 Wire.beginTransmission(byte(ADT_ADDR)); Wire.write(byte(0x3d)); Wire.endTransmission(); Wire.requestFrom(byte(ADT_ADDR),1); if (1 == Wire.available()) return Wire.read(); else return 0; } byte device_company () { //get 0x3e, should be 0x41 Wire.beginTransmission(byte(ADT_ADDR)); Wire.write(byte(0x3e)); Wire.endTransmission(); Wire.requestFrom(byte(ADT_ADDR),1); if (1 == Wire.available()) return Wire.read(); else return 0; } byte device_revision () { //get 0x3f Wire.beginTransmission(byte(ADT_ADDR)); Wire.write(byte(0x3f)); Wire.endTransmission(); Wire.requestFrom(byte(ADT_ADDR),1); if (1 == Wire.available()) return Wire.read(); else return 0; } //----GPIO STUFF---- //page 8 //--------- void setup(void){ Wire.begin(); //join i2c as master //if start full speed fans } void loop(void){ }