怎么测试电脑u温度 (怎么测试电脑u温度是多少)

在围绕 Arduino 等单片机设计项目时,通常希望能够测量温度。您想要这样做的原因有很多。您可能正在使用 Arduino 来控制温度至关重要的过程。您可能正在设计一个自动孵化器,它会在某阶段维持恒定的温度。您可能正在为农业项目构建数据记录器。或者您可能只想构建自己的数字温度计。今天我们将看看五种不同的传感器,它们可用于使用 Arduino 测量温度。

作者:加拿大DronebotWorkshop
翻译整理:DIY百事

目录

1 简介
1.1五个传感器
2 DHT22
2.1 DHT22 Arduino 连接
2.2 DHT22 Arduino 代码
3 AM2320
3.1 AM2320 Arduino 连接
3.2 AM2320 Arduino 库和代码
4 TMP36 & LM35
4.1 TMP36
4.2 LM35
4.3 TMP36 和 LM35 引脚排列
4.4 TMP36 Arduino 连接
4.5 TMP36 Arduino 代码
5 MCP9808
5.1 MCP9808 引脚排列
5.2 MCP9808 Arduino 连接
5.3 MCP9808 Arduino 代码
6 结论

用Arduino 测量温度


五个传感器

我们将看到的五个传感器如下:

DHT22 – 这种低成本传感器还可以测量湿度。它有一个串行数字输出,可以很容易地与大多数微控制器一起使用。AM2320 – 在许多方面与 DHT22 类似,但使用 I2C 总线进行通信。TMP36 – 具有线性模拟输出和宽测量范围的校准传感器。LM35 – 与 TMP36 类似,更准确,但如果您需要测量负温度,则不方便使用。MCP9808 – 非常高精度的温度传感模块,还具有可编程报警输出。

这些设备都不是特别昂贵,而且所有这些设备都非常容易与 Arduino 一起使用,特别是有了对应库函数后。

五种温度传感器

让我们一一了解它们。

DHT22

DHT22 是一种非常受欢迎的温度和湿度传感器。它是 DHT11 的表亲,与同类产品相比,它具有更高的分辨率,并且还能够测量负温度。

DHT22

该设备具有串行数字输出,由于提供了几个优秀的库,因此很容易与 Arduino 和其他微控制器一起使用。

DHT22 的工作温度范围为 -40 至 80 摄氏度,精度在 5% 以内。它还可以测量 20% 到 100% 范围内的湿度。它可以用 3 到 5 伏的直流电压供电,使其适用于 3.3 伏和 5 伏逻辑设备。

这是 DHT22 的引脚排列:

DHT22 引脚排列

请注意,仅使用了四个引脚中的三个,引脚 3 未连接。

DHT22 也封装为 AM2302(不要与我们列表中的下一个传感器混淆)。

DHT22 Arduino 连接

将 DHT22 连接到 Arduino 或任何类似的微控制器非常容易,因为该设备只有一个输出引脚,可以连接到任何可用的数字 I/O 端口。

以下是我为我的实验连接传感器的方法:

DHT22接线图

我将数字 I/O 引脚 2 用于传感器输出,但这只是因为我计划使用的库具有使用该引脚的示例代码。您可以为 DHT22 使用任何 I/O 引脚,并且您可以在同一个 Arduino 中使用多个。

DHT22 Arduino 代码

我们将使用 Adafruit 的库来简化 DHT22 的工作。实际上我们需要两个库,而 DHT 库依赖于另一个库。

您需要在 Arduino IDE 中打开库管理器并搜索以下两个库:

Adafruit DHT Sensor库 - 该库可让您轻松使用 DHT22 以及 DHT11 和 DHT21。Adafruit Unified Sensor库——这是一个与许多 Adafruit 传感器库一起使用的“主库”。如果您已经完成了我之前介绍的一些实验,那么您可能已经安装了这个库。

一旦安装了库,我们就可以运行示例代码来测试我们的传感器。打开您的文件菜单,然后打开示例。向下滚动子菜单,直到您进入自定义库中的示例部分。查找DHT Sensor并突出显示它。您将看到两个代码。选择 DHT_Unified_Sensor 代码。

