2018-9-16 13:00:09 [显示全部楼层]
7219浏览
查看: 7219|回复: 0

[进阶] Arduino 和热敏电阻(NTC)测温,并以RGB灯来表示

[复制链接]
本案例用Arduino 连接NTC热敏电阻和RGB灯来感知温度并以RGB LED灯颜色变化来表达。




NTC热敏电阻是电阻值随温度变化的半导体传感器,其典型特点是阻值对温度非常敏感,在不同的温度下会表现出不同的电阻值,从而根据表现的电阻值可逆推导得到其所处的环境温度值。具有灵敏度高、体积小、热容量小、响应速度快、NTC热敏电阻价格低廉,但是想要得到很高的测量精度,需要做很多优化工作,难度较大。

  按照温度系数不同,可分为正温度系数热敏电阻(PTC)、负温度系数热敏电阻(NTC)和临界负温度系数热敏电阻(CTR)。PTC随着温度升高,表现出的电阻值越大; NTC随着温度升高,表现出的电阻值越低;CTR具有负电阻突变特性,在某一温度下,电阻值随温度的增加急剧减小,具有很大的负温度系数。由于具有不同的特性,热敏电阻的用途也是不同的。PTC一般用作加热元件和过热保护;NTC一般用于温度测量和温度补偿;CTR一般用于温控报警等应用。
  NTC的测温范围为-60~+300℃,标称阻值一般在1Ω至100MΩ之间,采用精密电阻和热敏电阻组合可扩大测量温度线性范围。图1为NTC实物图,图中所示的为NTC 10D-9和NTC 5D-7。NTC表示为负温度系数的热敏电阻,10D-9和5D-7代表其型号,10D-9代表了常温(25摄氏度)阻值10欧姆,直径9毫米,5D-7代表了常温(25摄氏度)阻值5欧姆,直径7毫米。
  除了图1所示的形状之外,热敏电阻制成的探头有珠状、棒杆状、片状和薄膜等,封装外壳有玻璃、镍和不锈钢管等套管结构,如图2所示。Arduino 和热敏电阻(NTC)测温,并以RGB灯来表示图1
Arduino 和热敏电阻(NTC)测温,并以RGB灯来表示图2

Arduino 和热敏电阻(NTC)测温,并以RGB灯来表示图4
RGB灯是以三原色共同交集成像
Arduino 和热敏电阻(NTC)测温,并以RGB灯来表示图5
连线图
Arduino 和热敏电阻(NTC)测温,并以RGB灯来表示图3
原件是attiny 85,
RGB led
10k电阻
thermister 10k
10uF电容

测试

Arduino 和热敏电阻(NTC)测温,并以RGB灯来表示图6


[mw_shl_code=applescript,true]/*

   made by gada888

   x-----------------/\/\/\/\/\/\/\/---------------x---/\/\/\/\/\/\/\----xGND
   |                NTC 10K Thermistor             |  10K 1% Resistor
   |                                               |
   |              ATTINY85 / ARDUINO               |
   |                     +-\/-+                    |
   |    Ain0 (D 5) PB5  1|    |8  Vcc              |
   x--- Ain3 (D 3) PB3  2|    |7  PB2 (D 2) Ain1 ---
(Blue)- Ain2 (D 4) PB4  3|    |6  PB1 (D 1) pwm1  (Green) ----------|<---x
   |               GND  4|    |5  PB0 (D 0) pwm0  (Red) ------------|<---x
   |                     +----+                                          |    100 Ohm
   x----------------------------------------------------------------|<---x---/\/\/\/\/---Vcc 3.3V

*/
#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/wdt.h>

boolean flag_wdt = 1;

int pinT = PB3;           // Thermistor 电压
int pinR = PB0;           // Digital pin #0  Red
int pinG = PB1;           // Digital pin #1  Green
int pinB = PB4;           // Digital pin #4  Blue
int r; int g; int b;
const int nToSleep = 50 ; // 休眠前稳定温度
const int Delay =    100; // 毫秒延迟
double ADCcount;
double ADCprevious;
int nCount;
int ThermistorPin  = 1 ;  // A1 连 pin #7 (PB2)

