본문 바로가기
임베디드

[오제이 튜브의 임베디드 강의] 23강. 온도센서를 붙여보자!

by 덤더리덤떰 2025. 1. 26.

1. 온도센서

: 쇠부분에 열이 가해지면 저항 값이 변함으로 인해서 내가 측정할 수 있는 전압값이 변하게 됨

=> 이 변환 수치로 온도 측정

ex) 프로브에 100도 열을 가하면 저항이 어느정도 변하므로 전압값도 어느정도 변하겠구나 예측 

 

1-1. 기존의 온도 측정 방법

: 데이터를 받아서 회로 구성 후 우리 보드에서 ADC(아날로그 -> 디지털) 통해 전압값이 얼마나 변하는지 정보 get

-> 이 전압은 몇 도에 해당하는지에 대한 테이블이 존재 

ex) 전압이 3.3V가 정상인데 3.2V로 변했을 때 온도는 몇도? 인지에 대한 테이블 존재 

 

1-2. 우리 온도센서 측정방법

: 온도센서의 프로브와 전선 세가닥이 있을 때 이 세가닥과 모듈(위 사진의 초록색 네모)을 연결

=> 프로브에 열을 가했을 때 이 열을 모듈에서 받고 계산하여 신호로 STM에 전송

=> 이 온도를 모듈의 DAT선을 통해 가져와서 LED 8 세그먼트(FND)에 표현 

 

2. 온도센서의 구성 

온도센서의 배선도

  •  데이터와 관련된 pin이 DAT 하나만 존재 

3. 소스코드 분석 

  • 오제이튜브+임베디드강의+자료모음(인프런+용)\주변 장치 자료\온도센서\DS18B20기준 치수\테스트 코드\arduino라이브러리 파일\OneWire\examples\DS18x20_Temperature
  • 오제이튜브+임베디드강의+자료모음(인프런+용)\주변 장치 자료\온도센서\DS18B20기준 치수\테스트 코드\arduino라이브러리 파일\OneWire\OneWire.cpp
  • 두 파일을 비교하며 OneWire 객체 이해

OneWire 객체 생성 시 수행되는 생성자
read 함수

 

3-1. read_bit 함수

  • noInterrupts();
    : 인터럽트를 받지않겠다(아두이노 특화된 코드)
  • DIRECT_MODE_OUTPUT
    : OneWire 생성자에선 pinMode를 INPUT으로 하는데 여기선 OUTPUT이므로 DAT 선을 통해 데이터를 READ/WRITE 둘 다 한다는 의미 
    => OUTPUT모드로 바꾸어 GPIO 신호를 Low로 한 번 떨어트림
    <=> 출력으로 내보냄 
  • delayMicroseconds(3) 
    : 3 마이크로세컨드 쉬고
  • DIRECT_MODE_INPUT
    : 다시 INPUT모드로 변경 <=> 똑같은 DAT선을 Read 모드로 
  • r = DIRECT_READ
    : 한 비트 r 읽음 
  • Interrupts();
  • delayMicroseconds(53);
  • return r;

=> 즉, DAT/GND/VCC 세가닥 선이 있고 내가 1bit를 읽고 싶은 경우 DAT에 신호를 보냄(LOW로 떨어트리고) 

=> 잠깐 3 마이크로세컨드 쉬고 

=> 다시 INPUT모드로 바꾸고 10 마이크로세컨드 쉬고

=> DAT 선을 통해 1bit 읽음 (HIGH : 1, LOW : 0)

=> 읽은 값을 return r; 통해 리턴

 

3-2. read 함수 

  • uint8_t 는 # include <stdint.h> 에 속함 
  • int8_t == char
  • uint8_t == unsigned char
  • uint32_t == unsigned int 
  • bitMask = 0x01 이므로 0000 0001 이므로 총 8번 반복 

4. 와이어 결선 

  • 모듈의 vcc/dat/gnd와 온도센서의 빨강/노랑/검정 선 연결
  • 노랑색 암컷-암컷(dat) + 빨강색 수컷-암컷(vcc) + 검정색 수컷-암컷(gnd)을 모듈에 연결 
  • 빵판의 +와 -에 각각 빨강/검정 점퍼선을, 노랑색 dat 점퍼선은 PA3_TEMP-DATA에 연결되고 이때 11번 포트로 연결됨 => PA3에 연결 

 

=> 프로브(온도센서), 모듈, 빵판 모두 연결 완료