利用开发板和 18B20 温度传感器实现对环境温度的测量,并在数码管上实 时显示温度值。要求: a. 利用 DS18B20 进行温度检测; b. 能利用数码管正确显示温度信息,温度值保留 1 位小数; c. 环境温度变化时,温度显示跟着变化; d. 能利用键盘预置温度报警范围,并在超出温度范围后报警。
时间: 2024-04-02 12:34:15 浏览: 107
好的,这是一个比较完整的项目,需要考虑多个方面。下面是一个可能的实现方案,仅供参考:
硬件准备:
- Arduino 开发板
- DS18B20 温度传感器
- 共阳极数码管
- 数字键盘
- 蜂鸣器
- 杜邦线等
接线方式:
- DS18B20 温度传感器的 VCC 引脚连接到开发板的 5V 引脚,GND 引脚连接到开发板的 GND 引脚,DQ 引脚连接到开发板的数字引脚 2。
- 共阳极数码管的引脚依次连接到开发板的数字引脚 3、4、5、6、7、8、9。
- 数字键盘的行列引脚连接到开发板的数字引脚 10、11、12、13、A0、A1、A2、A3。
代码实现:
```c
#include <OneWire.h> // 导入 OneWire 库
#include <DallasTemperature.h> // 导入 DallasTemperature 库
// 定义 DS18B20 温度传感器引脚
#define ONE_WIRE_BUS 2
// 创建 OneWire 和 DallasTemperature 对象
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// 定义数码管引脚
int digitPins[] = {3, 4, 5, 6, 7, 8, 9};
// 定义数字键盘引脚
int rowPins[] = {10, 11, 12, 13};
int colPins[] = {A0, A1, A2, A3};
// 定义预设温度范围和报警状态
float minTemp = 18.0;
float maxTemp = 25.0;
bool isAlarm = false;
void setup() {
// 初始化数码管和数字键盘引脚
for (int i = 0; i < 7; i++) {
pinMode(digitPins[i], OUTPUT);
}
for (int i = 0; i < 4; i++) {
pinMode(rowPins[i], INPUT_PULLUP);
}
for (int i = 0; i < 4; i++) {
pinMode(colPins[i], OUTPUT);
digitalWrite(colPins[i], HIGH);
}
// 初始化温度传感器
sensors.begin();
}
void loop() {
// 获取温度值
sensors.requestTemperatures();
float temp = sensors.getTempCByIndex(0);
// 检查温度是否超出预设范围
if (temp < minTemp || temp > maxTemp) {
isAlarm = true;
} else {
isAlarm = false;
}
// 显示温度值
displayTemp(temp);
// 播放报警声音
if (isAlarm) {
tone(13, 1000, 500);
delay(500);
}
// 读取数字键盘输入
char key = readKeypad();
if (key != '\0') {
// 如果按下了数字键,更新预设温度范围
float value = (float)(key - '0');
if (value >= 0 && value <= 9) {
if (minTemp < maxTemp) {
maxTemp = minTemp + value;
} else {
minTemp = maxTemp - value;
}
}
}
}
// 显示温度值
void displayTemp(float temp) {
int integer = (int)temp;
int decimal = (int)(temp * 10) % 10;
int digits[] = {integer / 10, integer % 10, decimal, 10}; // 最后一个数字是小数点
// 显示整数部分
int i = 0;
while (digits[i] == 0 && i < 2) {
i++;
}
for (; i < 3; i++) {
digitalWrite(digitPins[i], LOW);
displayDigit(digits[i]);
delay(5);
digitalWrite(digitPins[i], HIGH);
}
// 显示小数点
digitalWrite(digitPins[2], LOW);
delay(5);
digitalWrite(digitPins[2], HIGH);
// 显示小数部分
digitalWrite(digitPins[3], LOW);
displayDigit(digits[3]);
delay(5);
digitalWrite(digitPins[3], HIGH);
}
// 显示单个数字
void displayDigit(int digit) {
int numPins[] = {A0, A1, A2, A3, 11, 12, 13};
for (int i = 0; i < 7; i++) {
digitalWrite(numPins[i], LOW);
}
switch (digit) {
case 0:
digitalWrite(A0, HIGH);
digitalWrite(A1, HIGH);
digitalWrite(A2, HIGH);
digitalWrite(A3, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
break;
case 1:
digitalWrite(A1, HIGH);
digitalWrite(A2, HIGH);
break;
case 2:
digitalWrite(A0, HIGH);
digitalWrite(A1, HIGH);
digitalWrite(A3, HIGH);
digitalWrite(11, HIGH);
digitalWrite(13, HIGH);
break;
case 3:
digitalWrite(A0, HIGH);
digitalWrite(A1, HIGH);
digitalWrite(A2, HIGH);
digitalWrite(A3, HIGH);
digitalWrite(13, HIGH);
break;
case 4:
digitalWrite(A1, HIGH);
digitalWrite(A2, HIGH);
digitalWrite(11, HIGH);
digitalWrite(13, HIGH);
break;
case 5:
digitalWrite(A0, HIGH);
digitalWrite(A2, HIGH);
digitalWrite(A3, HIGH);
digitalWrite(11, HIGH);
digitalWrite(13, HIGH);
break;
case 6:
digitalWrite(A0, HIGH);
digitalWrite(A2, HIGH);
digitalWrite(A3, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
break;
case 7:
digitalWrite(A0, HIGH);
digitalWrite(A1, HIGH);
digitalWrite(A2, HIGH);
break;
case 8:
digitalWrite(A0, HIGH);
digitalWrite(A1, HIGH);
digitalWrite(A2, HIGH);
digitalWrite(A3, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
break;
case 9:
digitalWrite(A0, HIGH);
digitalWrite(A1, HIGH);
digitalWrite(A2, HIGH);
digitalWrite(A3, HIGH);
digitalWrite(11, HIGH);
digitalWrite(13, HIGH);
break;
case 10:
digitalWrite(A3, HIGH);
break;
}
}
// 读取数字键盘输入
char readKeypad() {
char keys[4][4] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
for (int i = 0; i < 4; i++) {
digitalWrite(colPins[i], LOW);
for (int j = 0; j < 4; j++) {
if (digitalRead(rowPins[j]) == LOW) {
delay(50); // 延时消除抖动
digitalWrite(colPins[i], HIGH);
return keys[j][i];
}
}
digitalWrite(colPins[i], HIGH);
}
return '\0';
}
```
这段代码中,我们使用了 OneWire 库和 DallasTemperature 库来读取 DS18B20 温度传感器的温度值。同时,我们实现了数字键盘输入预设温度范围,并在超出范围时播放报警声音。最后,我们通过数码管显示温度值。需要注意的是,由于 DS18B20 温度传感器输出的温度值精度为 0.5°C,因此我们在显示温度值时只保留了一位小数。
阅读全文