树莓派实现简易的温度监控系统

树莓派温度监控系统实验报告

一、实验原理及分析

(一)实验目的

本实验旨在通过树莓派和DS18B20温度传感器搭建一个简单的温度监控系统。该系统能够实时读取房间温度,并根据预设的温度区间,通过蜂鸣器和三色LED灯发出相应的提示信号,以实现对房间温度的智能监控和预警。

(二)实验原理

  1. DS18B20温度传感器:DS18B20是一种数字温度传感器,通过单总线接口与树莓派通信。它能够精确测量温度,并将温度值以数字信号的形式输出。在树莓派上,通过读取/sys/bus/w1/devices/目录下对应传感器文件中的数据,即可获取当前温度值。

DS18B20温度传感器

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

树莓派GPIO管脚图

  1. C语言编程:使用C语言编写程序,实现温度读取、逻辑判断和GPIO控制等功能。C语言具有高效、灵活的特点,能够满足本实验对实时性和性能的要求。

(三)实验分析

  1. 温度区间设定:根据实际需求,预设了房间的适宜温度区间(20.0°C - 25.0°C)和严重不适温度区间(15.0°C - 30.0°C)。当温度处于适宜区间时,表示房间温度舒适;当温度超出适宜区间但未达到严重不适区间时,提示需要采取升温或降温措施;当温度超出严重不适区间时,发出警告信号。

  2. 硬件设备控制逻辑

    • 三色LED灯:通过控制不同颜色的LED灯亮灭,直观地显示当前温度状态。绿灯亮表示温度适宜;蓝灯亮表示温度在适宜范围外但未超出严重不适区间;红灯亮表示温度超出严重不适区间。

    • 蜂鸣器:当温度超出严重不适区间时,蜂鸣器发出声音,起到警示作用。

  3. 程序流程:程序启动后,首先初始化GPIO接口,然后进入循环,不断读取温度传感器的数据,并根据温度值执行相应的控制逻辑,通过蜂鸣器和LED灯发出提示信号。整个过程通过C语言程序实现自动化控制。

二、硬件连接及初步调试

(一)硬件清单

  1. 树莓派开发板
  2. DS18B20数字温度传感器
  3. 蜂鸣器
  4. 三色LED灯(红、绿、蓝)
  5. 杜邦线若干

(二)硬件连接方法

  1. DS18B20温度传感器
  • 正极 接 5V (物理引脚2)
  • 负极 接 0V(物理引脚 6)
  • out 接 GPIO7 物理管脚 7
  1. 蜂鸣器
  • VCC 接 5V(物理管脚 4)
  • I/O 接 GPIO0 (物理管脚 11)
  • GND 接 0V (物理管脚 9)
  1. 三色LED灯

    • R 连接到树莓派的GPIO1(物理引脚12)
    • G 连接到树莓派的GPIO2(物理引脚13)
    • B 连接到树莓派的GPIO3(物理引脚15)
    • GND 接 0V (物理管脚20)

(三)硬件连接注意事项

  1. 确保所有连接正确无误,避免短路或接触不良的情况。

  2. 在连接DS18B20温度传感器时,注意数据引脚、电源引脚和地引脚的正确连接,以保证温度传感器的正常工作。

  3. 对于蜂鸣器和LED灯,注意正负极的连接,避免接反导致设备损坏。另外要注意蜂鸣器是低电平触发还是高电平触发。

  4. 在连接过程中,建议使用面包板进行临时搭建和测试,以确保硬件连接的正确性和稳定性。虽然本实验要求最终不使用面包板,但在调试阶段使用面包板可以方便地进行连接和修改。

(四)初步调试确认设备可用性

  1. 确认温度传感器可用
    cd 到 /sys/bus/w1/devices/ 目录下,查看对应的传感器设备文件下的 w1_slave 文件
    可以看到 环境温度,应该是 20.375摄氏度

  2. 确认蜂鸣器可用
    使用 gpio 0 mode out,将gpio 0端口设置为输出模式,然后再用 gpio write 0 1 设置为高电平,可以听到蜂鸣器发出音响。验证了可用性。

  3. 确认RGB三色灯可用
    使用 gpio 1 mode out, 将 gpio 1端口(即红灯对应的端口)设置为输出模式,然后再用 gpio write 1 1 设置为高电平,可以看到红灯亮起。
    同理可以验证绿灯、蓝灯。

我们还可以使用 gpio readall来看所有端口的状态

三、软件代码编写

(一)代码设计思路

  1. 初始化GPIO接口:在程序开始时,通过system函数调用gpio mode命令,将蜂鸣器和三色LED灯对应的GPIO引脚设置为输出模式。

  2. 读取温度传感器数据:通过打开并读取/sys/bus/w1/devices/目录下对应DS18B20传感器文件的内容,获取当前温度值。使用strstr函数查找包含温度数据的字符串,并通过atof函数将其转换为浮点数。

  3. 控制逻辑实现:根据读取到的温度值与预设的温度区间进行比较,执行相应的控制逻辑。通过调用gpio_set函数设置蜂鸣器和三色LED灯的电平状态,以实现不同的提示信号。

  4. 循环监控:程序进入循环,每隔一定时间(如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亮绿灯:

posted @ 2025-03-23 22:18  lucky_doog  阅读(314)  评论(0)    收藏  举报