使用MPU6050芯片中NTC测温模块控制水泵使空调降温的解决方案(附代码)

该方案亮点:

  1. 使用网页操作方式,访问其IP地址后实时显示温度与“自动化状态”
  2. 可通过网页控制其开关水状态(点击后会自动退出自动化模式,请注意用水量控制),也可控制其自动化模式开关状态。
  3. 自动化:超过30°C自动开水,低于后停水(自动化选项开启时有效)

起因:家中空调制冷效果太差,面对2024年湖北的夏天根本无效,之后我通过控制变量法得出是外机后背板的散热出了问题(被柜板挡住),最终找到解决方案:

用水泵向上喷水从而实现降温

于是我开始了探索:

  1. TB上购买水泵,继电器等模块,实现控制
  2. 直接通电,能够运行,OK!

250V继电器模块

接着,又有新问题产生了:

一直喷水太浪费了,且需要手动开关

于是我便想到了去年做火箭姿态矫正的MPU6050六轴加速度传感器,其参数中有一个NTC温度模块

其本身并非专门用于测温,而是测芯片温度,但MPU6050芯片自身的热量可忽略不计,故可看作环境温度

于是将其从火箭中拆出来,接上ESP32C3模块,具体接线方式如下:

1
2
3
4
5
VCC  ---  3V3
GND --- GND
SDA --- P8 (SDA)
SCL --- P9 (SCL)
左侧为MPU6050,右侧为ESP32C3引脚

最终接线

编写程序(使用ArduinoIDE),编译并上传,灯亮了,输出了实时温度

接下来继续完善用户体验,界面,操作,统统安排! 最终代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
#include <Adafruit_MPU6050.h>                                                 //include library
#include <Adafruit_Sensor.h> //include library
#include <WiFi.h>
#include <ESPAsyncWebServer.h> // 包含异步Web服务器库文件
AsyncWebServer server(80); // 创建WebServer对象, 端口号80
// 使用端口号80可以直接输入IP访问,使用其它端口需要输入IP:端口号访问
// 一个储存网页的数组
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h2>空调浇水控制</h2>
<!-- 创建一个ID位dht的盒子用于显示获取到的数据 -->
<div id="dht">
</div>
<button onclick="set()"> 开启/关闭浇水 </button>
<button onclick="autoset()"> 开启/关闭自动 </button>
</body>
<script>
// 按下按钮会运行这个JS函数
function set() {
var payload = "ESP32"; // 需要发送的内容
// 通过get请求给 /set
var xhr = new XMLHttpRequest();
xhr.open("GET", "/set?value=" + payload, true);
xhr.send();
}
function autoset() {
var payload = "ESP32"; // 需要发送的内容
// 通过get请求给 /set
var xhr = new XMLHttpRequest();
xhr.open("GET", "/auto?value=" + payload, true);
xhr.send();
}
// 设置一个定时任务, 1000ms执行一次
setInterval(function () {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
// 此代码会搜索ID为dht的组件,然后使用返回内容替换组件内容
document.getElementById("dht").innerHTML = this.responseText;
}
};
// 使用GET的方式请求 /dht
xhttp.open("GET", "/dht", true);
xhttp.send();
}, 200)
</script>)rawliteral";

Adafruit_MPU6050 mpu; //Instantiate object
#define mpu6050TimeInterval 100 //Detect the time interval of a trip
unsigned long mpu6050Times = 0; //Record the device running time
float mpu6050Temp = 0; //Define a variable
float xAcceleration , yAcceleration , zAcceleration ; //Define three variables
float xAccele , yAccele , zAccele ; //Define three variables
float xGyro = 0, yGyro = 0, zGyro = 0; //Define three variables
float gravity = 9.8; //Define a variable
int isdone=0;
bool iswater=0,isauto=1;





String Merge_Data(void)
{
int Humidity = 50;// 此处应为获取温度代码
int Temperature = 26;// 此处应为获取湿度代码
// 将温湿度打包为一个HTML显示代码
String dataBuffer = "<p>";
dataBuffer += "<h1>传感器数据 </h1>";
dataBuffer += "<b>温度: </b>";
dataBuffer += String(mpu6050Temp);
dataBuffer += "<br />";
dataBuffer += "<b>当前浇水状态: </b>";
dataBuffer += String(iswater);
dataBuffer += "<br />";
dataBuffer += "<b>当前自动状态: </b>";
dataBuffer += String(isauto);
dataBuffer += "<br /></p>";
// 最后要将数组返回出去
return dataBuffer;
}

// 下发处理回调函数
void Config_Callback(AsyncWebServerRequest *request)
{
iswater=!iswater;
isauto=0;
request->send(200, "text/plain", "OK"); // 发送接收成功标志符
}
// 下发处理回调函数
void Auto_Callback(AsyncWebServerRequest *request)
{
isauto=!isauto;
request->send(200, "text/plain", "OK"); // 发送接收成功标志符
}

void setup()
{


WiFi.begin("Gundan","lqy170309");
while(WiFi.status()!=WL_CONNECTED){ //未连接上
delay(500);
Serial.println("正在连接...");
}
Serial.println("连接成功!"); //连接上


pinMode(1,OUTPUT);

// 添加HTTP主页,当访问的时候会把网页推送给访问者
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request)
{ request->send_P(200, "text/html", index_html); });
// 设置反馈的信息,在HTML请求这个Ip/dht这个链接时,返回打包好的传感器数据
server.on("/dht", HTTP_GET, [](AsyncWebServerRequest *request)
{ request->send_P(200, "text/plain", Merge_Data().c_str()); });
server.on("/set", HTTP_GET, Config_Callback); // 绑定配置下发的处理函数
server.on("/auto", HTTP_GET, Auto_Callback); // 绑定配置下发的处理函数
server.begin(); // 初始化HTTP服务器


Serial.begin(115200); //Example Set the baud rate of the serial port to 9600
if (!mpu.begin()) { // Try to initialize!
while (millis() - 1000) { //Wait for the device to come online
Serial.println("Failed to find MPU6050 chip");
}
}
mpu.setAccelerometerRange(MPU6050_RANGE_16_G); //Set the accelerometer range
mpu.setGyroRange(MPU6050_RANGE_250_DEG); //Set the gyroscope range
mpu.setFilterBandwidth(MPU6050_BAND_21_HZ); //Set filtering bandwidth
Serial.println("Go online!");
}

void loop() {
getMpu6050Data(); //Obtain data about the mpu6050

if(isauto==1){
if(mpu6050Temp>=30){
digitalWrite(1,HIGH);
iswater=1;
}else if(mpu6050Temp<30){
digitalWrite(1,LOW);
iswater=0;
}
}else if(isauto==0){
digitalWrite(1,iswater);
}

}

void getMpu6050Data() {
if (millis() - mpu6050Times >= mpu6050TimeInterval) { //This command is executed once in a while
mpu6050Times = millis();

sensors_event_t a, g, temp; //Set three variables
mpu.getEvent(&a, &g, &temp); //Read the corresponding three values

mpu6050Temp = temp.temperature; //Acquired temperature

xAcceleration = a.acceleration.x ; //Acquired acceleration
yAcceleration = a.acceleration.y ; //Acquired acceleration
zAcceleration = a.acceleration.z ; //Acquired acceleration

xAccele = xAcceleration / gravity; //Convert the units of acceleration into g
yAccele = yAcceleration / gravity; //Convert the units of acceleration into g
zAccele = zAcceleration / gravity; //Convert the units of acceleration into g

xGyro = g.gyro.x; //Acquired angular velocity
yGyro = g.gyro.y; //Acquired angular velocity
zGyro = g.gyro.z; //Acquired angular velocity

Serial.print("Temp: ");
Serial.print(mpu6050Temp); //Serial print temperature
Serial.print(" , x-accele: ");
Serial.print(xAccele); //Serial print acceleration
Serial.print(" , y-accele: ");
Serial.print(yAccele); //Serial print acceleration
Serial.print(" , z-accele: ");
Serial.print(zAccele); //Serial print acceleration

Serial.print(" , x-gyro:");
Serial.print(xGyro); //Serial port print angular speed
Serial.print(" , y-gyro:");
Serial.print(yGyro); //Serial port print angular speed
Serial.print(" , z-gyro:");
Serial.println(zGyro); //Serial port print angular speed
}
}

代码中依然保留了对MPU6050其他数据的读取,如果需要增加功能可直接使用;

亮点:

  1. 使用网页操作方式,访问其IP地址后实时显示温度与“自动化状态”
  2. 可通过网页控制其开关水状态(点击后会自动退出自动化模式,请注意用水量控制),也可控制其自动化模式开关状态。
  3. 自动化:超过30°C自动开水,低于后停水(自动化选项开启时有效)
  4. 网页尚未添加CSS美化,仅做功能实现演示,如有需要可自行添加CSS美化

网页端面板


使用MPU6050芯片中NTC测温模块控制水泵使空调降温的解决方案(附代码)
https://www.ycxhl.top/使用MPU6050芯片中NTC测温模块控制水泵使空调降温的解决方案(附代码)/
作者
YcXhl
发布于
2024年10月26日
许可协议