210 lines
4.9 KiB
C++
210 lines
4.9 KiB
C++
|
|
/*
|
|
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 <Wire.h>
|
|
|
|
#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){
|
|
|
|
|
|
}
|