M-Design设计竞赛 - 基于ArduinoR4的温度控制系统
该项目使用了Arduinor4单片机,实现了温度控制的设计,它的主要功能为:通过温度传感器获得环境温度,并在OLED屏幕上显示,通过按键驱动风扇控制温度。
标签
Arduino
温度传感器
M-Design
TTXS
更新2025-04-01
26

一、项目介绍和创意介绍

项目名称:基于Arduino R4的温度控制系统

项目简介

本项目旨在设计并实现一个基于Arduino R4单片机的环境温度控制系统。该系统使用了温湿度传感器DHT11、OLED显示屏、风扇控制模块以及用户交互按键,形成了一个功能完善、操作简便的温度自动调节系统。

创意介绍

本项目选择方向为边缘智能、智能设备创意在于将Arduino R4单片机与DHT11传感器、OLED显示屏等硬件有机结合,打造了一个低成本、高效率的温度控制系统。

二、使用到的硬件介绍

  1. Arduino R4单片机:作为系统的主控核心,负责处理传感器数据、执行控制逻辑以及与用户的交互。
  2. DHT11温湿度传感器:用于实时监测环境温度,并将数据传递给Arduino R4进行处理。该传感器具有高精度、低功耗等优点,非常适合用于环境控制系统。
  3. OLED显示屏:用于显示系统当前的工作模式、传感器获得的温度等信息,方便用户了解系统状态。
  4. 风扇控制模块:根据Arduino R4发出的指令,控制风扇的开关和转速,实现温度调节功能。
  5. 用户交互按键:提供四个按键,分别用于系统开关机、选择风扇、控制PWM值以及模式切换,实现用户与系统的交互。
  6. LED和蜂鸣器:通过LED的亮灭和蜂鸣器的响起,实现声光提示效果。

三、方案框图和项目设计思路介绍

1742020762814.png

arduinor4单片机通过DHT11温湿度传感器识获得温度值,整个系统有两个运行模式,分别是按键模式和自动模式,开机默认按键按键模式,通过按键1控制系统开机和关机,按键2控制选择的风扇,按键3控制输出的PWM值,按键四模式切换进入自动模式,通过串口输入目标温度,选择那个风扇,选择输出的档位,设置好后当环境温度大于控制温度,系统开始运行。通过OLED屏幕显示系统当前的模式和传感器获得的温度,通过不同颜色的LED灯和蜂鸣器实现声光提示。

四、软件流程图和关机代码介绍

image.png

包含头文件、定义全局变量、初始化外设


#include "DHTWD.h"
#include "OLED.h"
#include "KEY.h"
#include "motor.h"
#include "LED.h"
#include "userserial.h"
bool detect = false;   //控制开关
bool ModeKey4 = false;    //按键四状态
int energy = 0;       //控制风扇的PWM值
int select = 0;       //控制风扇的选择值
int pressCount = 0;   //按键二的计数
int keypressCount = 0; //按键三的计数
void setup() {


  Serial.begin(15200);  //串口波特率
  InitDHT();            //初始化DHT11
  Init_OLED();          //初始化OLED
  key_setup();          //初始化按键
  Initled();            //初始化LED
  InitMotor();          //初始化电机
}


