本帖最后由 Maker_kun 于 2024-5-26 18:22 编辑
优化显示参数:系统电压、电池容量、系统温度,优化屏幕闪烁问题
一、增加温度参数,参考案例:https://bbs.eeworld.com.cn/thread-1282330-1-1.html 移植温度参数
#include "driver/temperature_sensor.h"
// 设置温度类型
#define UNIT_C // C - 摄氏度 F - 华氏度
// 定义温度的Characteristic和Descriptor
// 定义温度数据读取变量
temperature_sensor_handle_t temp_sensor = NULL;
temperature_sensor_config_t temp_sensor_config = TEMPERATURE_SENSOR_CONFIG_DEFAULT(10, 50);
// 转换摄氏度到华氏度的函数
float celsiusToFahrenheit(float celsius) {
return (celsius * 9.0 / 5.0) + 32.0;
}
void setup() {
Serial.begin(115200);
// 启用内置温度传感器
ESP_ERROR_CHECK(temperature_sensor_install(&temp_sensor_config, &temp_sensor));
ESP_ERROR_CHECK(temperature_sensor_enable(temp_sensor));
}
void loop() {
/****************数据发送部分*************/
/****************************************/
float tsens_value;
// 获取温度值
ESP_ERROR_CHECK(temperature_sensor_get_celsius(temp_sensor, &tsens_value));
Serial.print("Temperature Celsius value ");
Serial.print(tsens_value, 2);
Serial.println(" ℃");
delay(100);
/****************************************/
/****************************************/
}
串口打印温度信息:
二、将温度显示在OLED屏幕上,同时改善OLED闪烁问题
/* 使用0.96寸的OLED屏幕需要使用包含这个头文件 */
#include "SSD1306Wire.h"
#include <Battery.h>
Battery battery(3400, 4200, 0, 12);
#include "driver/temperature_sensor.h"
#define UNIT_C // C - 摄氏度 F - 华氏度
// 定义温度数据读取变量
temperature_sensor_handle_t temp_sensor = NULL;
temperature_sensor_config_t temp_sensor_config = TEMPERATURE_SENSOR_CONFIG_DEFAULT(10, 50);
// 转换摄氏度到华氏度的函数
float celsiusToFahrenheit(float celsius) {
return (celsius * 9.0 / 5.0) + 32.0;
}
/* 设置oled屏幕的相关信息 */ //有一些引脚接口不支持I2C
const int I2C_ADDR = 0x3c; // oled屏幕的I2c地址
#define SDA_PIN SDA //
#define SCL_PIN SCL //
/* 新建一个oled屏幕对象,需要输入IIC地址,SDA和SCL引脚号 */
SSD1306Wire oled(I2C_ADDR, SDA_PIN, SCL_PIN);
//测试屏幕显示
void drawRect(void) {
for (int16_t i=0; i<oled.getHeight()/2; i+=2) {
oled.drawRect(i, i, oled.getWidth()-2*i, oled.getHeight()-2*i);
oled.display();
delay(50);
}
}
void setup() {
Serial.begin(115200); //串口频率
// 启用内置温度传感器
ESP_ERROR_CHECK(temperature_sensor_install(&temp_sensor_config, &temp_sensor));
ESP_ERROR_CHECK(temperature_sensor_enable(temp_sensor));
analogReadResolution(12); // switches ADC resolution to 12 bits
battery.begin(4200, 2, &asigmoidal);
// put your setup code here, to run once:
/* oled屏幕初始化 */
oled.init();
oled.flipScreenVertically(); // 设置屏幕翻转
oled.setContrast(255); // 设置屏幕亮度
drawRect(); // 测试屏幕显示
oled.clear(); oled.display(); // 清除屏幕
}
void loop() {
float tsens_value;
// 获取温度值
ESP_ERROR_CHECK(temperature_sensor_get_celsius(temp_sensor, &tsens_value));
// put your main code here, to run repeatedly:
/* 显示字母 */
oled.setFont(ArialMT_Plain_16); // 设置字体
oled.clear();
//oled.display();
oled.drawString(0,0, "Voltage:" +String(battery.voltage())+"mV"); // 将要显示的字母写入缓存
oled.drawString(0,20, "POWER:"+String(battery.level())+"%"); // 将要显示的字母写入缓存
oled.drawString(0,40, "Temp:"+String(tsens_value)+"`C"); // 将要显示的字母写入缓存
oled.display(); // 将缓存里的文字在屏幕上显示
delay(50);
}
效果:
视频演示:改善闪烁问题
OLED显示温度信息