BASIC4MCU | 질문게시판 | ADC 이용한 NTC 써미스터 온도 센서로 LED 밝기 조절
페이지 정보
작성자 밍구리 작성일2023-06-26 11:05 조회5,507회 댓글4건본문
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL
#define REF_VOLTAGE 5.0
#define SERIESRESISTOR 100000
#define NOMAL_R 100000
#define NOMAL_TEMP 25
#define B 4100
#define ledPin 10
#define RPin A2
#define NTCPin A3
int bright;
int tValue;
float ADC_value=0 ;
float ADC_value2=0;
float Resistance; //Rt
float temp;
float adc;
//unsigned int sum=0;
int i;
int ADC_READ()
{
/*
ADCSRA =0b11010111 ; //
while((ADCSRA & 0x10) == 1);
int adc=0;
float value=0;
value = ADC_value*REF_VOLTAGE/1024; //10비트
adc = value*10;
Serial.print("Temperature");
Serial.println(adc);
tValue =constrain(adc, 25, 35);
bright = map_test(tValue, 25, 35,0,255);
analogWrite(ledPin,bright);
*/
ADCSRA = 0b11010101;
// ADCSRA = 0xD5;
while((ADCSRA & 0x10) == 0);
adc = ( (int)ADCL + ((int)ADCH<<8) ) ;
adc = (adc*5)/1024 ;
/*
ADCSRA = ADCSRA & 0x3f;
ADMUX = 0x60 | (port & 0x0f);
ADCSRA = ADCSRA | 0xc0;
*/
return adc;
}
int read_tempt()
{
ADC_value = adc ; //A2에서 받아오는 값 Vo
Serial.print("ADC ");
Serial.println(ADC_value);
//Serial.print(" = ");
ADC_value2 = 1023 ; //A3에서 받아오는 값 Vs=1023
Resistance = ADC_value2 * SERIESRESISTOR; //Vs*Ro
Resistance = Resistance / ADC_value; //(Vs*Ro)/Vo
Resistance = Resistance - SERIESRESISTOR; ////(Vs*Ro)/Vo-Ro
Serial.print("Resistanc");
Serial.print(Resistance);
Serial.println(" Ohm");
float temp;
temp = Resistance / SERIESRESISTOR; // (Rt/Ro)
temp = log(temp); // ln(Rt/Ro)
temp /= B; // 1/B * ln(Rt/Ro)
temp += 1.0 / (NOMAL_TEMP + 273.15); // + (1/To)
temp = 1.0 / temp; // 역수
temp -= 273.15; //c로 전환
return temp;
}
int map_test(int input, int min_in , int max_in, int out_in, int out_max)
{
float z=0;
z=256/(max_in-min_in)*(input-min_in);
return z;
}
int main() {
Serial.begin(9600);
pinMode(ledPin,OUTPUT);
ADMUX = 0b00000000; //00 = 외부의 AREF 단자로 입력된 전압을 사용
ADCSRA = 0b10000101; // 분주비 101=32 (16MHz/32=500000)
ADCSRB = 0b00000000;
sei(); //모든 인터럽트를 활성화
while(1)
{
ADC_READ();
temp=read_tempt();
tValue =constrain(temp, 25, 35); //25c일때의 ADCvalue값~50c일때의 ADCvalue값으로 제한
bright = map_test(tValue, 25, 35,0,250);
analogWrite(ledPin,bright);
Serial.print("Temperature");
Serial.println(temp);
delay(1000);
}
}
ADC를 이용헤서 NTC 써미스터 온도 센서로 온도를 측정하고 온도에 따라 LED 밝기 조절을 하고 싶은데 이렇게 돌렸더니 전혀 작동하질 않네요
어느 부분이 잘못된 걸까요?
댓글 4
조회수 5,507master님의 댓글
master 작성일AVR과 아두이노 구분을 하지 못하고 계신 것 같습니다.
밍구리님의 댓글
밍구리 작성일
아 그렇네요 예전에 쓴 코드를 가져오다가 섞였네요 그럼
DDRB = 0b00010000;
TCCR1A=0b10101010;
TCCR1B=0b00011010;
하고 고속 PWM 모드를 사용한다고 하면 OCR 값으로 듀티비를 지정하는 것 까지는 알겠는데 온도값에 따라 밝기를 설정해주려면 어떤 식으로 코드를 짜야할까요?
master님의 댓글
master 작성일
https://cafe.naver.com/circuitsmanual/71343
강좌글 참고하세요
온도값을 먼저 제대로 읽는 지 확인 한 후에
온도값에 따른 밝기를 출력하면 됩니다.
https://cafe.naver.com/circuitsmanual/151206
OCR1A=speed; //PB5
OC1A는 PB4가 아니고 PB5입니다.
DDRB = 0b00010000; 이렇게 설정하면 안되고 DDRB = 0x20; 이렇게 설정해야겠죠
밍구리님의 댓글
밍구리 작성일아 이해했습니다! 핀 바꿔주고 온도 계산해서 if 문으로 온도별 %값 다르게 설정해줬더니 잘 작동하네요 감사합니다!