Busan IT/센서 제어2015. 9. 4. 17:28

==================================Outline====================================

C#을 활용한 NTC 온도 센서

---------------------------------------------------------------------------



/*** 소스 코드 ***/

Embeded C

#include "LCD.h"
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include <math.h>
#include "smart.h"


#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

float fCalcNtc(int wADCVal)  // from ADC

  double fRntc;

    fRntc = ((SERIESRESISTOR *  ( 1023.0  - (float) wADCVal) /(float) wADCVal));  // SERIESRESISTOR = 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 
  return( fTemp);
}
/*const unsigned int ad_table[] = {
991,989,987,985,983,980,978,975,973,970, //-40'C ~-31'C
966,963,960,957,953,949,945,941,937,932, //-30'C ~-21'C
927,922,918,912,907,900,895,889,882,875, //-20'C ~-11'C
868,861,854,847,839,830,822,814,806,796, //-10'C ~ -1'C

786,778,769,759,749,737,728,718,707,696, //  0'C ~  9'C
684,674,663,652,640,627,617,606,595,582, // 10'C ~ 19'C
569,559,548,536,524,511,501,490,478,466, // 20'C ~ 29'C
454,444,434,423,411,400,390,381,370,360, // 30'C ~ 39'C
349,341,332,322,313,303,295,287,279,270, // 40'C ~ 49'C
262,254,247,240,232,225,219,212,206,199, // 50'C ~ 59'C
193,187,182,176,170,165,160,155,151,146, // 60'C ~ 69'C
141,137,133,129,124,120,117,113,110,106, // 70'C ~ 79'C
103,100, 97, 94, 91, 88, 85, 83, 80, 78, // 80'C ~ 89'C
 75, 73, 71, 69, 66, 64, 62, 61, 59, 57, // 90'C ~ 99'C
 55, 53, 50, 47, 44, 42, 41, 41, 41, 41, //100'C ~109'C
 41, 40, 39, 38, 36, 35, 34, 33, 32, 32, //110'C ~119'C
 31 };
*/