// DHT Temperature & Humidity Sensor// Unified Sensor Library Example// Written by Tony DiCola for Adafruit Industries// Released under an MIT license.// REQUIRES the following Arduino libraries:// - DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library// - Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor#include <Adafruit_Sensor.h>#include <DHT.h>#include <DHT_U.h>#define DHTPIN 2 // Digital pin connected to the DHT sensor // Feather HUZZAH ESP8266 note: use pins 3, 4, 5, 12, 13 or 14 --// Pin 15 can work but DHT must be disconnected during program upload.// Uncomment the type of sensor in use://#define DHTTYPE DHT11 // DHT 11#define DHTTYPE DHT22 // DHT 22 (AM2302)//#define DHTTYPE DHT21 // DHT 21 (AM2301)// See guide for details on sensor wiring and usage:// https://learn.adafruit.com/dht/overviewDHT_Unified dht(DHTPIN, DHTTYPE);uint32_t delayMS;void setup() { Serial.begin(9600); // Initialize device. dht.begin(); Serial.println(F("DHTxx Unified Sensor Example")); // Print temperature sensor details. sensor_t sensor; dht.temperature().getSensor(&sensor); Serial.println(F("------------------------------------")); Serial.println(F("Temperature Sensor")); Serial.print (F("Sensor Type: ")); Serial.println(sensor.name); Serial.print (F("Driver Ver: ")); Serial.println(sensor.version); Serial.print (F("Unique ID: ")); Serial.println(sensor.sensor_id); Serial.print (F("Max Value: ")); Serial.print(sensor.max_value); Serial.println(F("°C")); Serial.print (F("Min Value: ")); Serial.print(sensor.min_value); Serial.println(F("°C")); Serial.print (F("Resolution: ")); Serial.print(sensor.resolution); Serial.println(F("°C")); Serial.println(F("------------------------------------")); // Print humidity sensor details. dht.humidity().getSensor(&sensor); Serial.println(F("Humidity Sensor")); Serial.print (F("Sensor Type: ")); Serial.println(sensor.name); Serial.print (F("Driver Ver: ")); Serial.println(sensor.version); Serial.print (F("Unique ID: ")); Serial.println(sensor.sensor_id); Serial.print (F("Max Value: ")); Serial.print(sensor.max_value); Serial.println(F("%")); Serial.print (F("Min Value: ")); Serial.print(sensor.min_value); Serial.println(F("%")); Serial.print (F("Resolution: ")); Serial.print(sensor.resolution); Serial.println(F("%")); Serial.println(F("------------------------------------")); // Set delay between sensor readings based on sensor details. delayMS = sensor.min_delay / 1000;}void loop() { // Delay between measurements. delay(delayMS); // Get temperature event and print its value. sensors_event_t event; dht.temperature().getEvent(&event); if (isnan(event.temperature)) { Serial.println(F("Error reading temperature!")); } else { Serial.print(F("Temperature: ")); Serial.print(event.temperature); Serial.println(F("°C")); } // Get humidity event and print its value. dht.humidity().getEvent(&event); if (isnan(event.relative_humidity)) { Serial.println(F("Error reading humidity!")); } else { Serial.print(F("Humidity: ")); Serial.print(event.relative_humidity); Serial.println(F("%")); }}

此代码从 DHT 传感器读取温度和湿度,并将其显示在串行监视器上。要使用 DHT22,您需要取消注释将DHTTYPE定义为DHT22 的行

如果您不使用 pin 2 作为 DHT22 输入,请确保编辑电脑DHTPIN的值。

代码说明了使用库读取 DHT 传感器是多么容易。您需要做的就是创建一个表示传感器的对象,然后调用一个事件。该事件将包含湿度和温度,然后您可以提取它们并在代码中使用。

该代码还说明了如何从传感器导出其他参数,它在运行安装程序时显示了许多传感器、温度和湿度设置。

将代码加载到 Arduino 并打开串行监视器,确保速度为 9600 波特。您应该会看到一些传感器参数信息,然后是温度和湿度的连续显示。

这不是您能买到的最准确的传感器,但它易于使用并且可以完成大多数非关键应用的工作。增加湿度是一个很好的功能。

AM2320

AM2320 是一种与 DHT22 外观相似的传感器,其规格也相似。它与 DHT22 的不同之处在于它使用 I2C 总线与其主机进行通信。

AM2320温度传感器

该传感器的温度范围为 -40 至 80 摄氏度,精度为 3%。它在 3.1 到 5.5 伏的电源电压下运行,使其适用于大多数微控制器。

设备的 I2C 地址为 0x5C,不可更改。它具有以下引脚排列:

电脑

AM2320引脚图

AM2320 没有用于 I2C 总线的内部上拉电阻。您可以使用微控制器内部上拉电阻或提供自己的电阻器。

引脚 1 – VDD – 电源电压。引脚 2 – SDA – I2C 串行数据线。引脚 3 – GND – 地引脚 4 – SCL – I2C 时钟线。AM2320 与Arduino 的接线图

因为AM2320使用 I2C 总线将它连接到 Arduino,所以非常简单。这是我使用的电路。

AM2320接线图

我使用的上拉电阻是 3.3K,但从 2.2K 到 10K 的任何值都可以正常工作。

模拟 A4 引脚是 Arduino SDA 线,而引脚 A5 是 SCL 连接。

连接后,您可以下载另一个库,以简化 AM2320 温度和湿度传感器的使用。

AM2320 Arduino 库和代码

与之前的传感器一样,我们将利用 Adafruit 的库来使用传感器。这个库,即 Adafruit AM2320 库,有了它,使用该设备变得非常简单。

查找 Adafruit AM2320 库并使用库管理器将其安装在您的 IDE 中。安装后,您可以运电脑行库中包含的示例代码,一个名为basic_am2320 的代码

此代码还使用了您为上一个实验安装的 Adafruit 统一传感器库。

#include "Adafruit_Sensor.h"#include "Adafruit_AM2320.h"Adafruit_AM2320 am2320 = Adafruit_AM2320();void setup() { Serial.begin(9600); while (!Serial) { delay(10); // hang out until serial port opens } Serial.println("Adafruit AM2320 Basic Test"); am2320.begin();}void loop() { Serial.print("Temp: "); Serial.println(am2320.readTemperature()); Serial.print("Hum: "); Serial.println(am2320.readHumidity()); delay(2000);}

它调用这两个库,然后创建一个名为am2320的对象。该对象在设置期间初始化,然后在循环中调用库 readTemperature 和 readHumidity 函数。结果显示在串行监视器上。

需要注意的一件事是,此代码中未使用 I2C 的 Arduino Wire 库。Adafruit AM2320 库内置了 I2C 连接功能。

加载代码,打开串行监视器并观察温度和湿度读数。您可以将这些与之前从 DHT22 收到的读数进行比较。当我这样做时,我发现温度相当接近,但两个传感器之间的湿度差异很大。

当您想节省一些 I/O 引脚并且已经在使用 I2C 时,该传感器会很好。

TMP36 & LM35

TMP36 和 LM35 封装在 T92 外壳中,使它们类似于小型晶体管。它们还提供表面贴片 (SMD) 封装。

TMP36 和 LM35

这些设备与我们今天使用的其他温度传感器的不同之处在于它们提供校准的模拟输出,温度每升高 1 摄氏度就会增加 10mv。

这两个器件是引脚兼容的,但在范围和精度以及电压要求方面有所不同:

TMP36工作电压范围为 2.7 至 5.5 伏。这使得 TMP36 成为大多数微控制器的理想伴侣。温度范围-40到125摄氏度,可使用到150摄氏度。精度在 2 摄氏度以内具有 500 mV 偏移,可用于测量负温度。

还有一个 TMP37,它的工作温度范围只有 10 – 100 摄氏度。

LM35在 4 到 30 伏的电压范围内工作,因此不适用于 3.3 伏微控制器。温度范围为-55至150摄氏度。精度在0.5摄氏度以内。该设备需要负偏置电压才能读取负温度。

LM35 是两者中精度更高的设备,但为了获得负温度值,您需要为其提供负电压以偏置输出。这使得使用和更改电源要求变得有点困难。

LM25 是一系列模拟温度传感器的一部分。该系列的其他成员包括:

LM335 – 温度数据与开尔文度数成正比。LM34 – 温度数据与华氏度成正比。TMP36 和 LM35 引脚排列

两个设备都有三个连接并共享相同的引脚排列。

TMP36 和 LM35引脚排列

您可以直接将这些设备与灵敏的电压表一起使用来显示温度。像 Arduino 这样具有模数转换器 (ADC) 的微控制器也是一种出色的测量工具。

由于 TMP36 无需负电压即可提供正负温度读数,因此我将在实验中使用它。

TMP36 Arduino 接线图

这是 TMP36 与 Arduino 的连接。