按键扫描,通过不同的按键执行不同的功能,


    // 按键处理部分
    g_key = key_scan(0);         // 扫描按键
    switch (g_key) {
        case KEY1_PRESS:
            Serial.println("按键一按下");
            detect = !detect;              // 切换开关状态
            if (detect) {                  //detect = 1开机
                Serial.println("开机");  
                DisplayOpen();             //OLED屏幕显示开机
                DisplayKey();              //显示模式,默认为按键模式
            } else {
                Serial.println("关机");
                CloseLed();
select = 0;
                energy = 0;
                pressCount = 0;            // 关机时重置按键二的计数
                keypressCount = 0;         // 关机时重置按键三的计数
                PwnLedOff();
                DisplayShut();             // OLED屏幕显示关机
            }
            break;
        case KEY2_PRESS: {
            Serial.println("按键二 按下");
            if (detect) {                  // 确定开机状态
                pressCount = (pressCount % 4) + 1;  // 获取按下次数,循环计数1-2-3-1
               
                // 根据计数选择风扇
                if (pressCount == 1)
                {
                    OpenLed1();            // 打开LED1
                    select = 1;            // 选择风扇1
                }
                else if (pressCount == 2)
                {
                    OpenLed2();            // 打开LED2
                    select = 2;            // 选择风扇2
                }
                else if (pressCount == 3)
                {
                    OpenLed();             // 打开LED1和LED2  
                    select = 3;            // 选择风扇1&2
                }
                else if (pressCount == 4)
                {
                    CloseLed();            // 关闭LED1和LED2
                    select = 4;            // 取消风扇选择
                }
            }
            break;
        }
        case KEY3_PRESS:
            Serial.println("按键三 按下");
            if (detect) {                  // 确定开机状态
                keypressCount = (keypressCount % 4) + 1;  // 获取按下次数,实现1-2-3-4循环
               
                // 根据计数设置风扇PWM值
                if (keypressCount == 1) {
                    energy = 90;          //一档风力
                    PwmLedRed();          // 红色LED
                } else if (keypressCount == 2) {
                    energy = 140;         //二档风力
                    PwmLedGreen();        // 绿色LED
                } else if (keypressCount == 3) {
                    energy = 190;         //三档风力
                    PwmLedBlue();         // 蓝色LED
                } else if (keypressCount == 4) {
                    energy = 0;           // 第四次按风扇停止
                    PwnLedOff();          // 关闭所有LED
                }
               
                // 调试输出
                Serial.print("Energy set to: ");
                Serial.println(energy);
            }
            break;
        case KEY4_PRESS:
            Serial.println("按键四 按下");
            ModeKey4 = !ModeKey4;         // 切换模式
            keybuzzer();                  // 按键四发出蜂鸣声
            detect = 0;                   //进入关机状态,关闭温度检测
            CloseLed();                   // 关闭风扇选择指示灯
            PwnLedOff();                  // 关闭档位选择指示灯
            OffMotor();                   // 关闭风扇
            energy = 0;                   // 关机时重置风扇PWM值
            pressCount = 0;               // 关机时重置按键二的计数
            keypressCount = 0;            // 关机时重置按键三的计数      
            DisplayKey();                 //OLED屏幕显示自动运行
            if (ModeKey4 == 1) {
            // 自动模式          
             getUserInputAndSetFan();  // 首次进入需要配置
            }
            else{
select = 0;
              detect = 1;  
            }


        break;
    }


通过串口输入控制系统的参数


void getUserInputAndSetFan() {
    // 提示用户系统进入自动运行模式,并告知输入配置指令的格式
    Serial.println("系统进入自动运行模式,请输入配置指令:");
    Serial.println("格式:目标温度,风扇选择,风扇档位");
    Serial.println("风扇选择:1-风扇一,2-风扇二,3-风扇一和二");
    // 循环等待,直到串口接收到用户输入的数据
    while (Serial.available() == 0) {
    // 等待用户输入指令
   }
    // 从串口读取一行数据,直到遇到换行符为止
    String input = Serial.readStringUntil('\n');
    // 查找输入字符串中第一个逗号的位置
    int comma1 = input.indexOf(',');
    // 从第一个逗号的下一个位置开始查找第二个逗号的位置
    int comma2 = input.indexOf(',', comma1 + 1);
    // 提取第一个逗号之前的部分,并将其转换为整数,作为目标温度
    targetTemperature = input.substring(0, comma1).toInt();
    // 提取第一个逗号和第二个逗号之间的部分,并将其转换为整数,作为风扇选择
    fanSelection = input.substring(comma1 + 1, comma2).toInt();
    // 提取第二个逗号之后的部分,并将其转换为整数,作为风扇档位
    fanGear = input.substring(comma2 + 1).toInt();
    // 打印解析得到的目标温度
    Serial.print("目标温度:");
    Serial.println(targetTemperature);
    // 打印解析得到的风扇选择
    Serial.print("风扇选择:");
    Serial.println(fanSelection);
    // 打印解析得到的风扇档位
    Serial.print("风扇档位:");
    Serial.println(fanGear);
    // 调用 setFan 函数,根据用户选择的风扇和档位设置风扇
    setFan(fanSelection, fanGear);
    // 调用 controlTemperature 函数,根据用户输入的目标温度控制温度
    controlTemperature(targetTemperature);
}

