Тема: MCP9800/1/2/3 - датчик температуры
Основная статья - http://rcl-radio.ru/?p=91031
Данный контент доступен только зарегистрированным пользователям.
#define ADDR 0x4D
#include <Wire.h>
void setup(){
Wire.begin();
Serial.begin(9600);
pinMode(2,INPUT);
pinMode(13,OUTPUT);
}
void loop(){
Serial.println(wire9800(26.0, 27.5, 12),4);
if(digitalRead(2)==HIGH){digitalWrite(13,HIGH);}else{digitalWrite(13,LOW);}
delay(1000);
}
float wire9800(float regL, float regH, byte bites){
byte minus;
/// TEMPERATURE LIMIT-SET REGISTER 9 BIT
if(regH<0){regH=abs(regH);minus=0b10000000;}else{minus=0b00;}
Wire.beginTransmission(ADDR);
Wire.write (0x02);
Wire.write (int(regH) + minus);
Wire.write ((int(regH*10)&0b01)<<7);
Wire.endTransmission();
/// TEMPERATURE HYSTERESIS REGISTER 9 BIT
if(regL<0){regL=abs(regL);minus=0b10000000;}else{minus=0b00;}
Wire.beginTransmission(ADDR);
Wire.write (0x03);
Wire.write (int(regL) + minus);
Wire.write ((int(regL*10)&0b01)<<7);
Wire.endTransmission();
/// CONFIGURATION REGISTER
Wire.beginTransmission(ADDR);
Wire.write (0x01);
Wire.write (0b00000000 + ((bites-9) << 5));
Wire.endTransmission();
/// AMBIENT TEMPERATURE REGISTER
Wire.beginTransmission(ADDR);
Wire.write (0x00);
Wire.endTransmission();
delay(10);
Wire.requestFrom(ADDR,2);
while(Wire.available()<2);
float value;
switch(bites){
case 9: value = Wire.read() + float(Wire.read()>>7)*0.5;break;
case 10: value = Wire.read() + float(Wire.read()>>6)*0.25;break;
case 11: value = Wire.read() + float(Wire.read()>>5)*0.125;break;
case 12: value = Wire.read() + float(Wire.read()>>4)*0.0625;break;
}
return value;
}