==========================================================================================
센서
==========================================================================================
<AVR2560>
PT100옴 (XTR 119?...:BB회사)
써머커플러 (MAX...) - 일반 선 연결 X(온도 보상 도선 연결 해야 함)
:전용 드라이버사용 I2C통신으로 값 받음
=온도센서(써미스터)
<ADC.H>
#ifndef __ADC_H__ #define __ADC_H__ //#include "avr2560.h" #include <avr/io.h> #include <util/delay.h>
#define DADC 1
//#define A 1.845012194 //#define B 2.690325175 //#define C 0.948665543
#define A 2.658310929 #define B 2.94551768 #define C 11.77139449
#define BCOEFFICIENT 3950 // The beta coefficient of the thermistor (usually 3000-4000) #define THERMISTORNOMINAL 10000 // resistance at 25 degrees C #define TEMPERATURENOMINAL 25 // temp. for nominal resistance (almost always 25 C) #define SERIESRESISTOR 10000 // the value of the 'other' resistor
//extern int portop;
void ADC_Init(void); char * Cvt_Char(int , char *); float ADC_Read(void);
#endif //__ADC_H__
|
<ADC.C>
#include "adc.h"
void ADC_Init(void) { //DDRF = 0x80; //ACSR = (1<<ACBG) |(1<<ACIS1) |(1<<ACIS0); //0b01000011; // + 입력 = 1.1V ADMUX = (1<<REFS0)|(0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);//0b01000000;////(1<<REFS1) | (1<<REFS0); //-입력 : ADC4(JTAGEN X) => ADC1 ADCSRA = (1<<ADEN) | (1<<ADSC) | (1<<ADATE);//0b11100000;////0x00; //ADEN : 0 ADCSRB = 0x00;//(1<<ACME);//0b01000000; //ACME : 1 return; }
char * Cvt_Char(int T, char * cTemp) { unsigned short T2; char tmp1; char tmp2;
if(T < 0) { T2 = (~T+1); } else { T2 = T; }
tmp1 = (char)(T2/10); tmp2 = (char)(T2%10); if(0 <= T) cTemp[0] = ' '; else cTemp[0] = '-';
if(0 == tmp1) cTemp[1] = ' '; else cTemp[1] = tmp1 + '0';
cTemp[2] = tmp2 + '0';
return cTemp; }
// calculate resistor value float fCalcNtc(int wADCVal) // from ADC { float fRntc;
//fRntc = 10000 * (float) wADCVal / ( 1023.0 - (float) wADCVal); // 10000 = pullup resistor fRntc = 10000 * (( 1023.0 - (float) wADCVal) / (float) wADCVal ); // 10000 = pullup resistor
return(fRntc); }
// calculate temperature from resistorvalue float fCalcTemp( float fRntc) { float fTemp;
fTemp = (1.0 / ( (log(fRntc/THERMISTORNOMINAL))/BCOEFFICIENT + 1.0/298.0)) - 273.0; //log = ln
//kT = 1.0 / ((1.0 / (273.15 + 25.0)) + (1.0 / 4200.0) * log (sensorR / 10000.0)); return( fTemp); }
float ADC_Read(void) { unsigned char i; int sum; volatile unsigned int uiCnt; float sensorV; float sensorR; float kT; float cT;
sum = 0; for(i = 0; i<32; ++i) //AVERAGE { ADCSRA = (1<<ADEN) | (1<<ADSC) |(1<<ADIF) |(1<<ADPS2) |(1<<ADPS0);//0b11010101; while((ADCSRA & (1<<ADIF)) != (1<<ADIF)); sum += (((int)ADCL) + (((int)ADCH) << 8)); // 10 bit - ADCL부터 읽어야 함.. //sum += ((((int)ADCH)<<8) + ((int)ADCL)); // 10 bit - ADCH 부터 읽으면 값 변경 안됨 //DELAY(30000); _delay_ms(300); } sum >>= 5; //AVERAGE // sum = sum / 16 == sum /= 16;
//sensorV = (sum*5.0/1023.0); //sensorV = sum*5.0/512.0; //10k //sensorR = (( 5.0 * 10000.0 )/ sensorV ) - 10000.0; //kT = 1.0 / ((1.0 / (273.15 + 25.0)) + (1.0 / 3435.0) * log (sensorR / 10000.0)); //kT = 1.0/(A + (B*log(sensorR)) + (C*log(sensorR)*log(sensorR)*log(sensorR))); // Stein Hart //kT = 1.0 / ((1.0 / (273.15 + 25.0)) + (1.0 / 4200.0) * log (sensorR / 10000.0)); // 5k //sensorR = (( 5.0 * 5000.0 )/ sensorV ) - 5000.0; //sensorR = (500*sensorV) / (5-sensorV);
//kT = 1.0 / ((1.0 / (273.15 + 25.0)) + (1.0/3324.0) * log (sensorR / 5000.0)); // B parameter //kT = 1.0/(A + (B*log(sensorR)) + (C*log(sensorR)*log(sensorR)*log(sensorR))); // Stein Hart
//cT = kT-273.15;
sensorR = fCalcNtc(sum); // calculate temperature from resistorvalue cT = fCalcTemp(sensorR); // calculate temperature from resistorvalue return cT; }
|
=결과
<추가>
=온도 경보 장치 ( WIFI 연결 => IOT 접목)
TCP/IP
-네비게이션(GPS - 센턴스로 통신)
-수온 체크(선박용)
$
- : DONT CARE
- : DONT CARE
MTW
,
x.x : x.. .x
,
C : 섭씨
*hh : checksum
NMEA0183


