ESP8266太阳能气象站

概述

这篇文章介绍了使用太阳能板、ESP8266开发板和 DHT11 传感器模块制作气象站,开发板定时采集温湿度数据上报到服务器,白天使用太阳能板给 18650 电池充电,晚上和光线弱的环境使用电池供电,支持低功耗长时间运行。

物料

硬件

名称 数量 价格 备注
ESP8266 1 ¥10
3V太阳能板 1 ¥3 已焊线,60*60多晶滴胶板
DHT11温湿度传感器模块 1 ¥2.2
TP4056锂电池充电模块 1 ¥6.8 购买的套装,包含充电模块、升压板、电池盒
移动电源升压板(带USB口) 1 -
18650电池盒(单节) 1 -
18650锂电池 1 ¥10
MT3608升压板 1 ¥4
杜邦线(母对母) 4 0.4 连接ESP8266与DHT11模块,短接ESP8266的D0与RST引脚
导线 4 0.2 焊接连接板卡

软件

名称 版本 下载链接 备注
Arduino 1.8.9 https://www.arduino.cc/en/software 编写、烧录ESP8266代码
IntelliJ IDEA 2025.2.3 https://www.jetbrains.com/idea/ 编写、运行服务端代码
MySQL 8.0.39 https://www.mysql.com/cn/downloads/ 存储上报的温湿度传感器数据
Docker Desktop 4.79.0 https://www.docker.com/products/docker-desktop/ (可选)用于安装MySQL

工具

名称 用途 备注
Windows电脑 编写、烧录 ESP8266 代码,编写、运行服务端代码与数据库
电烙铁 用于焊接导线和板卡模块
micro数据线 开发调试时将 ESP8266连到电脑上烧录程序,后期连接开发板和锂电池升压板,用于给开发板供电
万用表 检测 MT3608升压板输出电压
直流电源 (可选)调试阶段可给MT3608升压板供电,用于调节配置

原理

太阳能充电

本次使用的太阳能板标称输出电压为 3V,经测试在光照充足的情况下,输出电压为 3.5V,光照不足时电压降低,此电压无法直接给 ESP8266 供电(需要5V),也无法给锂电池充电(锂电池充电电压需高于4.2V)。

因此,需要使用 DC-DC 升压板,将 3.5V先升压到 5V,再送进充电模块。本次使用的是 MT3608 模块,支持输入2.5V-15V,输出电压可调(最大 28V),最大输出电流 2A。

mt3608

本项目使用带充放电保护的 TP4056 锂电池充电模块,太阳能板提供的 3.5V电压经过 MT3608 升压到 5V,再输入到 TP4056 为电池充电。

tp4056

锂电池供电

本项目使用单节 18650 电池作为电源,充满时能够提供 4.2V输出,但 ESP8266 需要 5V电源输入,因此在电池输出端还需要使用升压模块将电压提升到 5V给开发板供电。

本次使用的是带 USB口的锂电池升压模块,能够将锂电池输出电压提升至 5V,同时自带了 USB口,方便使用 USB-Micro 数据线给开发板供电。

读取温湿度数据

项目中使用 DHT11 温湿度模块采集数据,在Arduino 开发工具的库管理器中添加DHT11 库即可获取到相关示例。

上传温湿度数据到服务端

ESP8266 从DHT11 传感器读取到数据后,连接WiFi,使用http请求调用服务器的接口,将数据上传到服务器。

安装与连线

graph TD;
subgraph ESP8266
	subgraph 定时唤醒短接
		ESP8266_RST[RST]---ESP8266_D0[D0]
	end
	ESP8266_VCC[3.3V]
	ESP8266_GND[GND]
	ESP8266_D2[D2]
	ESP8266_MICRO(Micro口)
end
subgraph 锂电池升压板
	HW106_IN+[+]
    HW106_IN-[-]
    HW106_USB(USB)==数据线===ESP8266_MICRO
end
subgraph TP4056
	TP4056_IN+[+]
	TP4056_IN-[-]
	TP4056_OUT+[OUT+]---HW106_IN+
	TP4056_OUT-[OUT-]---HW106_IN-
	TP4056_B+[B+]
	TP4056_B-[B-]
end
subgraph 18650锂电池
	B18650_Z[+]---TP4056_B+
	B18650_F[-]---TP4056_B-
end
subgraph MT3608
	MT3608_VIN_Z(VIN+)
	MT3608_VIN_F(VIN-)
	MT3608_VOUT_Z(VOUT+)---TP4056_IN+
	MT3608_VOUT_F(VOUT-)---TP4056_IN-
end
subgraph 太阳能板
	SOLAR_PANEL_Z[+]---MT3608_VIN_Z
	SOLAR_PANEL_F[-]---MT3608_VIN_F
end
subgraph DHT11
	ESP8266_VCC---DHT11_VCC[VCC]
	ESP8266_GND---DHT11_GND[GND]
	ESP8266_D2---DHT11_OUT[OUT]
end

代码

开发板代码

代码主要逻辑:

  • 设定 WiFi名称、密码、服务端地址、DHT11数据读取引脚。
  • 在 setup 函数中完成连接 WiFi、读取 DHT11 数据、向服务器发送上报数据请求,调用 ESP.deepSleep() 函数让开发板深度休眠。
  • loop 函数为空。
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
#include <Arduino.h>
#include <DHT11.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>

#ifndef STASSID
#define STASSID "<WiFi名称>"
#define STAPSK "<WiFi密码>"
#endif

ESP8266WiFiMulti WiFiMulti;
const char* server = "http://192.168.2.88:8080"; // 服务器地址
DHT11 dht11(D2);

void setup() {
// 初始化串口,用于打印开发板调试信息
Serial.begin(115200);
// 设置WiFi模式为STA模式,即作为客户端连接路由器
WiFi.mode(WIFI_STA);
// 添加接入点信息
WiFiMulti.addAP(STASSID, STAPSK);
// 连接wifi,判断连接状态
if ((WiFiMulti.run() == WL_CONNECTED)) {
// 读取温湿度数据
int temperature = 0;
int humidity = 0;
int result = dht11.readTemperatureHumidity(temperature, humidity);
result = dht11.readTemperatureHumidity(temperature, humidity); // 连续读两次,防止芯片初始化影响数据准确性

// 拼接服务器请求地址
String postStr = server;
postStr+="/api/weather/upload?temperature=";
postStr+=temperature;
postStr+="&humidity=";
postStr+=humidity;
Serial.println(postStr);

// 通过http请求上报数据到服务器
WiFiClient client;
HTTPClient http;
Serial.print("[HTTP] begin...\n");
if (http.begin(client, postStr)) { // HTTP
int httpCode = http.GET();
if (httpCode > 0) {
Serial.printf("[HTTP] GET... code: %d\n", httpCode);
if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
String payload = http.getString();
Serial.println(payload);
}
} else {
Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
}
http.end();
} else {
Serial.println("[HTTP] Unable to connect");
}
}
// 让开发板休眠,单位:微秒
ESP.deepSleep(600000000);
}

void loop() {
}

服务器代码

本次服务端使用 Java 开发,使用 springboot 快速搭建 web 服务。

提供一个 /api/weather/upload 接口接收设备上报的温湿度数据,接收后到控制台,给设备返回上传成功信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
@RequestMapping("/api")
public class WeatherStationApplication {

public static void main(String[] args) {
SpringApplication.run(WeatherStationApplication.class, args);
}

@RequestMapping("/weather/upload")
public String updateWeatherData(Float temperature, Float humidity) {
// 打印出收到的温湿度数据,后续可以将数据存入数据库,或根据数据触发其它动作
System.out.println("Updating weather data: " + temperature + " " + humidity);
return "Weather data updated";
}
}

测试

运行服务器代码,将在8080端口启动web服务。

烧录开发板代码到ESP8266,把各个组件的连线连好,上电后会读取上报一次温湿度数据,在服务器的控制台能看到打印的数据。

tp4056

总结

这个项目里学习了使用太阳能板,通过升压模块将3.6V电压升压至5V给锂电池充电。

学习了使用锂电池充放电板。

经观察,DHT11传感器的灯在 ESP8266 休眠期间是亮着的,还是在耗电,实际使用期间,大概三四天会把锂电池电量耗光,要重新给电池充电才能继续使用,做不到太阳能自给自足,优化方案有:

  • 把DHT11换成功耗更低、响应更快的数字传感器,比如SHT30、BME280
  • 增加太阳能板并联接入,提高充电能力

后续其它玩法:

  • 更换上传数据的协议,比如使用MQTT、TCP、UDP上报数据到服务器
  • 扩展服务器功能,比如数据存库,增加统计图,增加告警等
  • 添加更多类型的传感器,采集更丰富的数据