임베디드/고추건조기

온도센서

twoweeks-within 2024. 12. 5. 16:37


부품)
3가닥
쇠부분
모듈

쇠 부분에 열 > 저항이 변함 > 전압이 변함 > 변한 수치로 계산해서 온도 측정 (ADC) 

DATASEET
DAT : DATA IN/OUT 을 pin 하나로 함
onewire.cpp // 예제코드
pde + cpp 코드분석
(pde)
OneWire  ds(10);
(cpp)
OneWire::OneWire(uint8_t pin)
{
pinMode(pin, INPUT); // INPUT
bitmask = PIN_TO_BITMASK(pin);
baseReg = PIN_TO_BASEREG(pin);
#if ONEWIRE_SEARCH
reset_search();
#endif



uint8_t OneWire::read() {
    uint8_t bitMask;
    uint8_t r = 0;

    for (bitMask = 0x01; bitMask; bitMask <<= 1) { // 중간식이 0까지 진행
// 0000 0001 ~ 1000 0000 까지 8번 진행
if ( OneWire::read_bit()) r |= bitMask;
    }
    return r;
}
}

> read_bit

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); // INPUT > OUTPUT 전환
DIRECT_WRITE_LOW(reg, mask); // LOW 로 떨어뜨림
delayMicroseconds(3); // 3ms 쉬고
DIRECT_MODE_INPUT(reg, mask);// INPUT 모드 // let pin float, pull up will raise
delayMicroseconds(10);
r = DIRECT_READ(reg, mask); // HIGH, LOW 를 읽음 1,0 
interrupts();
delayMicroseconds(53); 
return r; // 반환
}
// OUTPUT 을 잠깐 쉬고 INPUT 을 한뒤에 읽으면 > 0, 1 을 받을 수 있지만
바로 읽으면 항상 0이 나오겠죠
>> 한 비트를 읽어오는법

1-wire 통신방식
 구글링 > 위키 > 유명 > " 라이브러리 " 가 있음!! ( 유저가만든 ) > 써먹기 좋음

HAL 라이브러리 <> TM 라이브러리 : 동시 사용 못함

stm32
Folder > Lib > (F) inc, src
폴더를 새로 만들면 include 경로를 지정해줘야함   
  : 속성 > c general > path

PA2 : TEMP_DATA

#define ABC 여기
 > " 여기 " 부분도 정의가 되어야한다
    >  변수, 구조체, 타이머 핸들러, 함수 등과 같은경우!
   // 숫자 3 이런건 정의 필요 X

#define  _DS18B20_TIMER  htim13
 > 타이머 설정 해주어야함

TIM_HandleTypeDef htim2; 타이머 설정 //  interrupt enable

extern TIM_HandleTypeDef htim2; // 외부참조


 > clock configuration 
APB2 timer clocks 8MHz = 8000000HZ (1초에 8백만번)

 main.c 초기값 HAL_TIM_Base_Start_IT(&htim2);

prescaler  (8-1) 
// 1MHz == 1µs
     주파수    주기

 > 1초에 1주기

0xFFFF 
 > 1주기가 0~0xFFF

  
 >>0~0xFFFF 까지가 1주기
   >  1MHz == 1µs에 65536번 = 65.536 ms 
     *8 = 524.288ms (~=0.524초)

클럭 증폭 > RCC : crystal resonator > chip 외부클럭 사용
   HLL > 72

>>  72MHZ = 72000000 HZ

 /72 = 1MHZ = 1us

 


온도정보를 보려면.. github Lib 제작자 > debug > ds18b20 

typedef struct
{
uint8_t  Address[8];
float  Temperature;
bool DataIsValid;

}Ds18b20Sensor_t;

extern Ds18b20Sensor_t  ds18b20[_DS18B20_MAX_SENSORS];

Ds18b20Sensor_t 구조체 > 주소, 온도, 유효 가 담김
_DS18B20_MAX_SENSORS == 1 

Ds18b20Sensor_t  ds18b20[1] //구조체배열

ds18b20[0].Address[8] 
ds18b20[0].Temperature
ds18b20[0].DataIsValid

ds18b20[1].Address[8] 
ds18b20[1].Temperature
ds18b20[1].DataIsValid

 >> 이렇게 저장

bool Ds18b20_ManualConvert(void)
 > 여기에 tempsensor 에 관한게 있음

digit4_temper(ds18b20[0].Temperature,450); 
   > 온도정보 > 세그먼트

형변환 주의!!!
ex) ds18b20[0].Temperature = 26.4
 1.   (int) ds18b20[0].Temperature * 10
2.    (int)(ds18b20[0].Temperature*10)


1. (int) ds18b20[0].Temperature 여기에 * 10  
   >>int( 26 ) * 10 == 260
2. (int)(ds18b20[0].Temperature*10)
          >> int (26.4*10 ) ==264

'임베디드 > 고추건조기' 카테고리의 다른 글

Rom search  (0) 2024.12.07
1-wire, 프로토콜  (0) 2024.12.06
GPIO >SPI  (0) 2024.12.03
FND 분석  (0) 2024.12.02
SPI통신  (0) 2024.12.01