volatile unsigned int uiCnt;
char cBuf[5= {0, };
char cFlag = 0;

void TC1_Init()
{
  /*  레지스터 설정 */

  // 16 BIT Timer/Counter //

  TCCR1A   = 0X00;//0B 0000 0000 -> NORMAL MODE, NO PWM MODE
  TCCR1B   = 0X83;//0B 1000 0011 -> FALLING EDGE, NORMAL MODE, 64 분주
  TCCR1C  = 0X00;//0B 0000 0000 -> BLOCK COMPARE MODE
  TCNT1H  = 0X00;//0B 0000 0000 -> START FROM 0
  TCNT1L  = 0X00;//0B 0000 0000 -> START FROM 0
  TIMSK1   = 0X01;//0B 0000 0001 -> OVERFLOW REGISTER ENABLE
  TIFR1  = 0X00;//0B 0000 0000 ->BIT CLEAR, FLACK BIT CLEAR
  SREG   |=0X80;//0B 1000 0000 -> GLOBAL INTERRUPT ENABLE
  

  TCNT1H = TCNT1L >> 8;
  SREG   |=0X80;// 0B 1000 0000 -> GLOBAL INTERRUPT ENABLE
}  


void ADC_Init()
{
  ADCSRA = 0x00;     // init
  ADCSRA = 0x85;     // Enable adc, 분주비 32
  ADCSRB = 0x00;    // free running mode
  ADMUX  = 0x40;     // select adc input 0
}

void MTW()
{
  char cBuffer[20]={0, };
  char cCS[3= {0, };
  int iCnt;
  char ucCS;

  cBuffer[0= '$';
  cBuffer[1= 'J';
  cBuffer[2= 'H';
  cBuffer[3= 'M';
  cBuffer[4= 'T';
  cBuffer[5= 'W';
  cBuffer[6= ',';
  cBuffer[7= '0';
  cBuffer[8= cBuf[0];
  cBuffer[9= cBuf[1];
  cBuffer[10= cBuf[2];
  cBuffer[11= cBuf[3];
  cBuffer[12= ',';
  cBuffer[13= 'C';
  cBuffer[14= '*';
  

  //checksum - from $ to * XOR
  for(iCnt = 1; iCnt < 14; ++iCnt)
  {
    ucCS ^= cBuffer[iCnt];
  }

  itoa(ucCS, cCS, 16);



  cBuffer[15= cCS[0];   
  cBuffer[16= cCS[1];     

  /*itoa( (ucCS & 0xF0), cBuffer[15], 16); 
  itoa( (ucCS & 0x0F), cBuffer[16], 16);*/


  
  cBuffer[17= 10;   
  cBuffer[18= 13;
  ucCS = 0;
  USART_PRINT(cBuffer);
}

int main(void)
{
  unsigned int uiSum=0;
  int iCnt;
  int uiTemp=0;  
  unsigned char i;
  double steinhart, Res, Temp;

  LCD_Init();
  ADC_Init();
  TC1_Init();
  USART0_INIT();


  LCD_Print("  Current Temp.");
  LCD_INST(0x0C);
  LCD_INST(0x40);
  LCD_Symbol();



  while(1)
  {  
    uiSum = 0;    
    ADCSRA = 0xD5;
    while((ADCSRA & 0x10) != 0x10);
    for(i=0; i<100; ++i)
    {
      ADCSRA = 0xD5;
      while((ADCSRA & 0x10) != 0x10);
      uiSum += (  (int)ADCL + ((int)ADCH<<8) ) ;
    }
    uiSum /= 100;  // uiSum = uiSum / 100, 아날로그 신호의 평균값을 내준다.
    Res = fCalcNtc(uiSum);      // calculate temperature from resistorvalue 
    Temp = fCalcTemp(Res);      // calculate temperature from resistorvalue
    Temp = Temp * 10;
    itoa(Temp, cBuf, 10);
    cBuf[3= cBuf[2]; 

    cBuf[2= '.';

    
    
    

    LCD_INST(0xC5);    
    LCD_Print(cBuf);
    LCD_Data(0x00);
    LCD_Data('C');
    _delay_ms(1000);
  }

  return 0;
}

void __vector_20(void)
{
  
  cFlag ^= 0x01;   
  
  if(cFlag == 0)  
    MTW();
      
    
}

C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;

namespace _20150904
{
    public partial class Form1 : Form
    {
        int iCnt = 0;
        public Form1()
        {
            InitializeComponent();
            bt_OFF.Enabled = false;
            string[] port_arr = SerialPort.GetPortNames();
            foreach (string portno in port_arr)
            {
                cb_PORT.Items.Add(portno);
            }                      
        }


        private void cb_PORT_SelectedIndexChanged(object sender, EventArgs e)
        {            
            serialPort1.PortName = cb_PORT.Text;
            serialPort1.BaudRate = 4800;
            serialPort1.Parity = 0;            
            serialPort1.DataBits = 8;            
            
        }

        private void bt_ON_Click(object sender, EventArgs e)
        {
            serialPort1.Open();
            serialPort1.Write(tb_Log.Text);
            bt_ON.Enabled = false;
            bt_OFF.Enabled = true;
        }

        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try { 
                string sText = tb_Log.Text = serialPort1.ReadLine();
                if(iCnt != 0)
                { 
                    string sCel = sText.Substring(94);
                    tb_C.Text = sCel;
                    var iF = Convert.ToDouble(sCel);

            
                    double dF = (iF * 1.8 + 32);
                    string sF = null;
                    sF = Convert.ToString(dF);

                    tb_F.Text = sF;
                }
                ++iCnt;
            }
            catch 
            {
                MessageBox.Show("Port Closed""Notice", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            
        }
        private void bt_OFF_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
            bt_ON.Enabled = true;
            bt_OFF.Enabled = false;
        }
   
        
    }

}


반응형

'Busan IT > 센서 제어' 카테고리의 다른 글

자동차 후진 경고 센서  (0) 2015.09.14
온도계 섭씨 화씨 변경, 초음파의 특성  (0) 2015.09.10
NTC 온도계 저항값 변환  (0) 2015.09.04
NTC 센서를 활용한 온도계  (0) 2015.09.02
NTC 온도 센서  (0) 2015.09.01
Posted by newind2000