ESP32 UV BOX 基于ESP-WROOM-32D-N8的简易紫外线等级检测盒
板载S12SD紫外线传感器,AHT20温湿度传感器,BMP280气压传感器,WS2812灯珠,1.8寸TFT
目录
(⬆️TOP)
ESP32_UV_BOX
│ Changelog.md 记录文档
│ clearBuildDir.bat build文件删除
│ default_8MB.csv 存储分区
│ LICENSE 开源协议
│ platformio.ini 开发配置
│ README.md 说明文档
├─assets/ 静态文件
├─include
│ README
├─lib 外部库
│ │ README
│ └─ArduinoZlib
├─src 主要文件
│ │ button.cpp 按键控制
│ │ button.h
│ │ main.cpp 主程序
│ │ network.cpp 网络请求
│ │ network.h
│ │ sensor.cpp 传感器
│ │ sensor.h
│ │ ui.cpp 界面
│ │ ui.h
│ ├─font/ 字体文件
│ └─img/ 图片文件
└─test/ 测试文件
(⬆️TOP)
- 立创EDA(专业版) - 硬件设计
- Solidworks 2023 - 3D外壳设计
- Visual Studio Code + PlatformIO - 代码编写
- RGB Color Picker - 取色
- File to C style array converter - 图片转换
- iconfont-阿里巴巴矢量图标库 - 图标字体
(⬆️TOP)
硬件设计见立创开源硬件平台
(⬆️TOP)
- TFT_eSPI - 屏幕驱动
- AHT20 - AHT20驱动
- Grove - Barometer Sensor BMP280 - BMP280驱动
- OneButton - 按键控制
- FastLED - WS2812驱动
- NTPClient - 网络时间
- ArduinoJson - 数据解析
- ArduinoZlib - 文件解压缩
(⬆️TOP)
屏幕尺寸为1.8寸,分辨率是128x160,屏幕驱动是ST7735,使用TFT_eSPI库驱动屏幕,所有界面使用TFT_eSPI
绘制
使用TFT_eSPI
需要修改配置文件User_Setup.h
,根据屏幕类型和显示情况修改内容
#define ST7735_DRIVER // 屏幕驱动
#define TFT_RGB_ORDER TFT_RGB // 颜色顺序
#define TFT_WIDTH 128 // 屏幕宽度
#define TFT_HEIGHT 160 // 屏幕高度
#define ST7735_GREENTAB2 // 仅ST7735
// #define TFT_INVERSION_ON // 黑白反转
// #define TFT_INVERSION_OFF
#define TFT_BL 17 // 背光引脚
#define TFT_MOSI 23
#define TFT_SCLK 18
#define TFT_CS 5 // Chip select control pin
#define TFT_DC 2 // Data Command control pin
#define TFT_RST 4 // Reset pin (could connect to RST pin)
//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST
页面结构设计参考:OSHWHub: 黑人黑科技的开源工程ESP32 万能遥控器
使用ledc
控制引脚输出PWM调节屏幕背光亮度
(⬆️TOP)
使用S12SD传感器来检测紫外线,然后经过放大,使用ADC采集电压,根据电压范围判断紫外线指数等级
程序中使用此函数获取紫外线指数
uint8_t sensor_uv_data(void)
(⬆️TOP)
使用AHT20传感器来检测环境温度和湿度,使用IIC通信协议
程序中使用此函数来获取温湿度数据
AHT20Data sensor_aht20_data(void);
AHT20Data
为定义的结构体数据
struct AHT20Data
{
float temperature;
float humidity;
};
(⬆️TOP)
使用BMP280传感器来检测环境压强和温度,并能够计算得到海拔高度,使用IIC通信协议
程序中使用此函数来获取压强等数据
BMP280Data sensor_bmp280_data(void);
BMP280Data
为定义的结构体数据
struct BMP280Data
{
float temperature;
float pressure;
float altitude;
};
(⬆️TOP)
初次使用时,会建立网络ESP_UV_BOX_WIFI
连接网络,浏览器打开网址192.168.1.1
,会出现配网页面
页面代码参考: CSDN: 请收藏!分享一个ESP32/ESP8266高颜值WIFI配网页面代码-带下拉选择框和中英文版本。文末有arduino配网代码。
一共五个输入框,分别是WIFI SSID
, WIFI PASSWORD
, Private KEY
, Location ID
,bilibili UID
网络配置相关函数如下
bool wifi_scan(void);
void wifi_connect(int timeOut_s);
void wifi_disconnect(void);
void ap_init(void);
void server_init(void);
void handleRoot(void);
void handleConfigWifi(void);
void handleNotFound(void);
void doClient(void);
void wifiConfigBySoftAP(void);
(⬆️TOP)
天气等数据使用和风天气的API,免费订阅每日有1000次请求
网络天气相关函数如下
void get_weather_now(void);
void get_weather_future(void);
void get_air(void);
void get_city_id(void);
String urlEncode(const String& text);
(⬆️TOP)
时间数据使用NTPClient库获取网络时间
网络相关函数如下
void time_init(void);
void get_time(void);
(⬆️TOP)
通过如下API接口获得JSON格式的数据,使用ArduinoJson库解析获得关注数和粉丝数
https://api.bilibili.com/x/relation/stat?vmid=用户UID
可以使用官网提供的工具生成解析代码
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"mid": 378576508,
"following": 318,
"whisper": 0,
"black": 0,
"follower": 56
}
}
生成的解析代码如下
// String input;
JsonDocument doc;
DeserializationError error = deserializeJson(doc, input);
if (error) {
Serial.print("deserializeJson() failed: ");
Serial.println(error.c_str());
return;
}
int code = doc["code"]; // 0
const char* message = doc["message"]; // "0"
int ttl = doc["ttl"]; // 1
JsonObject data = doc["data"];
long data_mid = data["mid"]; // 378576508
int data_following = data["following"]; // 318
int data_whisper = data["whisper"]; // 0
int data_black = data["black"]; // 0
int data_follower = data["follower"]; // 56
(⬆️TOP)
使用拨轮开关作为控制输入,一共有三个按键,使用OneButton库,支持单击、双击、长按等操作。
(⬆️TOP)
- PCB
- 页面
- 紫外线检测
(⬆️TOP)
levi52 - @github
travi5 - @bilibili
(⬆️TOP)
该项目签署了MIT 授权许可,详情请参阅 LICENSE
(⬆️TOP)
(⬆️TOP)
2024 levi5
(⬆️TOP)