我想要一个esp32使用u8g2驱动ssd1306显示温度曲线的程序
时间: 2024-01-21 22:19:36 浏览: 156
以下是一个使用ESP32和U8g2库驱动SSD1306显示温度曲线的示例程序。该程序使用温度传感器DS18B20获取温度数据,并将其绘制在SSD1306屏幕上。
```
#include <OneWire.h>
#include <U8g2lib.h>
#define ONE_WIRE_BUS 4 // 设置温度传感器DS18B20的引脚
#define OLED_SCL 15 // 设置OLED SCL引脚
#define OLED_SDA 4 // 设置OLED SDA引脚
OneWire oneWire(ONE_WIRE_BUS); // 初始化OneWire对象
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, OLED_SCL, OLED_SDA, U8X8_PIN_NONE); // 初始化U8g2对象
void setup() {
u8g2.begin(); // 初始化U8g2
}
void loop() {
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;
if (!oneWire.search(addr)) { // 如果没有检测到温度传感器,结束函数
oneWire.reset_search();
return;
}
if (OneWire::crc8(addr, 7) != addr[7]) { // 如果CRC校验失败,结束函数
return;
}
switch (addr[0]) {
case 0x10:
type_s = 1;
break;
case 0x28:
type_s = 0;
break;
case 0x22:
type_s = 0;
break;
default:
return;
}
oneWire.reset();
oneWire.select(addr);
oneWire.write(0x44, 1);
present = oneWire.reset();
oneWire.select(addr);
oneWire.write(0xBE);
for (i = 0; i < 9; i++) {
data[i] = oneWire.read();
}
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) {
raw = raw << 3; // 9 bit resolution, 93.75 ms
} else if (cfg == 0x20) {
raw = raw << 2; // 10 bit res, 187.5 ms
} else if (cfg == 0x40) {
raw = raw << 1; // 11 bit res, 375 ms
}
}
celsius = (float)raw / 16.0;
fahrenheit = celsius * 1.8 + 32.0;
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_ncenB08_tr);
u8g2.setCursor(0, 10);
u8g2.print("Temperature:");
u8g2.setFont(u8g2_font_logisoso16_tr);
u8g2.setCursor(0, 30);
u8g2.print(celsius, 1);
u8g2.print("C / ");
u8g2.print(fahrenheit, 1);
u8g2.print("F");
u8g2.drawRFrame(0, 0, 128, 64, 10); // 绘制一个矩形框架
float tempC = celsius;
float tempF = fahrenheit;
int x = 0;
int y = 64 - (tempC * 2); // 计算温度曲线的起始点
u8g2.drawPixel(x, y); // 绘制第一个点
for (int i = 1; i <= 128; i++) {
float t = i / 2.0;
tempC = sin(t) * 10 + celsius; // 根据sin函数计算温度值
tempF = tempC * 1.8 + 32.0;
x = i;
y = 64 - (tempC * 2);
u8g2.drawLine(x - 1, y + 1, x, y); // 绘制温度曲线
}
} while (u8g2.nextPage());
}
```
在这个示例程序中,我们首先初始化了一个U8g2_SSD1306_128X64_NONAME_F_HW_I2C对象,该对象使用ESP32的硬件I2C接口来控制SSD1306 OLED显示屏。然后我们使用OneWire库读取DS18B20温度传感器的数据,并将温度值绘制在OLED屏幕上。最后我们使用U8g2库绘制一个矩形框架和温度曲线。
请注意,这只是一个示例程序,您需要根据您的具体硬件和需求进行适当的修改。
阅读全文