1

Тема: MCP9800/1/2/3 - датчик температуры

Основная статья - http://rcl-radio.ru/?p=91031

Данный контент доступен только зарегистрированным пользователям.

http://forum.rcl-radio.ru/uploads/images/2020/12/c230d032ca8e37796de7131b2fb8daec.png

#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;
  }