一、项目介绍和创意介绍
项目名称:基于Arduino R4的温度控制系统
项目简介:
本项目旨在设计并实现一个基于Arduino R4单片机的环境温度控制系统。该系统使用了温湿度传感器DHT11、OLED显示屏、风扇控制模块以及用户交互按键,形成了一个功能完善、操作简便的温度自动调节系统。
创意介绍:
本项目选择方向为边缘智能、智能设备创意在于将Arduino R4单片机与DHT11传感器、OLED显示屏等硬件有机结合,打造了一个低成本、高效率的温度控制系统。
二、使用到的硬件介绍
- Arduino R4单片机:作为系统的主控核心,负责处理传感器数据、执行控制逻辑以及与用户的交互。
- DHT11温湿度传感器:用于实时监测环境温度,并将数据传递给Arduino R4进行处理。该传感器具有高精度、低功耗等优点,非常适合用于环境控制系统。
- OLED显示屏:用于显示系统当前的工作模式、传感器获得的温度等信息,方便用户了解系统状态。
- 风扇控制模块:根据Arduino R4发出的指令,控制风扇的开关和转速,实现温度调节功能。
- 用户交互按键:提供四个按键,分别用于系统开关机、选择风扇、控制PWM值以及模式切换,实现用户与系统的交互。
- LED和蜂鸣器:通过LED的亮灭和蜂鸣器的响起,实现声光提示效果。
三、方案框图和项目设计思路介绍
arduinor4单片机通过DHT11温湿度传感器识获得温度值,整个系统有两个运行模式,分别是按键模式和自动模式,开机默认按键按键模式,通过按键1控制系统开机和关机,按键2控制选择的风扇,按键3控制输出的PWM值,按键四模式切换进入自动模式,通过串口输入目标温度,选择那个风扇,选择输出的档位,设置好后当环境温度大于控制温度,系统开始运行。通过OLED屏幕显示系统当前的模式和传感器获得的温度,通过不同颜色的LED灯和蜂鸣器实现声光提示。
四、软件流程图和关机代码介绍
包含头文件、定义全局变量、初始化外设
#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);
}
五、功能展示图及说明
整体电路图
按键一功能:开关机
按键二功能:选择风扇,选择风扇1第一个黄色LED灯亮,选择风扇2第二个黄色LED灯亮,同时选择两个风扇两个黄色LED灯都亮
按键三功能:选择风扇档位,指示灯会亮起不同的颜色,一档红色、二挡绿色、三档蓝色。
按键四功能:切换运行模式(按键模式/自动模式)
六、设计中遇到的难题和解决方法
一开始我是打算通过蓝牙模块来为自动运行模式配置参数的,但不知道为什么蓝牙模块现在连不上了,所以就改为直接用串口来设置运行参数了,目前还没解决,准备买一个新的蓝牙模块再来试一下。
七、心得体会
首先,通过本项目,我加深了对Arduino单片机的了解,掌握了其基本原理和编程方法。在编写控制逻辑的过程中,我学会了如何合理利用资源、优化代码结构,提高了编程效率。
其次,在硬件选型与电路设计中,我学会了如何根据实际需求选择合适的元器件,并合理布局电路,确保系统的稳定性和可靠性。
最后,在系统调试与优化阶段,我遇到了不少问题,如传感器数据不准确、风扇控制不稳定等。通过不断排查问题、调整参数,我逐渐掌握了系统调试的方法与技巧,最终成功解决了所有问题。
感谢硬禾科技,感谢贸泽电子,对我们电子爱好者的帮助,祝愿你们越来越好,(づ ̄3 ̄)づ╭❤~(づ ̄3 ̄)づ╭❤~