
프로브 - 선(3개) - 모듈(VCC, GND, DAT) - 보드 (온도를 FND에 표현)
프로브에 열이 가해지면 저항값이 변함
-> 저항이 변하면서 전압이 변함
-> 변한 수치를 가지고 온도를 측정해냄

/** 사용코드 **/
OneWire ds(10); // on pin 10
/** OneWire 클래스 코드 - 생성자**/
OneWire::OneWire(uint8_t pin)
{
pinMode(pin, INPUT);
bitmask = PIN_TO_BITMASK(pin);
baseReg = PIN_TO_BASEREG(pin);
#if ONEWIRE_SEARCH
reset_search();
#endif
}
핀을 input 모드로 세팅
uint8_t OneWire::read_bit(void)
{
IO_REG_TYPE mask=bitmask;
volatile IO_REG_TYPE *reg IO_REG_ASM = baseReg;
uint8_t r;
noInterrupts();
DIRECT_MODE_OUTPUT(reg, mask);
DIRECT_WRITE_LOW(reg, mask);
delayMicroseconds(3);
DIRECT_MODE_INPUT(reg, mask); // let pin float, pull up will raise
delayMicroseconds(10);
r = DIRECT_READ(reg, mask);
interrupts();
delayMicroseconds(53);
return r;
}
// Read a byte
uint8_t OneWire::read() {
uint8_t bitMask;
uint8_t r = 0;
for (bitMask = 0x01; bitMask; bitMask <<= 1) {
if ( OneWire::read_bit()) r |= bitMask;
}
return r;
}
void OneWire::read_bytes(uint8_t *buf, uint16_t count) {
for (uint16_t i = 0 ; i < count ; i++)
buf[i] = read();
}
핀이 하나뿐인데 읽고 쓰고를 다할 수 있다는 것은 read를 할 때는 output 모드로 바꿔서
선 3개(DAT, GND, VCC)
int8_t == char
uint8_t == unsigned char
uint32_t == unsigned int
1. for (bitMask = 0x01; bitMask; bitMask <<= 1)
-> 00000001 << 1 = 00000010,..
for문은 8번을 돌아서 bitmask = 00000000 일때 종료
2. if ( OneWire::read_bit()) r |= bitMask;
r이 1이면 해당 번째 비트에 1이 켜짐
따라서 DAT에서 8Bit를 읽어서 r에 저장해서 r을 리턴하는 코드이다
read함수에서 r에 저장된 8비트를 buf에 저장함
void OneWire::write_bit(uint8_t v)
{
IO_REG_TYPE mask=bitmask;
volatile IO_REG_TYPE *reg IO_REG_ASM = baseReg;
if (v & 1) {
noInterrupts();
DIRECT_WRITE_LOW(reg, mask);
DIRECT_MODE_OUTPUT(reg, mask); // drive output low
delayMicroseconds(10);
DIRECT_WRITE_HIGH(reg, mask); // drive output high
interrupts();
delayMicroseconds(55);
} else {
noInterrupts();
DIRECT_WRITE_LOW(reg, mask);
DIRECT_MODE_OUTPUT(reg, mask); // drive output low
delayMicroseconds(65);
DIRECT_WRITE_HIGH(reg, mask); // drive output high
interrupts();
delayMicroseconds(5);
}
}
// write a byte
void OneWire::write(uint8_t v, uint8_t power /* = 0 */) {
uint8_t bitMask;
for (bitMask = 0x01; bitMask; bitMask <<= 1) {
OneWire::write_bit( (bitMask & v)?1:0);
}
if ( !power) {
noInterrupts();
DIRECT_MODE_INPUT(baseReg, bitmask);
DIRECT_WRITE_LOW(baseReg, bitmask);
interrupts();
}
}
void OneWire::write_bytes(const uint8_t *buf, uint16_t count, bool power /* = 0 */) {
for (uint16_t i = 0 ; i < count ; i++)
write(buf[i]);
if (!power) {
noInterrupts();
DIRECT_MODE_INPUT(baseReg, bitmask);
DIRECT_WRITE_LOW(baseReg, bitmask);
interrupts();
}
}

*오타 - PA3에 연결해주기