基于arduino的温度检测和显示

本文详细介绍了如何利用Arduino Uno板、DS18B20温度传感器及2位数码管实现温度采集与显示。包括硬件连接、数码管工作原理、温度传感器使用方法、代码实现与测试结果等内容。
[b]功能[/b]:使用温度传感器采集温度,用2位数码管显示结果。

[img]http://dl.iteye.com/upload/attachment/0077/6259/835d3906-c131-3fcb-a191-d66796dfe96a.jpg[/img]

[b]材料如下:[/b]
1 arduino Uno
2 DS18B20 温度传感器
3 2位数码管

[b]数码管相关[/b]:
数码管的原理很简单,一般一个字符由7段组成,由a-g,需要控制每段的电压高低来是否亮,比如0则应该abcdef亮,中间的g暗。所以,数码管的接入关键是看针脚的定义。

对于n位数码管,一般是共阳或共阴,针脚的具体定义需要看相应的参数图,不要自己猜测。一般会有n位针脚对应各自的字符开关。一般针脚的序列是从左下角逆时针 1...n。

在自己程序里需要定义数码管的针脚对应板子上的io口,比如我这里:

[img]http://dl.iteye.com/upload/attachment/0077/6261/b5e09ab6-67c1-3641-9252-8ea30457e538.jpg[/img]

Arduino引脚 数码管引脚
D11 10(A)
D10 9(B)
D2 1(C)
D3 4(D)
D4 3(E)
D5 6(F)
D6 5(G)
D7 2(DP)
D8 8(LED1)
D9 7(LED2)

右边针脚数字顺序即图里下部所示a-dp对应的顺序。
可以参考:
[url]http://blog.sina.com.cn/s/blog_a6164cc90101a6ks.html[/url]
[url]http://www.arduino.cn/thread-1224-1-1.html[/url]

相关资料和软件可以在附件中找到。

[b]温度相关[/b]:
用的是DS18B20 温度传感器,注意不同型号的温度传感器对应的库和方法不一样,需要针对性开发。这里有篇很好的文章:[url]http://bbs.iqrobot.com/forum.php?mod=viewthread&tid=45[/url]。

相关的内容可见[url]http://www.pjrc.com/teensy/td_libs_OneWire.html[/url]和[url]http://www.milesburton.com/?title=Dallas_Temperature_Control_Library[/url]

[img]http://dl.iteye.com/upload/attachment/0077/6284/18552695-bec9-3ab0-b499-8f170b6f34b0.gif[/img]

[img]http://dl.iteye.com/upload/attachment/0077/6282/85a71b0a-bc7a-3a91-b5ba-a6118e8ffdd7.gif[/img]

需要的库也可从附件下载,解压缩放到arduino的libraries目录下。(一般需要重启arduino IDE才可生效)

[b]我的测试代码[/b]:

#include <OneWire.h>
#include <DallasTemperature.h>

//LED
#define SEL_LED1 8 //arduino数字针脚8对应LED1的控制
#define SEL_LED2 9 //arduino数字针脚9对应LED1的控制

const unsigned char LED8Pin[]={
11,10,2,3,4,5,6,7,8,9};//A B C D E F G Dp sel_led

const unsigned char LED8Code[]={ //该值可以通过取模软件获得,共阳
0xC0, // 0
0xF9, // 1
0xA4, // 2
0xB0, // 3
0x99, // 4
0x92, // 5
0x82, // 6
0xF8, // 7
0x80, // 8
0x90, // 9
0x88, // A
0x83, // B
0xC6, // C
0xA1, // D
0x86, // E
0x8E // F
};

// Data wire is plugged into port 10 on the Arduino
#define ONE_WIRE_BUS 13

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

void setup(void)
{
// start serial port
Serial.begin(9600);
Serial.println("Dallas Temperature IC Control Library Demo");

//LED
char i;
for(i=0;i<10;i++)
{
pinMode(LED8Pin[i], OUTPUT);
digitalWrite(LED8Pin[i], HIGH);
}

// Start up the library
sensors.begin();
}