请注意从 Arduino 3.3 伏输出到 AREF(模拟参考)输入的连接。这样做是为了降低 Arduino 内部 ADC 的范围,以便我们可以通过测量获得更好的分辨率。

否则连接非常简单,从 Arduino 5 伏电源为 TMP36 供电,并将传感器输出馈送到模拟输入 A0。如果您愿意,您可以使用不同的模拟输入引脚,只需相应地更改代码即可。

TMP36 Arduino 代码

与前几个传感器不同,我们将编写自己的代码来使用这个传感器。它非常简单,不需要库。

这是我们可以用来在串行监视器上显示温度的代码:

#define aref_voltage 3.3 // 设置参考电压为 3.3V//TMP36 Pin Variablesint tempPin = 1; //将TMP36的模拟输出针设置为1//精度为每度10mV,具有500mV的偏置以测量零下的温度(0mV时是负50度,500mV时是零度)int tempReading; // 传感器的读数void setup(void) { Serial.begin(9600); // 如果想用外部标准参考电压以提高精度 analogReference(EXTERNAL);}void loop(void) { tempReading = analogRead(tempPin); Serial.print("Temp reading = "); Serial.print(tempReading); // the raw analog reading //转换读数成电压值-基于参考电压 float voltage = tempReading * aref_voltage; voltage /= 1024.0; // print out the voltage Serial.print(" - "); Serial.print(voltage); Serial.println(" volts"); // 根据电压转换成温度 float temperatureC = (voltage - 0.5) * 100 ; //在 500 mV的偏置下计算出温度值 //to degrees ((volatge - 500mV) times 100) Serial.print(temperatureC); Serial.println(" degrees C"); // 如果想得到华氏温度 float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0; Serial.print(temperatureF); Serial.println(" degrees F"); delay(1000);}

代码非常简单,因为我们所做的就是从传感器读取模拟电压并将其转换为温度。

关于此代码的主要注意事项是,我们不是将标准 5 伏电压用作 Arduino 中 A/D 转换器的参考。相反,我们使用施加到 AFEF(模拟参考)引脚的电压,这是来自 Arduino 内部稳压器的 3.3 伏电压。

如果你有一个比 3.3 伏特低一点的校准模拟电压,它会工作得更好。另一种提高精度的方法是测量实际的 AREF 电压并使用该值来定义aref_voltage

我们从模拟输入引脚读取值并将 10 位 A/D 转换器值打印到串行监视器。然后我们计算我们正在读取的实际电压,我们也打印出来。最后,我们使用电压来确定温度。

请注意,我们在计算读数之前从输入电压中减去 500mV,TMP36 具有 500mV 的偏移量,以便能够显示负温度。

将代码加载到 Arduino 并尝试一下。当我这样做时,我观察到当我抓住传感器时温度上升,我的体温足以让它上升。

TMP36 和 LM35 是非常精确的温度传感器。如果您需要最高精度,那么 LM35 是更好的选择,但是对于大多数应用,TMP36 足够准确,并且具有无需负偏置电压即可显示负温度的优势。

如果您需要精度,您可能想看看我们的下一个传感器。

MCP9808

在很多时候,我都把最好的留到了最后。

MCP9808 是一款使用 I2C 总线的高精度温度传感器。该设备可以在不读数时“休眠”,使其功耗几乎为零。

我使用了 Adafruit 的 MCP9808 模块。

该设备具有以下规格:

范围为 -40 至 125 摄氏度。精度在0.25摄氏度以内。在 2.7 至 5.5 伏的电压范围内工作,使其适用于几乎所有微控制器或微型计算机。使用 I2C 总线并有八个可选地址。基地址为 0x18。具有内部 I2C 上拉电阻 (10K)。具有可编程警报输出,可设置为在用户定义的温度下触发。输出摄氏和华氏读数。MCP9808 引脚排列

Adafruit 模块具有以下连接:

VDD – 这是电源连接。
GND——接地。
SCL – I2C 时钟。
SDA – I2C 数据。
Alert – 集电极开路可编程警报输出。
A0、A1、A2 – I2C 地址选择引脚。
该模块带有一个公杜邦接头,如果您想在无焊面包板上使用它,您可以将其焊接。

MCP9808 Arduino 连接

MCP9808 是一款内置 10K 上拉电阻的 I2C 设备,因此将其连接到 Arduino 非常简单。