五、功能展示及说明

e2f3a371b26c08004d7fb8b6ec52239.jpg

整体电路图

ac0a73195187e81b3abffe627457282.jpg1c2c32325dde5c1ab3505fef60327b8.jpg

按键一功能:开关机

bee8063e6faa79f03a6ab55edbe2914.jpgff739f35fba7c8173e6264d2cc6a24a.jpg9ab5b719469525a460e6af92846b9c3.jpg

按键二功能:选择风扇,选择风扇1第一个黄色LED灯亮,选择风扇2第二个黄色LED灯亮,同时选择两个风扇两个黄色LED灯都亮

c988dbbbf44fe0eb66cd4036ed87c90.jpg9b3194c65de9c496a7e174a6ac04324.jpg7e43d838713a248c1bce9f711767f33.jpg

按键三功能:选择风扇档位,指示灯会亮起不同的颜色,一档红色、二挡绿色、三档蓝色。

34079207e735dd278649411fd6f5d57.jpg3e062bbae48b459df330823877f8d30.jpg

按键四功能:切换运行模式(按键模式/自动模式)


六、设计中遇到的难题和解决方法

一开始我是打算通过蓝牙模块来为自动运行模式配置参数的,但不知道为什么蓝牙模块现在连不上了,所以就改为直接用串口来设置运行参数了,目前还没解决,准备买一个新的蓝牙模块再来试一下。

七、心得体会

首先,通过本项目,我加深了对Arduino单片机的了解,掌握了其基本原理和编程方法。在编写控制逻辑的过程中,我学会了如何合理利用资源、优化代码结构,提高了编程效率。

其次,在硬件选型与电路设计中,我学会了如何根据实际需求选择合适的元器件,并合理布局电路,确保系统的稳定性和可靠性。

最后,在系统调试与优化阶段,我遇到了不少问题,如传感器数据不准确、风扇控制不稳定等。通过不断排查问题、调整参数,我逐渐掌握了系统调试的方法与技巧,最终成功解决了所有问题。

感谢硬禾科技,感谢贸泽电子,对我们电子爱好者的帮助,祝愿你们越来越好,(づ ̄3 ̄)づ╭❤~(づ ̄3 ̄)づ╭❤~

附件下载
sketch_mar8a.zip
项目代码
团队介绍
个人
评论
0 / 100
查看更多
猜你喜欢
M-Design设计竞赛 - 8通道高精度温度采集器该项目使用了Platformio语言、立创EDA,实现了8通道工业级温度采集器的设计,它的主要功能为:使用立创EDA绘制了电路图,基于面包板模块化搭建硬件,采用Freertos框架设计多线程任务,支持串口AT指令。。 该项目使用了立创·ESP32S3R8N8,MAX31856模块 热电偶模块,实现了24位温度采集的设计,它的主要功能为:采用两路SPI通讯获取8通道24位温度采集,可串口最高5Hz输出8通道温度数据,Serialstudio可视化。。 该项目使用了ModBus 485 USB模块,实现了ModBus RTU的设计,它的主要功能为:采用ModBus Poll进行温度数据问询,方便用户进行数据查询与采集可视化。。
2345vor
65
M-Design设计竞赛 - 基于ESP32的温度采集与显示该项目使用了ESP32、显示屏、bmp280,实现了温度折线显示的设计,它的主要功能为:采集环境温度,并以折线的形式显示出来。
liuliuliu
28
M-Design设计竞赛 - 基于Arduino Nano Matter实现空气质量检测该项目使用了Arduino Nano Matter开发板,实现了空气质量检测的设计,它的主要功能为:支持一氧化碳、氢气、氨气、甲烷、乙醇五种气体浓度的测量;通过OLED屏幕实时显示当前气体浓度;可以通过板载的按键,实现测试气体类型的切换;可以使用手机通过BLE连接至开发板,通过BLE发送指令,实现测试气体类型的切换;可以通过BLE实时查看当前气体浓度,当气体浓度超过一定阈值时,发出警报。
pet
20
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号