void loop(void)
{
// call sensors.requestTemperatures() to issue a global temperature
// request to all devices on the bus
Serial.print("Requesting temperatures...");
sensors.requestTemperatures(); // Send the command to get temperatures
Serial.println("DONE");

Serial.print("Temperature for the device 1 (index 0) is: ");

float tempValue = sensors.getTempCByIndex(0);
int changeValue = getRightValue(tempValue);

Serial.print(tempValue);
Serial.print(" ");
Serial.println(changeValue);

for(int i=0;i<20;i++){
LEDAll_Show(changeValue);
}

//delay(1000);
}

int getRightValue(float f){
float intValue = f*100;
int small = (int)intValue%100;
int diff = (small>=50? 1:0);
return diff+intValue/100;
}


void LED8Show(char data){
char i;
char j;
char hc;
if(0<=data<16)
{
hc = LED8Code[data];
for(i=0;i<8;i++)
{
j = bitRead(hc,i);
digitalWrite(LED8Pin[i], j);
if(j==0){
//digitalWrite(LED8Pin[i], LOW);
}
}
}
}
void LEDAll_Show(unsigned char num)
{
unsigned char VH,VL;
VH = num/10;
VL = num%10;

//Serial.println(num);

digitalWrite(SEL_LED1, 1);
digitalWrite(SEL_LED2, 0);
LED8Show(VH);
delay(10);

digitalWrite(SEL_LED1, 0);
digitalWrite(SEL_LED2, 1);
LED8Show(VL);
delay(10);

digitalWrite(SEL_LED1, 0);
digitalWrite(SEL_LED2, 0);
}



布线和结果请看附件效果图。
热敏电阻是简单,廉价且精确的组件,可轻松获取项目的温度数据。 热敏电阻是可变电阻,其电阻会随温度变化。根据其电阻对温度变化的响应方式对其进行分类。在负温度系数(NTC)热敏电阻中,电阻随温度的升高而减小。在正温度系数(PTC)热敏电阻中,电阻随温度的升高而增加。 NTC热敏电阻是最常见的,这就是我们将在本教程中使用的类型。NTC热敏电阻由半导体材料(例如金属氧化物或陶瓷)制成,该材料经过加热压缩以形成对温度敏感的导电材料。 导电材料包含允许电流流过的电荷载流子。高温导致半导体材料释放更多的电荷载流子。在由氧化铁制成的NTC热敏电阻中,电子是电荷载流子。在氧化镍NTC热敏电阻中,载流子是电子空穴。 让我们构建一个基本的热敏电阻电路以了解其工作原理,以便稍后将其应用于其他项目。 由于热敏电阻是可变电阻,因此在计算温度之前,需要测量电阻。但是,Arduino无法直接测量电阻,只能测量电压。 Arduino将在热敏电阻已知电阻之间的一点上测量电压。这被称为分压器。 热敏电阻的制造商可能会告诉您它的电阻,但是如果不是,则可以使用万用表进行查找。如果您没有万用表,可以按照我们的Arduino欧姆表教程,用Arduino制作欧姆表。您只需要知道热敏电阻的大小即可。例如,如果您的热敏电阻电阻为34,000 Ohms,则其为10K热敏电阻。如果是340,000欧姆,则为100K热敏电阻。
<think>嗯,用户想了解如何使用Arduino实现温度检测显示。根据引用资料,系统需要传感器、数据采集处理、显示模块、实时监测报警这几个部分。 用户提供的三个引用很有价值:引用[1]概述了系统的四大核心组件,引用[2]列出了具体硬件清单,引用[3]则提供了两种代码实现方案。这些材料正好能构建完整的回答框架。 注意到用户可能正在做智慧校园项目,需要快速获取可落地的方案。上次对话中用户也提到过"查找相关资料",说明需要实用指导而非理论阐述。 准备从硬件构建软件编程两个维度展开:先用引用[2]的元器件清单说明基础配置,再结合引用[1]解析系统架构,最后重点解析引用[3]的两种代码方案。特别要强调温度转换公式的推导过程,因为这是初学者最容易出错的地方。 考虑在回答中突出三个关键技术点:一是DS18B20的单总线通信优势,二是OLED屏幕的驱动逻辑,三是模拟传感器数值到实际温度的转换算法。这些都能在引用资料中找到依据。 生成的问题需要覆盖扩展应用:比如如何添加湿度检测(引用[1]提过但未实现)、报警功能优化、显示界面改进等,帮助用户深化项目。 </think>以下是基于引用资料的Arduino温度检测显示实现方法详解,包含硬件配置编程逻辑: ### 一、系统组成(引用[1][2]) 1. **核心硬件** - 主控:`Arduino Nano/Uno` - 传感器:`DS18B20`(数字输出,±0.5°C精度)或`模拟温度传感器`(如LM35) - 显示模块:`0.96寸OLED`(SSD1306驱动,I2C接口) - 辅助元件:`4.7kΩ上拉电阻`(DS18B20必需) 2. **接线示意** ``` DS18B20 → Arduino VCC (红) → 5V DATA (黄) → D2(接4.7kΩ上拉到5V) GND (黑) → GND ``` ``` OLED → Arduino SDA → A4 SCL → A5 VCC → 3.3V GND → GND ``` ### 二、编程实现(引用[3]优化) #### 方案1:模拟传感器(LM35) ```cpp void setup() { pinMode(A0, INPUT); Serial.begin(9600); // 初始化串口 } void loop() { int rawVal = analogRead(A0); // 读取模拟值 float voltage = rawVal * (5.0/1024); // 转换为电压 (0-5V) float tempC = voltage * 100; // LM35转换公式(10mV/℃) Serial.print("Temperature: "); Serial.print(tempC); Serial.println("°C"); delay(1000); // 每秒更新 } ``` #### 方案2:数字传感器(DS18B20) + OLED显示 ```cpp #include <OneWire.h> #include <DallasTemperature.h> #include <Adafruit_SSD1306.h> #define ONE_WIRE_BUS 2 // 传感器接D2 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); Adafruit_SSD1306 display(128, 64, &Wire, -1); // OLED实例 void setup() { sensors.begin(); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // I2C地址 display.clearDisplay(); } void loop() { sensors.requestTemperatures(); float tempC = sensors.getTempCByIndex(0); // 获取第一个传感器数据 // OLED显示 display.clearDisplay(); display.setTextSize(1); display.setCursor(0,0); display.print("Temp: "); display.print(tempC); display.println(" C"); display.display(); delay(2000); // 每2秒刷新 } ``` ### 三、关键技术解析 1. **传感器选择** - DS18B20:数字信号抗干扰强,支持多设备并联(需修改代码轮询)[^2] - LM35:模拟输出需校准,避免长距离传输 2. **数据处理优化** ```cpp // 添加平滑滤波(引用[1]数据处理) float tempFiltered = 0; for(int i=0; i<5; i++) { // 5次采样平均 tempFiltered += sensors.getTempCByIndex(0); delay(100); } tempFiltered /= 5; ``` 3. **报警功能扩展**(引用[1]特性4) ```cpp if(tempFiltered > 30.0) { tone(8, 1000); // 蜂鸣器接D8 display.print("! OVERHEAT !"); } ``` ### 四、常见问题解决 - **OLED不显示**:检查I2C地址(通常0x3C或0x3D),确认接线是否松动 - **DS18B20读数-127℃**:检查4.7kΩ上拉电阻数据线接触 - **温度漂移**:避免传感器靠近Arduino芯片发热源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值