如果您想试验警报输出,您需要提供一个上拉电阻或使用 Arduino 的内部上拉。我不会在我的测试中使用警报功能。

MCP9808 Arduino 代码

Adafruit 使用库再次节省了时间,这并不奇怪,因为我使用的是 Adafruit 模块。他们的库使使用 MCP9808 变得非常简单。在您的库管理器中搜索“MCP9080”并选择Adafruit MCP9808 库

与之前的库不同,这个库不需要使用 Adafruit 统一传感器库。

安装新库后,打开随附的mcp9808test代码

/**************************************************************************//*!This is a demo for the Adafruit MCP9808 breakout----> http://www.adafruit.com/products/1782Adafruit invests time and resources providing this open source code,please support Adafruit and open-source hardware by purchasingproducts from Adafruit!*//**************************************************************************/#include <Wire.h>#include "Adafruit_MCP9808.h"// Create the MCP9808 temperature sensor objectAdafruit_MCP9808 tempsensor = Adafruit_MCP9808();void setup() { Serial.begin(9600); while (!Serial); //waits for serial terminal to be open, necessary in newer arduino boards. Serial.println("MCP9808 demo"); // Make sure the sensor is found, you can also pass in a different i2c // address with tempsensor.begin(0x19) for example, also can be left in blank for default address use // Also there is a table with all addres possible for this sensor, you can connect multiple sensors // to the same i2c bus, just configure each sensor with a different address and define multiple objects for that // A2 A1 A0 address // 0 0 0 0x18 this is the default address // 0 0 1 0x19 // 0 1 0 0x1A // 0 1 1 0x1B // 1 0 0 0x1C // 1 0 1 0x1D // 1 1 0 0x1E // 1 1 1 0x1F if (!tempsensor.begin(0x18)) { Serial.println("Couldn't find MCP9808! Check your connections and verify the address is correct."); while (1); } Serial.println("Found MCP9808!"); tempsensor.setResolution(3); // sets the resolution mode of reading, the modes are defined in the table bellow: // Mode Resolution SampleTime // 0 0.5°C 30 ms // 1 0.25°C 65 ms // 2 0.125°C 130 ms // 3 0.0625°C 250 ms}void loop() { Serial.println("wake up MCP9808.... "); // wake up MCP9808 - power consumption ~200 mikro Ampere tempsensor.wake(); // wake up, ready to read! // Read and print out the temperature, also shows the resolution mode used for reading. Serial.print("Resolution in mode: "); Serial.println (tempsensor.getResolution()); float c = tempsensor.readTempC(); float f = tempsensor.readTempF(); Serial.print("Temp: "); Serial.print(c, 4); Serial.print("*C\t and "); Serial.print(f, 4); Serial.println("*F."); delay(2000); Serial.println("Shutdown MCP9808.... "); tempsensor.shutdown_wake(1); // shutdown MSP9808 - power consumption ~0.1 mikro Ampere, stops temperature sampling Serial.println(""); delay(200);}

该库真正简化了使用 tsi 高级传感器的工作。您还需要加载 Arduino Wire Library 以使用 I2C,该库内置于您的 Arduino IDE。

代码首先加载库,然后定义一个对象来表示传感器。

请注意代码中说明如何更改 I2C 地址的注释。A0、A1 或 A2 引脚均未拉高,传感器地址为 0x18。

代码还将分辨率模式设置为最高设置,即“3”。再次注意解释高分辨率如何增加传感器采样时间的注释。

读取摄氏度或华氏度的温度就像调用readTempCreadTempF函数一样简单。

请注意传感器如何在读数之间进入休眠状态。这显着降低了其电流消耗,使该传感器成为电池供电应用的理想选择。


将代码加载到 Arduino,打开串行监视器并观察读数。它们非常精确。我再次对我的“手指测试”进行了观察,以观察读数随着体温的升高而增加。

如果您的设计需要高精度温度测量,那么选择 MCP9808 绝对不会出错。

结论

您会注意到我们的大部分演示代码都以摄氏度显示温度。如果你更喜欢华氏度,你可以用数学方法转换结果:

(摄氏度 x 1.8)+ 32 = 华氏度

正如我们所见,有多种温度传感器可用于 Arduino 和其他微控制器和微型计算机。它们在接口类型、温度范围、电压要求和精度方面各不相同。

无论您的应用是什么,您都一定会找到一种可以快速且经济地完成工作的应用。


电脑