如何用esp8266,ssd1306和u8g2库做一个开机动画
时间: 2024-02-22 15:00:51 浏览: 31
首先,你需要连接ESP8266和SSD1306。使用U8g2库可以方便地控制SSD1306 OLED显示屏。然后,你可以使用以下代码来实现一个简单的开机动画:
```C++
#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ D1, /* data=*/ D2, /* reset=*/ U8X8_PIN_NONE);
void setup() {
u8g2.begin();
}
void loop() {
// 清空屏幕
u8g2.clearBuffer();
// 绘制动画
u8g2.setFont(u8g2_font_ncenB10_tr);
u8g2.drawStr(30, 30, "Hello World!");
// 显示屏幕
u8g2.sendBuffer();
// 等待一段时间
delay(1000);
}
```
这个代码使用U8g2库控制SSD1306 OLED显示屏,绘制一个"Hello World!"的文字动画,然后等待1秒钟。你可以根据自己的需要修改动画的绘制和等待的时间。
相关问题
帮我写一个用esp8266和1306屏幕显示B站粉丝的代码,要求使用u8g2库和arduinojson库
好的,以下是一个简单的示例代码,用于使用 ESP8266 和 1306 OLED 显示屏显示 Bilibili 粉丝数。该代码使用了 U8g2 库和 ArduinoJson 库。
首先,你需要在 Arduino IDE 中安装 U8g2 和 ArduinoJson 库。然后,将 ESP8266 连接到网络,并将 OLED 屏幕连接到 ESP8266。
接下来,你可以使用以下代码:
```c++
#include <ESP8266WiFi.h>
#include <U8g2lib.h>
#include <ArduinoJson.h>
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";
const char* bilibili_api_host = "api.bilibili.com";
const char* bilibili_api_path = "/x/relation/stat?vmid=YOUR_UID";
WiFiClient client;
U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0);
void setup() {
Serial.begin(115200);
u8g2.begin();
u8g2.setFont(u8g2_font_ncenB08_tr);
u8g2.clearBuffer();
u8g2.drawStr(0, 10, "Connecting to WiFi...");
u8g2.sendBuffer();
connectToWifi();
}
void loop() {
if (WiFi.status() == WL_CONNECTED) {
u8g2.clearBuffer();
u8g2.drawStr(0, 10, "Fetching data...");
u8g2.sendBuffer();
String response = getBilibiliData();
int followers = parseBilibiliData(response);
u8g2.clearBuffer();
u8g2.setCursor(0, 10);
u8g2.print("Bilibili Followers:");
u8g2.setCursor(0, 20);
u8g2.print(followers);
u8g2.sendBuffer();
delay(10000);
} else {
connectToWifi();
}
}
void connectToWifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
}
String getBilibiliData() {
if (!client.connect(bilibili_api_host, 80)) {
Serial.println("Connection failed");
return "";
}
client.print(String("GET ") + bilibili_api_path + " HTTP/1.1\r\n" +
"Host: " + bilibili_api_host + "\r\n" +
"Connection: close\r\n\r\n");
delay(500);
String response = "";
while (client.available()) {
char c = client.read();
response += c;
}
client.stop();
return response;
}
int parseBilibiliData(String response) {
StaticJsonDocument<200> doc;
deserializeJson(doc, response);
return doc["data"]["follower"].as<int>();
}
```
在这个示例代码中,我们首先定义了 WiFi 的 SSID 和密码,以及 Bilibili API 的地址和路径。然后,我们定义了一个 WiFi 客户端以及一个 OLED 显示屏对象。
在 `setup()` 函数中,我们初始化 OLED 显示屏,并显示连接 WiFi 的消息。然后,我们调用 `connectToWifi()` 函数连接到 WiFi。
在 `loop()` 函数中,我们首先检查 WiFi 是否连接成功。如果连接成功,我们就调用 `getBilibiliData()` 函数获取 Bilibili 粉丝数,然后使用 `parseBilibiliData()` 函数解析数据并显示在 OLED 屏幕上。最后,我们暂停 10 秒钟,然后重新开始循环。
在 `connectToWifi()` 函数中,我们使用 `WiFi.begin()` 函数连接到 WiFi,并等待连接成功。
在 `getBilibiliData()` 函数中,我们使用 `client.connect()` 函数连接到 Bilibili API,并发送 HTTP GET 请求。然后,我们等待一段时间,直到服务器返回响应,并将响应保存在一个字符串中。
在 `parseBilibiliData()` 函数中,我们使用 ArduinoJson 库解析 JSON 数据,获取 Bilibili 粉丝数。
请注意,此示例代码仅供参考。你需要根据你的具体情况进行修改,例如更改 SSID、密码、UID 等。同时,你还需要将 OLED 显示屏连接到正确的引脚上。
我想要一个esp32使用u8g2驱动ssd1306显示温度曲线的程序
以下是一个使用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库绘制一个矩形框架和温度曲线。
请注意,这只是一个示例程序,您需要根据您的具体硬件和需求进行适当的修改。