在本篇文章中,我们将学习如何使用Arduino和4位数码管设计基于DS18B20的温度计。只需简单地将Arduino与DS18B20数字防水温度传感器连接,并在共阳极数码管上以摄氏度显示温度值。
DS18B20温度传感器是1线数字温度传感器。它使用密封包装,可通过简单的1-Wire接口精确测量潮湿环境中的温度。它在公共总线上通信。这意味着它可以连接多个设备并仅使用Arduino的一个数字引脚读取其值。
DS18B20防水数字温度传感器 以下是DS18B20传感器的预接线和防水版。当您需要在远处或潮湿的地方进行测量时,非常方便。传感器可以测量-55至125°C(-67°F至+ 257°F)之间的温度。电缆用PVC护套保护。
因为它是数字的,所以即使在很长的距离上也没有任何信号衰减。这些1线制数字温度传感器相当精确,即在大部分范围内为±0.5°C。板载数模转换器可提供高达12位的精度。它们适用于使用单个数字引脚的任何微控制器。
唯一的缺点是它们使用Dallas 1-Wire协议,该协议有些复杂,并且需要一堆代码来解析通信。我们使用一个4.7k电阻,当使用传感器时,这是从DATA数据线引脚到VCC线的上拉电阻。
LM35与DS18B20 DS18B20在出厂时已校准为输出正确的温度。 LM35在出厂时已针对电压(而非温度)进行了校准,而Arduino必须将其转换为温度。
LM35是一个模拟温度传感器,因此输入中的任何失真都会迅速影响读数。但是DS18B20是数字温度传感器,因此输入不会影响输出读数。
如果使用长导线用于一定距离的温度测量,则导线长度会偏离模拟LM35传感器中的值。但是DS18B20是数字传感器,任何输出值都没有影响。
LM35的测量温度范围为−55°C至150°C,而DS18B20的测量温度范围为−50°C至125°C。Arduino的1个数字输出引脚可用于连接多个DS18B20,但LM35则不能。
所需的组件 ● Arduino UNO开发板 ● DS18B20防水温度传感器 ● 共阳极7段数码管 ● 7HC595 ● 面包板 ● 连接跳线
连接电路图
将DS18B20的VDD引脚连接到5V,将GND引脚连接到地。如下图所示,将其数据引脚连接到Arduino的数字引脚2,还连接到4.7K电阻(将4.7K电阻的另一端连接到5V)。
项目工作过程 DS18B20数字温度计提供9至12位(可配置)的温度读数,以指示设备的温度。它通过1-Wire总线进行通信,根据定义,该总线仅需要一条数据线(和地线)即可与中央微处理器进行通信。另外,它可以直接从数据线获取电源,从而无需外部电源。
DS18B20的主要功能是其直接数字温度传感器。用户可将温度传感器的分辨率配置为9、10、11或12位,分别对应于0.5°C、0.25°C、0.125°C和0.0625°C的增量。上电时的默认分辨率为12位。
以摄氏度为单位显示温度的源代码/程序 要使用Arduino和4位7段数码管设计基于DS18B20的温度计,并以摄氏度显示温度,您需要两个不同的库 1. 下载1 Wire库 2. 下载Dallas温度库 将这些添加到库文件到Arduino IDE,然后编译并上传代码。 - #include <OneWire.h>
- #include <DallasTemperature.h>
- #define ONE_WIRE_BUS 2
- OneWire oneWire(ONE_WIRE_BUS);
- DallasTemperature sensors(&oneWire);
- DeviceAddress insideThermometer;
- const int ledPin = 13;// LED connected to digital pin 13
- const int latchPin = 8;// Pin connected to ST_CP of 74HC595
- const int clockPin = 9;// Pin connected to SH_CP of 74HC595
- const int dataPin = 10;// Pin connected to DS of 74HC595
- const int digitPins[4] = {3,4,5,6}; //pins to control the 4 common anode pins of display
- const byte digit[12] = //seven segment digit bits + blank + minus
- {
- B00111111, //0
- B00000110, //1
- B01011011, //2
- B01001111, //3
- B01100110, //4
- B01101101, //5
- B01111101, //6
- B00000111, //7
- B01111111, //8
- B01101111, //9
- B00000000, //Blank
- B01000000 //-
- };
- int digitBuffer[4] = {
- 1};
- int digitScan = 0;
- int soft_scaler = 0;
- float tempC, tempF;
- int tmp;
- boolean sign = false;
- void setup() {
- TCCR2A = 0;
- TCCR2B = (1<<CS21);
- TIMSK2 = (1<<TOIE2);
- TCNT2 = 0;
- pinMode(ledPin, OUTPUT);
- for(int i=0;i<4;i++)
- {
- pinMode(digitPins[i],OUTPUT);
- }
- pinMode(latchPin, OUTPUT);
- pinMode(clockPin, OUTPUT);
- pinMode(dataPin, OUTPUT);
- sensors.begin();
- sensors.getAddress(insideThermometer, 0);
- }
- ISR(TIMER2_OVF_vect) {
- soft_scaler++;
- if(soft_scaler==15)
- {
- refreshDisplay();
- soft_scaler = 0;
- }
- };
- void refreshDisplay()
- {
- for(byte k=0;k<4;k++)
- {
- digitalWrite(digitPins[k], LOW);
- }
- digitalWrite(latchPin, LOW);
- shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
- digitalWrite(latchPin, HIGH);
- delayMicroseconds(50);
- digitalWrite(digitPins[digitScan], HIGH);
- digitalWrite(latchPin, LOW);
- if(digitScan==1)
- {
- shiftOut(dataPin, clockPin, MSBFIRST, ~(digit[digitBuffer[digitScan]] | B10000000));
- }
- else
- {
- shiftOut(dataPin, clockPin, MSBFIRST, ~digit[digitBuffer[digitScan]]);
- }
- digitalWrite(latchPin, HIGH);
- digitScan++;
- if(digitScan>3) digitScan=0;
- }
- void loop()
- {
- digitalWrite(ledPin, HIGH);
- sensors.requestTemperatures();
- tempC = sensors.getTempC(insideThermometer);
- tmp = int(tempC*10);
- if (tempC < 0){
- sign = true;
- tmp = abs(tmp);
- }
- else{
- sign = false;
- }
- if (int(tmp)/1000 == 0){
- digitBuffer[3] = 10;
- if (sign){
- digitBuffer[3] = 11;
- }
- }
- else{
- digitBuffer[3] = int(tmp)/1000;
- }
- if (int(tmp)/1000 == 0 && (int(tmp)%1000)/100 == 0) {
- digitBuffer[2] = 10;
- if (sign){
- digitBuffer[2] = 11;
- digitBuffer[3] = 10;
- }
- }
- else{
- digitBuffer[2] = (int(tmp)%1000)/100;
- }
- digitBuffer[1] = (int(tmp)%100)/10;
- digitBuffer[0] = (int(tmp)%100)%10;
- digitalWrite(ledPin, LOW);
- delay(500);
- }
复制代码
|