From af86e4122333624d02117574518523fb4c2777c1 Mon Sep 17 00:00:00 2001 From: ProjectPatatoe Date: Wed, 27 May 2020 16:01:58 -0700 Subject: [PATCH] preliminary adt7470 support --- adt7470.ino | 210 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100644 adt7470.ino diff --git a/adt7470.ino b/adt7470.ino new file mode 100644 index 0000000..c32d0a1 --- /dev/null +++ b/adt7470.ino @@ -0,0 +1,210 @@ + +/* +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){ + + +}