void setup()
{
  // WDTO_15MS, WDTO_30MS, WDTO_60MS, WDTO_120MS, WDTO_250MS, WDTO_500MS,
  // WDTO_1S, WDTO_2S, WDTO_4S, WDTO_8S
  setup_watchdog(WDTO_4S);  // 唤醒
  sleep_disable();
  pinMode(pinT, OUTPUT); digitalWrite(pinT, HIGH);
  pinMode(pinR, OUTPUT);
  pinMode(pinG, OUTPUT);
  pinMode(pinB, OUTPUT);
}
  
void loop()
{
  wdt_reset();    // pat K9
  ADCcount = analogRead(ThermistorPin) ;
  if (ADCcount == ADCprevious) ++nCount;
  if ( nCount > nToSleep )
  { // 给低电压
    pinMode(pinR, INPUT); digitalWrite(pinR, HIGH);  // 上拉电阻
    pinMode(pinG, INPUT); digitalWrite(pinG, HIGH);
    pinMode(pinB, INPUT); digitalWrite(pinB, HIGH);
    SleepLonger:    // 重新睡眠
    pinMode(pinT, INPUT); digitalWrite(pinT, HIGH);
      system_sleep();
      sleep_disable();  // 睡眠等待 WDT 触发
      pinMode(pinT, OUTPUT); digitalWrite(pinT, HIGH);
      delay(50);
      // 缓冲时间
      for (uint8_t z=0; z<5; z++) {
        ADCcount = analogRead(ThermistorPin) ;
      }
      if (abs(ADCcount - ADCprevious) < 4) goto SleepLonger;  
   
    pinMode(pinR, OUTPUT); digitalWrite(pinR, HIGH);
    pinMode(pinG, OUTPUT); digitalWrite(pinG, HIGH);
    pinMode(pinB, OUTPUT); digitalWrite(pinB, HIGH);
    nCount = 0;
  } else {
  // 261 = 32F, 447 = 64F, 537 = 75F, 575 = 82F
  b = map(ADCcount, 261,  447, 100, 255 );
  g = map(ADCcount, 435,  574, 250, 100);  // 覆盖 green & blue
  r = map(ADCcount, 575, 1023, 250,  50);

  if (ADCcount > 574)              // HOT: ADCcount 随着温度上升
    {
      // 显示红色如果温度达到设定值
      analogWrite(pinR,   r);
      analogWrite(pinG, 255);      // 255 = 100% High --> Vcc
      analogWrite(pinB, 255);      // 不显示蓝色
    } else {                       // 温度降低,蓝色想绿色过度
      analogWrite(pinR, 255);      // 不显示红色
      analogWrite(pinG, g);
      analogWrite(pinB, b);        // 低的温度显示深蓝
    }
  }
  ADCprevious = ADCcount;
  delay(Delay);
}

#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
//参考ATtiny85_watchdog_example.zip
void system_sleep()
{
    cbi(ADCSRA,ADEN);                    
    power_all_disable ();               
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    noInterrupts ();                     
    sleep_enable();
    interrupts ();                       
    sleep_mode();                        
    sleep_disable();                     
    power_all_enable ();                 
    sbi(ADCSRA,ADEN);                    
}


void setup_watchdog(int ii)
{
  byte bb;
  int ww;
  if (ii > 9 ) ii=9;
  bb=ii & 7;
  if (ii > 7) bb|= (1<<5);
  bb|= (1<<WDCE);
  ww=bb;

  MCUSR &= ~(1<<WDRF);

  WDTCR |= (1<<WDCE) | (1<<WDE);

  WDTCR = bb;
  WDTCR |= _BV(WDIE);
}
  

ISR(WDT_vect) {
   
}
[/mw_shl_code]



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail