kuroの覚え書き

96の個人的覚え書き

ArduinoでLM73温度計(LCD)



// LM73 pin layout
// +------------+
// |O O|<-SDA =>Arduino A4
// | =--= |
// GND->|O = = O|
// | =--= |
// VDD->|O C1 O|<-SCL =>Arduino A5
// | -||- |
// +------------+
// LM 73 (T731)

#include <LiquidCrystal.h>
#include <Wire.h>

#define LM73_ADDR 0x4c
// LiquidCrystal display with:
// rs on pin 12
// rw on pin 11
// enable on pin 10
// d4, d5, d6, d7 on pins 5, 4, 3, 2
// SC1602BS
// +--------+
// d7->|14 13|<-d6
// d5->|12 11|<-d4
// |10 9| VDD
// | 8 7| |
// enable->| 6 5|<-rw R
// rs->| 4 3|<-cont----+
// GND->| 2 1|<-VDD R
// +--------+ |
// GND
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

int ret;

void setup()
{
Wire.begin();
delay(500);

Wire.beginTransmission(LM73_ADDR);
Wire.send((byte)0x04);
Wire.send(0x60); // 14 bits mode
ret=Wire.endTransmission();

Wire.beginTransmission(LM73_ADDR);
Wire.send(0x00);
ret=Wire.endTransmission();
delay(100);
lcd.clear();
}

void loop()
{

int data=0 ;

Wire.beginTransmission(LM73_ADDR);
ret=Wire.requestFrom(LM73_ADDR, 2);

data = 0;
if (Wire.available()) {
data = Wire.receive();
} else {
lcd.print("Wire not available.");
}
if (Wire.available()) {
data = (data << 8 )| Wire.receive() ;
}

ret=Wire.endTransmission();

printdata(data);
delay(2000);

}
void printdata(int data){

int data2;
int data3;
float data_f;

boolean negative=false;

if (data < 0 ) {
negative=true;
data = -data;
}

data2 = data >> 7;

data_f = (float)(data >> 2 ) / 32;
data_f = data_f - data2 ;

data3 = data_f * 100 ;
lcd.clear();
lcd.home();
lcd.print ("Temp = ");
if (negative) {
lcd.print("-");
}
lcd.print(data2);
lcd.print(".");
lcd.print(data3/10);
lcd.print(data3 % 10);
lcd.print(" C ");
}


stand aloneで温度表示できるようにブレッドボードで組んでみた。

f:id:k-kuro:20091001232700j:image