树莓派实现简易的温度监控系统
树莓派温度监控系统实验报告
一、实验原理及分析
(一)实验目的
本实验旨在通过树莓派和DS18B20温度传感器搭建一个简单的温度监控系统。该系统能够实时读取房间温度,并根据预设的温度区间,通过蜂鸣器和三色LED灯发出相应的提示信号,以实现对房间温度的智能监控和预警。
(二)实验原理
- DS18B20温度传感器:DS18B20是一种数字温度传感器,通过单总线接口与树莓派通信。它能够精确测量温度,并将温度值以数字信号的形式输出。在树莓派上,通过读取
/sys/bus/w1/devices/目录下对应传感器文件中的数据,即可获取当前温度值。
DS18B20温度传感器

- 树莓派GPIO控制:树莓派提供了丰富的GPIO(通用输入输出)接口,可以通过编程控制这些接口的电平状态。本实验中,利用树莓派的GPIO接口连接蜂鸣器和三色LED灯,通过控制GPIO引脚的高低电平,实现对蜂鸣器和LED灯的控制。
树莓派GPIO管脚图

- C语言编程:使用C语言编写程序,实现温度读取、逻辑判断和GPIO控制等功能。C语言具有高效、灵活的特点,能够满足本实验对实时性和性能的要求。
(三)实验分析
-
温度区间设定:根据实际需求,预设了房间的适宜温度区间(20.0°C - 25.0°C)和严重不适温度区间(15.0°C - 30.0°C)。当温度处于适宜区间时,表示房间温度舒适;当温度超出适宜区间但未达到严重不适区间时,提示需要采取升温或降温措施;当温度超出严重不适区间时,发出警告信号。
-
硬件设备控制逻辑:
-
三色LED灯:通过控制不同颜色的LED灯亮灭,直观地显示当前温度状态。绿灯亮表示温度适宜;蓝灯亮表示温度在适宜范围外但未超出严重不适区间;红灯亮表示温度超出严重不适区间。
![]()
-
蜂鸣器:当温度超出严重不适区间时,蜂鸣器发出声音,起到警示作用。
![]()
-
-
程序流程:程序启动后,首先初始化GPIO接口,然后进入循环,不断读取温度传感器的数据,并根据温度值执行相应的控制逻辑,通过蜂鸣器和LED灯发出提示信号。整个过程通过C语言程序实现自动化控制。
二、硬件连接及初步调试
(一)硬件清单
- 树莓派开发板
- DS18B20数字温度传感器
- 蜂鸣器
- 三色LED灯(红、绿、蓝)
- 杜邦线若干
(二)硬件连接方法
- DS18B20温度传感器:
- 正极 接 5V (物理引脚2)
- 负极 接 0V(物理引脚 6)
- out 接 GPIO7 物理管脚 7
- 蜂鸣器:
- VCC 接 5V(物理管脚 4)
- I/O 接 GPIO0 (物理管脚 11)
- GND 接 0V (物理管脚 9)
-
三色LED灯:
- R 连接到树莓派的GPIO1(物理引脚12)
- G 连接到树莓派的GPIO2(物理引脚13)
- B 连接到树莓派的GPIO3(物理引脚15)
- GND 接 0V (物理管脚20)
(三)硬件连接注意事项
-
确保所有连接正确无误,避免短路或接触不良的情况。
-
在连接DS18B20温度传感器时,注意数据引脚、电源引脚和地引脚的正确连接,以保证温度传感器的正常工作。
-
对于蜂鸣器和LED灯,注意正负极的连接,避免接反导致设备损坏。另外要注意蜂鸣器是低电平触发还是高电平触发。
-
在连接过程中,建议使用面包板进行临时搭建和测试,以确保硬件连接的正确性和稳定性。虽然本实验要求最终不使用面包板,但在调试阶段使用面包板可以方便地进行连接和修改。
(四)初步调试确认设备可用性
-
确认温度传感器可用
cd 到 /sys/bus/w1/devices/ 目录下,查看对应的传感器设备文件下的 w1_slave 文件
可以看到 环境温度,应该是 20.375摄氏度
![]()
-
确认蜂鸣器可用
使用gpio 0 mode out,将gpio 0端口设置为输出模式,然后再用gpio write 0 1设置为高电平,可以听到蜂鸣器发出音响。验证了可用性。 -
确认RGB三色灯可用
使用gpio 1 mode out, 将 gpio 1端口(即红灯对应的端口)设置为输出模式,然后再用gpio write 1 1设置为高电平,可以看到红灯亮起。
同理可以验证绿灯、蓝灯。
我们还可以使用 gpio readall来看所有端口的状态

