부품)
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 |