三、软件代码编写
(一)代码设计思路
-
初始化GPIO接口:在程序开始时,通过
system函数调用gpio mode命令,将蜂鸣器和三色LED灯对应的GPIO引脚设置为输出模式。 -
读取温度传感器数据:通过打开并读取
/sys/bus/w1/devices/目录下对应DS18B20传感器文件的内容,获取当前温度值。使用strstr函数查找包含温度数据的字符串,并通过atof函数将其转换为浮点数。 -
控制逻辑实现:根据读取到的温度值与预设的温度区间进行比较,执行相应的控制逻辑。通过调用
gpio_set函数设置蜂鸣器和三色LED灯的电平状态,以实现不同的提示信号。 -
循环监控:程序进入循环,每隔一定时间(如1秒)读取一次温度数据,并根据当前温度执行控制逻辑,实现对房间温度的实时监控。
(二)代码实现
以下是完整的C语言代码实现:
/*
树莓派,温度传感器(DS18B20),蜂鸣器,三极管
实验:编写C语言程序,输入自定义的房间适宜温度区间和严重不适温度区间,输出房间温度、
适宜区间内输出温度适宜,高于适宜区间输出方法0(降温),低于适宜区间输出方法1(升温),如果在严重不适区间以外还输出注意房间温度。
三极管:温度在适宜范围内亮绿灯,在适宜范围外和严重不适范围内亮蓝灯,超出严重不适范围亮红灯。
蜂鸣器:在严重不适范围外发出声音。
已知:温度传感器GPIO 7,
进入/sys/bus/w1/devices 目录
ls 列出文件,28-021792455bae 就是我的传感器,不同的传感器序列号不一样,这串数字就是序列号。
cat 28-021792455bae /w1_slave
蜂鸣器 GPIO 0
三极管的 RGB 三色分别接 GPIO 1 2 3
命令是:gpio x mode out 设置GPIO X为输出模式
gpio x write 1 设置高电平
gpio x write 0 设置低电平
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#define TEMP_FILE_PATH "/sys/bus/w1/devices/28-021792455bae/w1_slave" // 本机的DS18B20设备路径
// GPIO引脚定义
#define BUZZER_PIN 0
#define LED_RED_PIN 1
#define LED_GREEN_PIN 2
#define LED_BLUE_PIN 3
// 初始化GPIO
void gpio_init() {
system("gpio mode 0 out"); // 设置蜂鸣器引脚为输出模式
system("gpio mode 1 out"); // 设置红色LED引脚为输出模式
system("gpio mode 2 out"); // 设置绿色LED引脚为输出模式
system("gpio mode 3 out"); // 设置蓝色LED引脚为输出模式
}
// 设置GPIO电平
void gpio_set(int pin, int value) {
char command[32];
sprintf(command, "gpio write %d %d", pin, value);
system(command);
}
// 读取DS18B20温度
float read_temperature() {
int fd;
char buf[128];
char tempBuf[6];
float temp = -128.0;
fd = open(TEMP_FILE_PATH, O_RDONLY);
if (fd < 0) {
perror("open device file error");
return temp;
}
if (read(fd, buf, sizeof(buf)) < 0) {
perror("read() error");
close(fd);
return temp;
}
close(fd);
char *t_pos = strstr(buf, "t=");
if (t_pos) {
t_pos += 2; // 跳过 "t=" 后的两个字符
temp = atof(t_pos) / 1000.0; // 转换为浮点数
}
return temp;
}
int main() {
float temp;
// 定义温度区间
float comfort_low = 20.0; // 适宜温度区间低值
float comfort_high = 25.0; // 适宜温度区间高值
float severe_low = 15.0; // 严重不适温度区间低值
float severe_high = 30.0; // 严重不适温度区间高值
gpio_init();
while (1) {
temp = read_temperature();
if (temp == -128.0) {
printf("读取温度失败!\n");
continue;
}
printf("当前房间温度:%.2f°C\n", temp);
if (temp >= comfort_low && temp <= comfort_high) {
printf("温度适宜\n");
gpio_set(LED_GREEN_PIN, 1); // 绿灯亮
gpio_set(LED_RED_PIN, 0); // 红灯灭
gpio_set(LED_BLUE_PIN, 0); // 蓝灯灭
gpio_set(BUZZER_PIN, 0); // 蜂鸣器关闭
} else if (temp > comfort_high && temp <= severe_high) {
printf("方法0(降温)\n");
gpio_set(LED_BLUE_PIN, 1); // 蓝灯亮
gpio_set(LED_GREEN_PIN, 0); // 绿灯灭
gpio_set(LED_RED_PIN, 0); // 红灯灭
gpio_set(BUZZER_PIN, 0); // 蜂鸣器关闭
} else if (temp < comfort_low && temp >= severe_low) {
printf("方法1(升温)\n");
gpio_set(LED_BLUE_PIN, 1); // 蓝灯亮
gpio_set(LED_GREEN_PIN, 0); // 绿灯灭
gpio_set(LED_RED_PIN, 0); // 红灯灭
gpio_set(BUZZER_PIN, 0); // 蜂鸣器关闭
} else {
printf("注意房间温度!\n");
gpio_set(LED_RED_PIN, 1); // 红灯亮
gpio_set(LED_GREEN_PIN, 0); // 绿灯灭
gpio_set(LED_BLUE_PIN, 0); // 蓝灯灭
gpio_set(BUZZER_PIN, 1); // 蜂鸣器开启
}
sleep(1); // 每1秒读取一次温度
}
return 0;
}
程序执行成功:
可以正常输出温度,并监控是否在合理区间内。

LED亮绿灯:





浙公网安备 33010602011771号