
ESP32-C6-GEEK 是一款微雪 (Waveshare) 为极客设计的开发板,板载 USB-A 公口、1.14 英寸 LCD 屏幕、Micro SD 卡槽等外设,支持 2.4GHz WiFi 6 和 BLE 5,集成 16MB Flash ,提供 I2C 接口、UART 接口和 GPIO 接口,可以为你的项目提供更多可能。

| 工作电压 | 3.3V / 5V | 分辨率 | 240 × 135 pixels |
|---|---|---|---|
| 通信接口 | 4-wire SPI | 显示尺寸 | 24.91 × 14.86 (mm) |
| 显示面板 | IPS | 像素大小 | 0.1101 × 0.1035 (mm) |
| 控制芯片 | ST7789 | 产品尺寸 | 61.00 × 24.50 (mm) |
SPI 通信协议:


注:此处的 SPI 接口专为屏幕显示设计,因此省略了从机到主机的数据线 (MISO)。
RESX 为复位,模块上电时拉低,通常情况下置 1;
CSX 为从机片选, 仅当 CS 为低电平时,芯片才会被使能。
D/CX 为芯片的数据/命令控制引脚,当 DC = 0 时写命令,当 DC = 1 时写数据
SDA 为传输的数据,即 RGB 数据;
SCL 为 SPI 通信时钟。
对于 SPI 通信而言,数据是有传输时序的,即时钟相位(CPHA)与时钟极性(CPOL)的组合:
CPHA 的高低决定串行同步时钟是在第一时钟跳变沿还是第二个时钟跳变沿数据被采集,当 CPHA = 0,在第一个跳变沿进行数据采集;
CPOL 的高低决定串行同步时钟的空闲状态电平,CPOL = 0,为低电平。
从图中可以看出,当 SCL 第一个下降沿时开始传输数据,一个时钟周期传输 1 bit 数据,使用 SPI0,按位传输,高位在前,低位在后。

ESP32-C6-Touch-LCD-1.83 支持 Arduino IDE 和 ESP-IDF 两种开发框架,为开发者提供灵活的选择,您可以根据项目需求和个人偏好选择合适的开发工具。
两种开发方式各有优势,开发者可根据自身需求和技能水平选择。Arduino 简单易学、上手快,适合初学者和非专业人士;ESP-IDF 则提供更高级的开发工具和更强的控制能力,适合有专业背景或对性能要求较高的开发者,更适用于复杂项目开发。
Arduino IDE 是一款便捷灵活、易于上手的开源电子原型平台。无需太多基础知识,简单学习后即可快速开发。Arduino 拥有庞大的全球用户社区,提供海量开源代码、项目示例和教程,以及丰富的库资源,封装了复杂功能,让开发者能够快速实现各种功能。您可以参考 Arduino IDE 开发环境搭建教程 完成初始设置,教程中同时提供了相关示例程序供参考。
ESP-IDF 全称 Espressif IoT Development Framework,是乐鑫科技为 ESP 系列芯片推出的专业开发框架。它基于 C 语言开发,包含编译器、调试器、烧录工具等,支持命令行或集成开发环境(如 Visual Studio Code 配合 Espressif IDF 插件)开发,插件提供代码导航、项目管理、调试等功能。我们推荐使用 VS Code 进行开发,具体配置过程可参考 ESP-IDF (VS Code) 开发环境搭建教程,教程中同时提供了相关示例程序供参考。
请参考 安装和配置 Arduino IDE 教程 下载安装 Arduino IDE 并添加 ESP32 支持。
要运行示例,需要安装对应的库。
可从 此链接 下载 ESP32-C6-GEEK 开发板的示例程序包。包内的 Arduino\libraries 目录已包含本教程所需的全部库文件。
| 库或文件名称 | 说明 | 版本 | 安装方式 |
|---|---|---|---|
| ESP32-BLE-Keyboard-master | ESP32 的蓝牙键盘库 | v0.3.2 | 手动安装 |
| PubSubClient | MQTT 消息订阅发布库 | v2.8.0 | 通过库管理器或手动安装 |
| JPEGDecoder | JPEG 图像解码库 | v2.0.0 | 通过库管理器或手动安装 |
| OneButton | 单按钮事件处理库 | v2.5.0 | 通过库管理器或手动安装 |
| BME68x Sensor library | BME68x 传感器驱动库 | v1.1.40406 | 通过库管理器或手动安装 |
| ArduinoJson | 轻量 JSON 库 | v7.2.1 | 通过库管理器或手动安装 |
LVGL 及其驱动库的版本之间存在较强的依赖关系。例如,为 LVGL v8 编写的驱动可能不兼容 LVGL v9。为确保示例能够稳定复现,推荐使用上表列出的特定版本。混合使用不同版本的库可能导致编译失败或运行时异常。
安装步骤:
解压已下载的 示例程序包。
将其 Arduino\libraries 目录下的所有文件夹(Arduino_DriveBus、GFX_Library_for_Arduino 等)复制到 Arduino 的库文件夹中。
Arduino 库文件夹的路径通常是:c:\Users\<用户名>\Documents\Arduino\libraries。
也可以在 Arduino IDE 中通过 文件 > 首选项,查看“项目文件夹位置”来定位。库文件夹就是此路径下的 libraries 文件夹。
其他安装方式请参考:Arduino 库管理教程。
ESP32-C6-GEEK 需要选择及配置开发板。

ESP32-C6-GEEK 需要选择 ESP32C6 Dev Module。
选择 USB 端口
ESP32-C6-GEEK 使用 ESP32-C6 原生 USB 接口,而非 UART 转 USB。对于串口通信:
printf() 函数可直接使用;
若要使用 Serial.println() 函数,需要额外配置:在 IDE 工具菜单中启用"USB CDC On Boot"选项,或在代码中声明 HWCDC 对象处理 USB 串口通信。
选择 16MB flash
选择合适大小的分区表
Arduino 示例程序位于 示例程序包 的 Arduino/examples 目录中。
| 示例程序 | 基础例程说明 | 依赖库 |
|---|---|---|
| 01_OneButton | 按钮交互与 LCD 显示 | OneButton |
| 02_ADC_Read | ADC 采样 | |
| 03_IIC_BME68X_Sensor | 驱动 I2C 模块 | BME68x Sensor libraryXPowersLib |
| 04_UART0 | 串口通信 | |
| 05_LCD_Button | 按钮操作切换图像、控制背光 | OneButton |
| 06_LCD_Time | 在 LCD 显示日期时间 | |
| 07_SD_Test | 对 SD 卡的文件进行增删改查 | |
| 08_SD_LCD | 读取 SD 卡上 JPEG 图片并在屏幕显示 | JPEGDecoder |
| 09_BLE_LCD | ESP32-C6 与 BLE 和 LCD 交互,可作为 BLE 服务器收发数据并在 LCD 显示 | ESP32-BLE-Keyboard-master |
| 10_BLE_UART | ESP32-C6 与 BLE 交互,可作为 BLE 服务器收发数据并使用 UART 显示消息内容 | ESP32-BLE-Keyboard-master |
| 11_BLE_Keyboard | 模拟 BLE 键盘 | ESP32-BLE-Keyboard-master |
| 12_WIFI_AP_LCD | 与 Wi-Fi 和 LCD 交互,可作为 Wi-Fi 接入点与客户端通信并在 LCD 显示 | |
| 13_WIFI_TCP_Client | 与 Wi-Fi 和 LCD 交互,连接 Wi-Fi 后尝试连接服务器,收发数据并在 LCD 显示 | |
| 14_WIFI_TCP_Server | 与 Wi-Fi 和 LCD 交互,作为 Wi-Fi 服务器,接收客户端数据并在 LCD 显示 | |
| 15_WIFI_Web_Server | 与 Wi-Fi 和 LCD 交互,作为 Wi-Fi 接入点服务器,处理客户端请求 | |
| 16_MQTT_sub_pub | 与 Wi-Fi 和 LCD 交互,作为 Wi-Fi 接入点服务器,处理客户端请求 | ArduinoJson,PubSubClient |
| 17_MQTT_BLE_Keyboard | 集成 BLE 键盘、Wi-Fi 和 MQTT,控制 LCD 显示 | ArduinoJson,PubSubClient,ESP32-BLE-Keyboard-master |
该例程可使用 ESP32-C6-GEEK 的 boot 按键变成一个多功能按键,可进行单击、双击或者长按以执行不同的操作。适用于学习 ESP32-C6 的按钮交互与 LCD 显示,可通过按钮操作观察 LCD 变化,测试其可靠性

按钮事件绑定:
button.attachLongPressStart(LongPressStart, &button);
button.attachClick(Click, &button);
button.attachDoubleClick(DoubleClick, &button);
button.setLongPressIntervalMs(1000);
持续监测 :
void loop() {
// keep watching the push button:
button.tick();
delay(10);
}
按钮事件回调 :
void LongPressStart(void *oneButton)
{
LCD_Clear(BLACK);
Paint_DrawString_EN(50, 50, "LongPress", &Font24, BLACK, RED);
}
void Click(void *oneButton)
{
LCD_Clear(BLACK);
Paint_DrawString_EN(75, 50, "Click", &Font24, BLACK, YELLOW);
}
void DoubleClick(void *oneButton)
{
LCD_Clear(BLACK);
Paint_DrawString_EN(35, 50, "DoubleClick", &Font24, BLACK, BLUE);
}
该例程使用 ESP32-C6-GEEK 的 GPIO 接口,进行 ADC 采样,读取 3.3V 范围内的电压,使用时注意共地与不可超出测量范围。适用于学习 ESP32-C6 的模拟输入,可读取特定引脚模拟值,观察变化并测试稳定性

将 SH1.0 3PIN 杜邦线的两端分别连接到开发板和待测电压源
初始化背光控制引脚为低电平
开启串口通信,设置波特率为 115200
设置 ADC 分辨率为 12 位
void setup() {
analogWrite(DEV_BL_PIN,0);
Serial.begin(115200); //The serial port is initially configured
analogReadResolution(12); //Set ADC resolution to 12 bits (0-4096)
}
定义变量存储 ADC 的原始值和电压值
读取指定引脚的 ADC 原始值和电压值
通过串口输出 ADC 值
void loop() {
//Define two variables to hold the original value and the voltage value (millivolts) collected by the ADC
int analogOriginalValue = 0;
int analogVoltsValue = 0;
analogOriginalValue = analogRead(ADC1_CHANNEL_0); // Read the ADC raw value
analogVoltsValue = analogReadMilliVolts(ADC1_CHANNEL_0); // Read ADC voltage values (millivolt range)
// Upload read ADC values:
Serial.printf("ADC analog value = %d\n",analogOriginalValue);
Serial.printf("ADC millivolts value = %d mV\n",analogVoltsValue);
delay(3000);
}
该例程可使用 ESP32-C6-GEEK 的 IIC 硬件接口驱动 I2C 模块,例程使用 BME680 传感器进行演示,通过串口输出打印数据。适用于学习 ESP32-C6 与 BME68X 传感器交互,可设置引脚和通信模式,读取多种数据,测试兼容性与稳定性


使用 analogWrite 将背光控制引脚 PIN_BL 设置为 0,关闭背光。
使用 Wire.begin(PIN_SDA, PIN_SCL) 初始化 I2C 通信(注释中的 SPI.begin() 表示也可以使用 SPI 模式,但这里未启用)。
初始化串口通信,设置波特率为 115200。
等待串口连接准备好。
根据配置的通信方式(这里是 I2C)初始化 BME68X 传感器。如果初始化过程中出现错误或警告,会在串口输出相应的信息。
设置传感器的温度、压力和湿度测量配置,并设置加热器配置。
在串口输出数据的标题行,包括时间戳、温度、压力、湿度、气体电阻和状态
void setup(void)
{
analogWrite(PIN_BL,0);
Wire.begin(PIN_SDA, PIN_SCL); //I2C mode
//SPI.begin(); //SPI mode
Serial.begin(115200);
delay(100);
Serial.println(PIN_SDA);
Serial.println(PIN_SCL);
while (!Serial)
delay(10);
/* initializes the sensor based on SPI library */
//bme.begin(PIN_CS, SPI); //SPI mode
bme.begin(ADD_I2C, Wire); //I2C mode
if(bme.checkStatus())
{
if (bme.checkStatus() == BME68X_ERROR)
{
Serial.println("Sensor error:" + bme.statusString());
return;
}
else if (bme.checkStatus() == BME68X_WARNING)
{
Serial.println("Sensor Warning:" + bme.statusString());
}
}
/* Set the default configuration for temperature, pressure and humidity */
bme.setTPH();
/* Set the heater configuration to 300 deg C for 100ms for Forced mode */
bme.setHeaterProf(300, 100);
Serial.println("TimeStamp(ms), Temperature(deg C), Pressure(Pa), Humidity(%), Gas resistance(ohm), Status");
}
该例程可使用 ESP32-C6-GEEK 打开串口 UART0,打开串口调试助手,可以进行串口通信。适用于学习 ESP32-C6 串口通信,可接收数据并输出


检查串口是否有数据可读。如果有数据可读,进入循环处理输入数据。
创建一个字符数组 buffer 用于存储输入数据,以及一个变量 bufferSize 用于记录缓冲区中的数据大小。
在循环中,每次读取一个字符并存储到缓冲区中,同时增加缓冲区大小。
当缓冲区已满(达到数组大小)或者读取到换行符时,将缓冲区中的数据通过串口输出,然后延迟 10 毫秒。
最后,重置缓冲区大小为 0,并使用 memset 函数将缓冲区清零,为下一次输入做准备
void loop() {
if (Serial.available()) {
char buffer[256]; // Buffer to store input data
size_t bufferSize = 0; // Current size of data in buffer
while (Serial.available() > 0) {
char input = Serial.read();
buffer[bufferSize++] = input; // Store input in buffer
// Check if the buffer is full, or a newline character is received
if (bufferSize >= sizeof(buffer) || input == '\n') {
// Send the entire buffer via Serial2
Serial.println(buffer);
delay(10);
// Reset buffer and size for the next input
bufferSize = 0;
memset(buffer, 0, sizeof(buffer));
}
}
}
}
该例程可使用 ESP32-C6-GEEK 的 boot 按键实现短按点亮 LCD 并切换下一张图片,长按熄灭 LCD。适用于学习 ESP32-C6 的按钮交互和 LCD 图像显示,可通过按钮操作切换图像、控制背光,测试稳定性

当按钮被点击时,此函数被调用,根据不同的 click 值切换显示不同的图像(gImage_pic1、gImage_pic2、gImage_pic3):
void Click(void *oneButton)
{
LCD_SetBacklight(1000);
Paint_NewImage(LCD_WIDTH, LCD_HEIGHT, 0, BLACK);
click++;
if(click >= 4)click = 1;
switch(click)
{
case 1:
Paint_DrawImage(gImage_pic1, 0, 0, 135, 240);
break;
case 2:
Paint_DrawImage(gImage_pic2, 0, 0, 135, 240);
break;
case 3:
Paint_DrawImage(gImage_pic3, 0, 0, 135, 240);
break;
}
}
该例程可使用 ESP32-C6-GEEK 连接 WIFI 获取当前时间并且把时间日期显示在 LCD 与串口调试助手上。适用于学习 ESP32-C6 的 Wi-Fi 连接与时间同步,可连接特定网络并同步时间,在 LCD 显示日期时间,测试稳定性与准确性

使用 PC 打开热点,网络频带选择“任何可用频率”,将 ssid 与 password 修改成要连接的 WIFI 名称和密码。utcOffsetInSeconds 为我们需要获取时间的时区,例如:北京,东八区,则为 8 * 60 *60=28800

在此说明:ESP32-C6-GEEK 作为 STA 模式与 PC 连接同一个 WIFI 网络时,ESP32-C6-GEEK 连接的 WIFI 需要有 2.4GHz 频带的,如果没有 2.4GHz 频带,那网络频带就选择“任何可用频率”,这边我们直接选择“任何可用频率”
在 LCD 上显示 “Wifi Connecting...”,向用户提示设备正在尝试连接 Wi-Fi,通过 WiFi.begin(ssid, password) 使用指定的网络名称和密码启动连接过程,进入循环等待连接成功,在这个过程中,每隔 1000 毫秒就在串口打印 “Connecting to WiFi...”,让用户了解连接进度。一旦连接成功,就清空 LCD 屏幕并显示 “Wifi Connected”,为后续依赖网络的操作做好准备
void setup() {
Serial.begin(115200);
Config_Init();
LCD_Init();
LCD_SetBacklight(100);
Paint_NewImage(LCD_WIDTH, LCD_HEIGHT, 90, WHITE);
Paint_SetRotate(90);
LCD_Clear(BLACK);
delay(1000);
while (!Serial);
Paint_DrawString_EN(20, 50, "Wifi Connecting...", &Font20, BLACK, GREEN);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
LCD_Clear(BLACK);
Paint_DrawString_EN(20, 50, "Wifi Connected", &Font20, BLACK, GREEN);
Serial.println("Connected to WiFi");
//Acquisition time
configTime(utcOffsetInSeconds, 0, ntpServer);
while (!time(nullptr)) {
delay(1000);
Serial.println("Waiting for time sync...");
}
LCD_Clear(BLACK);
Serial.println("Time synced successfully");
}
该例程可使用 ESP32-C6-GEEK 的 SD 卡槽,将 SD 卡插入卡槽,打开串口调试助手,可以看到 ESP32-C6-GEEK 对 SD 卡的文件进行增删改查。适用于学习 ESP32-C6 与 SD 卡交互,可进行多种文件操作,测试稳定性与可靠性

初始化串口通信,启动 HSPI 总线并设置时钟分频,然后尝试初始化连接在特定引脚上的 SD 卡,若成功,确定 SD 卡类型并显示其容量大小。之后进行一系列对 SD 卡的文件系统操作,如列出目录、创建和删除目录、读写文件、重命名文件以及测试读写性能,同时输出 SD 卡总空间和已用空间
void setup() {
Serial.begin(115200);
while (!Serial) {
delay(10);
}
#ifdef REASSIGN_PINS
SPI.begin(sck, miso, mosi, cs);
if (!SD.begin(cs)) {
#else
if (!SD.begin()) {
#endif
Serial.println("Card Mount Failed");
return;
}
uint8_t cardType = SD.cardType();
if (cardType == CARD_NONE) {
Serial.println("No SD card attached");
return;
}
Serial.print("SD Card Type: ");
if (cardType == CARD_MMC) {
Serial.println("MMC");
} else if (cardType == CARD_SD) {
Serial.println("SDSC");
} else if (cardType == CARD_SDHC) {
Serial.println("SDHC");
} else {
Serial.println("UNKNOWN");
}
uint64_t cardSize = SD.cardSize() / (1024 * 1024);
Serial.printf("SD Card Size: %lluMB\n", cardSize);
listDir(SD, "/", 0);
createDir(SD, "/mydir");
listDir(SD, "/", 0);
removeDir(SD, "/mydir");
listDir(SD, "/", 2);
writeFile(SD, "/hello.txt", "Hello ");
appendFile(SD, "/hello.txt", "World!\n");
readFile(SD, "/hello.txt");
deleteFile(SD, "/foo.txt");
renameFile(SD, "/hello.txt", "/foo.txt");
readFile(SD, "/foo.txt");
testFileIO(SD, "/test.txt");
Serial.printf("Total space: %lluMB\n", SD.totalBytes() / (1024 * 1024));
Serial.printf("Used space: %lluMB\n", SD.usedBytes() / (1024 * 1024));
}
该例程可使用 ESP32-C6-GEEK 的 SD 卡槽读取 SD 卡中的图片,将照片图片存入 SD 卡后,把 SD 卡插入卡槽,ESP32-C6-GEEK 可将 SD 卡中的照片读取并且显示在 LCD 上。适用于学习 ESP32-C6 与 SD 卡及 TFT 屏交互,可读取 SD 卡上 JPEG 图片并在屏幕显示,测试稳定性与可靠性
可将 .\ESP32-C6-GEEK-Demo\Arduino\pic 路径下的照片用读卡器存入 SD 卡中,或者存入自己的照片,将图片尺寸修改成 240×135,显示效果最佳
将 SH1.0 3PIN 杜邦线的两端分别连接到开发板和待测电压源
解码 JPEG 图片并居中绘制到 TFT 显示屏上
void renderJPEG() {
uint16_t *pImg;
uint16_t mcu_w = JpegDec.MCUWidth;
uint16_t mcu_h = JpegDec.MCUHeight;
uint32_t jpeg_width = JpegDec.width;
uint32_t jpeg_height = JpegDec.height;
Serial.print("270 度旋转:");
Serial.print(jpeg_width);
Serial.print(" x ");
Serial.println(jpeg_height);
uint16_t rotated_width = jpeg_height; // 135
uint16_t rotated_height = jpeg_width; // 240
uint16_t x_pos = (LCD_WIDTH - rotated_width) / 2;
uint16_t y_pos = (LCD_HEIGHT - rotated_height) / 2;
Paint_Clear(WHITE);
while (JpegDec.read()) {
pImg = JpegDec.pImage;
uint16_t mcu_x = JpegDec.MCUx * mcu_w;
uint16_t mcu_y = JpegDec.MCUy * mcu_h;
for (int y = 0; y < mcu_h; y++) {
for (int x = 0; x < mcu_w; x++) {
uint16_t orig_x = mcu_x + x;
uint16_t orig_y = mcu_y + y;
if (orig_x >= jpeg_width || orig_y >= jpeg_height) continue;
// 旋转公式:
uint16_t screen_x = x_pos + (jpeg_height - orig_y - 1);
uint16_t screen_y = y_pos + orig_x;
if (screen_x < LCD_WIDTH && screen_y < LCD_HEIGHT) {
uint16_t color = pImg[x + y * mcu_w];
Paint_SetPixel(screen_x, screen_y, color);
}
}
}
}
JpegDec.abort();
}
该例程可使用 ESP32-C6-GEEK 打开蓝牙 BLE,使用手机打开蓝牙调试助手,连接 ESP32-C6-GEEK,与手机进行蓝牙 BLE 通讯,发送与接收的消息在 LCD 上显示。适用于学习 ESP32-C6 与 BLE 和 LCD 交互,可作为 BLE 服务器收发数据并在 LCD 显示,测试稳定性与可靠性
BLEDevice::init("Waveshare_ESP32C6_GEEK") 中 Waveshare_ESP32C6_GEEK 为蓝牙名称

使用手机端打开手机蓝牙调试助手扫描连接设备

使用手机蓝牙调试助手发送蓝牙消息至 ESP32-C6-GEEK,ESP32-C6-GEEK 接收到消息会把消息显示在 LCD 上,串口调试助手打印消息内容



手机端的蓝牙调试助手打开接收设置,ESP32-C6-GEEK 使用 USB 转 UART 连接 PC,打开串口调试助手,发送串口消息转为蓝牙消息至手机,注意发送时要勾选上回车加换行,发送的消息内容会显示在 LCD 上,在手机端观察是否接收到蓝牙消息




该例程可使用 ESP32-C6-GEEK 打开蓝牙 BLE,使用手机打开蓝牙调试助手,连接 ESP32-C6-GEEK,与手机进行蓝牙 BLE 通讯,发送与接收的消息在串口上显示。操作与 09_BLE_LCD 相同,但是没有开启 LCD,使用 UART 显示消息内容,较大程度将功耗降低。操作请看 09_BLE_LCD
蓝牙名称
BleKeyboard bleKeyboard("ESP32-C6-GEEK", "Waveshare", 100);
判断蓝牙键盘是否连接,如果连接:
print 方法发送字符串 “waceshare”。write 方法发送回车键(KEY_RETURN)。 void loop() {
if(bleKeyboard.isConnected()) {
Serial.println("Sending 'Waveshare'...");
bleKeyboard.print("waveshare");
delay(500);
Serial.println("Sending Enter key...");
bleKeyboard.write(KEY_RETURN);
delay(500);
Serial.println("Sending Ctrl+Alt+Delete...");
bleKeyboard.press(KEY_LEFT_CTRL);
bleKeyboard.press(KEY_LEFT_ALT);
bleKeyboard.press(KEY_DELETE);
delay(100);
bleKeyboard.releaseAll();
}
Serial.println("Waiting 5 seconds...");
delay(5000);
}
libraries 文件夹中的 BleKeyboard.h 文件中查看各个单键的值该例程可使用 ESP32-C6-GEEK 打开 WIFI 的 AP 模式,PC 连接其 WIFI 后,可以登录 IP,在网页端进行控制 ESP32-C6-GEEK 的 LCD 显示图片。适用于学习 ESP32-C6-GEEK 与 Wi-Fi 和 LCD 交互,可作为 Wi-Fi 接入点与客户端通信并在 LCD 显示,测试稳定性与可靠性

初始化相关配置和 LCD 显示屏
调用 WIFI_AP_Init() 初始化 Wi-Fi 接入点
void setup()
{
Config_Init();
LCD_Init();
Serial.begin(115200);
LCD_SetBacklight(100);
Paint_NewImage(LCD_WIDTH, LCD_HEIGHT, 90, WHITE);
Paint_SetRotate(90);
LCD_Clear(0x000f);
WIFI_AP_Init();
}
通过 WiFiClient client = server.available(); 监听是否有客户端连接到服务器。
调用 WIFI_LCD_Control(client) 函数处理连接的客户端,可能进行与 LCD 显示相关的操作,具体功能取决于该函数的实现
void loop()
{
WiFiClient client = server.available(); // listen for incoming clients
WIFI_LCD_Control(client);
}
ssid 是 ESP32-C6-GEEK 创建的 AP 名称 (ESP32-C6-GEEK),password 则是连接 AP 的密码 (Waveshare)

使用 PC 连接 ESP32-C6-GEEK 的 AP,输入密码 Waveshare
烧录成功但 PC 识别不到 wifi 时,给开发板重新上电再尝试
LCD 会显示 HTTP 服务器的 IP 地址

使用浏览器进行登录 IP:192.168.4.1,通过服务器上的按钮对 ESP32-C6-GEEK 的 LCD 进行控制,按下不同按钮,观察 LCD 变化,更多 LCD 的显示函数具体可以看 LCD 程序说明

该例程可使用 ESP32-C6-GEEK 打开 WIFI 的 STA 模式,与 PC 端或者手机端连接同一个 WIFI 后,作为 TCP Client 访问 PC 或手机创建的 TCP Server,并且与 PC 或手机建立 TCP 通讯,在 LCD 上显示接收内容。适用于学习 ESP32-C6-GEEK 与 Wi-Fi 和 LCD 交互,连接 Wi-Fi 后尝试连接服务器,收发数据并在 LCD 显示,测试稳定性与可靠性
使用 PC 打开热点,网络频带选择“任何可用频率”,程序中 ssid 与 password 与要连接的 WIFI 名称和密码保持一致
下载 网络调试助手,修改为你的本地 IP 地址(以下的 192.168.137.1 为示例 IP 地址)

使用 sprintf 函数将传入的 IP 地址整数按照点分十进制的格式转换为字符串,并存储在 result 指针指向的字符数组中
void intToIpAddress(uint32_t ip, char *result) {
sprintf(result, "%d.%d.%d.%d", ip & 255,(ip >> 8) & 255,(ip >> 16) & 255,(ip >> 24) & 255);
}
此时 LCD 屏幕显示尝试连接,片刻之后显示已连接
修改 NetAssist 参数,协议类型为 TCP Server,本地 IP 地址与程序中保持一致,本地端口号为 8080,点击“连接”,用于和 ESP32-C6-GEEK(TCP Client) 进行连接与 TCP 通讯

连接成功后,TCP Server 会收到 ESP32-C6-GEEK 发送的 TCP 消息"Hello world",LCD 会显示“Access successful”

通过 PC 端 TCP Server 发送 TCP 消息给 ESP32-C6-GEEK,若发送成功,ESP32-C6-GEEK 作为 TCP Client 接收到消息会将消息内容显示在 LCD 上,可以观察到 LCD 显示消息

还可以使用手机打开热点,热点名称与密码同上,选择 2.4GHz 频带
打开热点后使用 TCP 调试助手与 ESP32-C6-GEEK 进行 TCP 通讯

烧录代码,连接成功后,TCP Server 会收到 ESP32-C6-GEEK 发送的 TCP 消息"Hello world",LCD 会显示“Access successful”,可通过手机端 TCP Server 发送 TCP 消息给 ESP32-C6-GEEK,若发送成功,ESP32-C6-GEEK 作为 TCP Client 接收到消息会将消息内容显示在 LCD 上,可以观察到 LCD 显示消息

该例程可使用 ESP32-C6-GEEK 打开 WIFI 的 STA 模式,连接 PC 端打开的热点后,创建 TCP Server,PC 创建 TCP Client 访问 ESP32-C6-GEEK,两者建立 TCP 通讯,GEEK 在 LCD 上显示接收内容。适用于学习 ESP32-C6-GEEK 与 Wi-Fi 和 LCD 交互,作为 Wi-Fi 服务器,接收客户端数据并在 LCD 显示,测试稳定性与可靠性
使用 sprintf 函数将传入的 IP 地址整数按照点分十进制的格式转换为字符串,并存储在 result 指针指向的字符数组中
void intToIpAddress(uint32_t ip, char *result) {
sprintf(result, "%d.%d.%d.%d", ip & 255,(ip >> 8) & 255,(ip >> 16) & 255,(ip >> 24) & 255);
}



该例程可使用 ESP32-C6-GEEK 打开 WIFI 的 AP 模式,PC 端连接其 WIFI 后,打开串口调试助手,通过 ESP32-C6-GEEK 创建的 HTTP 网页端发送消息给 GEEK,观察串口调试助手与 LCD 上的接收内容。适用于学习 ESP32-C6-GEEK 与 Wi-Fi 和 LCD 交互,作为 Wi-Fi 接入点服务器,处理客户端请求,测试稳定性与可靠性
使用 ESP32-C6-GEEK 的 UART 接口通过 USB 转 UART 工具与 PC 连接,打开串口调试助手

初始化相关配置和 LCD 显示屏
调用 WIFI_AP_Init() 初始化 Wi-Fi 接入点
void setup()
{
Config_Init();
LCD_Init();
Serial.begin(115200);
LCD_SetBacklight(100);
Paint_NewImage(LCD_WIDTH, LCD_HEIGHT, 90, WHITE);
Paint_SetRotate(90);
LCD_Clear(0x000f);
WIFI_AP_Init();
}
烧录成功,使用 PC 连接 ESP32-C6-GEEK 的 AP
LCD 会显示 HTTP 服务器的 IP 地址,使用浏览器进行登录 IP:192.168.4.1
使用 ESP32-C6-GEEK 的 UART 接口通过 USB 转 UART 工具与 PC 连接,打开串口调试助手
可在 HTTP Web 上输入文本内容并且发送 HTTP 请求至 ESP32-C6-GEEK,可在串口调试助手与 LCD 上显示接收内容



该例程可使用 ESP32-C6-GEEK 打开 WIFI 的 STA 模式,连接 WIFI 后,使用微雪云平台,进行 MQTT 通讯,订阅与发布主题,实现远距离传输信息。适用于学习 ESP32-C6-GEEK 与 Wi-Fi、MQTT 和 LCD 交互,连接 Wi-Fi 和 MQTT 服务器,收发 JSON 数据并在 LCD 显示,测试稳定性与可靠性
将接收到的字节数组转换为字符串 inputString。
在字符串中查找特定的 JSON 字段,如"data"和"key"(可根据实际情况修改为特定的数据标识符)。
提取出"builtIn"字段的值,并根据该值进行不同的操作。如果值为 0,则在 LCD 上显示 “close!”,否则显示 “open!”,同时在串口输出相应信息
void callback(char* topic, byte* payload, unsigned int length) {
String inputString;
for (int i = 0; i < length; i++) {
inputString += (char)payload[i];
}
Serial.println(inputString);
int dataBegin = inputString.indexOf("\"data\"");
if (dataBegin == -1) {
Serial.println(F("Missing 'data' field in JSON."));
return;
}
int builtInBegin = inputString.indexOf("\"key\"", dataBegin); // Please change to your data identifier
if (builtInBegin == -1) {
Serial.println(F("Missing 'builtIn' field in 'data' object."));
return;
}
int valueBegin = inputString.indexOf(':', builtInBegin);
int valueEnd = inputString.indexOf('}', valueBegin);
if (valueBegin == -1 || valueEnd == -1) {
Serial.println(F("Invalid 'builtIn' value."));
return;
}
String builtInValueStr = inputString.substring(valueBegin + 1, valueEnd);
int builtInValue = builtInValueStr.toInt();
if (builtInValue == 0) {
LCD_Clear(BLACK);
Paint_DrawString_EN(75, 55, "close!", &Font24, BLACK, GREEN);
Serial.println("close!");
} else {
LCD_Clear(BLACK);
Paint_DrawString_EN(75, 55, "open!", &Font24, BLACK, GREEN);
Serial.println("open!");
}
}
在 LCD 上显示 “Wifi Connecting...”。
在串口输出正在连接的 Wi-Fi 网络名称。
连接成功后,清空 LCD 屏幕并显示 “Wifi Connected”,同时在串口输出本地 IP 地址
void setup_wifi() {
Paint_DrawString_EN(20, 50, "Wifi Connecting...", &Font20, BLACK, GREEN);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
LCD_Clear(BLACK);
Paint_DrawString_EN(20, 50, "Wifi Connected", &Font20, BLACK, GREEN);
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
开启的热点名称与密码要与代码中一致 微雪云平台 账号注册与创建设备后,根据微雪云上新建设备的"查看地址"可以看到设备的 Client ID、Pub Topic、Sub Topic,将它们写入例程中进行赋值,用于 ESP32-C6-GEEK 连接自己的云平台设备


在 callback 函数中可以修改识别的标识符为我们自己在云平台上创建的设备属性标识符


烧录代码,连接上 WIFI 后,观察微雪云平台上设备是否进入 online 状态,若没有可以尝试刷新网页与使用 USB 转 UART 连接 PC 通过串口调试助手查看 WIFI 与 MQTT 连接情况,并且在 LCD 屏上也会显示 WIFI 与 MQTT 的连接情况

ESP32-C6-GEEK 连接微雪云成功之后即可通过 Dashboard 进行发送 MQTT 消息


我们能在 LCD 和串口调试助手中看到我们对设备属性值(例:"key") 的变化进行了不同的反馈,并且在微雪云的设备接收值中看到 ESP32-C6-GEEK 发送至微雪云设备的数据(接受值为自己的 Client ID,后续自己可将 key 的返回值或者状态发送回微雪云),至此实现了 MQTT 的数据上行与下行、订阅主题与发布主题


该例程可使用 ESP32-C6-GEEK 打开 WIFI 的 STA 模式与蓝牙,连接 WIFI 与蓝牙后,使用微雪云平台,可实现远程蓝牙锁屏与输入密码开屏,还有更多组合键等待您的开发。适用于 ESP32-C6-GEEK 集成 BLE 键盘、Wi-Fi 和 MQTT,控制 LCD 显示,测试稳定性与可靠性
作为 MQTT 订阅的回调函数,用于处理接收到的消息。
打印接收到的消息的主题,然后将接收到的字节数组转换为字符串。
在字符串中查找特定的 JSON 字段 “key”,如果你的标识符不是 “key”,需要修改代码。
提取出 “key” 字段的值,并根据值为 “1” 或其他情况分别调用 Screen_ON 或 Screen_OFF 函数
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.println("] ");
String payloadString = "";
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
payloadString += (char)payload[i];
}
int keyPosition = payloadString.indexOf("\"key\""); // Locate to "key",If your identifier is not "key", change it to your own!
char keyChar1 = payloadString.charAt(keyPosition + (strlen("\"key\"")+1)); // extract the first digit of the "key" value
// char keyChar2 = payloadString.charAt(keyPosition + (strlen("\"key\"")+2)); // If the extracted value is greater than one digit, add another digit
if (keyChar1 == '1') Screen_ON();
else Screen_OFF();
}
在串口输出正在连接的 Wi-Fi 网络名称
设置 Wi-Fi 模式为 STA(客户端模式),并使用指定的 SSID 和密码尝试连接。
在连接过程中,通过循环不断在串口输出连接状态信息,直到连接成功。
连接成功后,清空 LCD 屏幕并显示 “Wifi Connected”,同时在串口输出本地 IP 地址
void setupWiFi() {
Paint_DrawString_EN(20, 50, "Wifi Connecting...", &Font20, BLACK, GREEN);
Serial.print("Connecting to WiFi: ");
WiFi.setSleep(true);
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
LCD_Clear(BLACK);docs
Paint_DrawString_EN(20, 50, "Wifi Connected", &Font20, BLACK, GREEN);
Serial.println("\nWiFi connected");
Serial.println("IP address: " + WiFi.localIP().toString());
}
开启的热点名称与密码要与代码中一致(2.4GHZ 或任何可用频率)
微雪云平台 账号注册与创建设备后,根据微雪云上新建设备的"查看地址"可以看到设备的 Client ID、Sub Topic,将它们写入例程中进行赋值,用于 ESP32-C6-GEEK 连接自己的云平台设备
连接的蓝牙名称与密码要与代码中一致


在 callback 函数中可以修改识别的标识符为我们自己在云平台上创建的 设备属性标识符


修改为自己要输入的文本或者密码

烧录代码,连接上 WIFI 后,打开 PC 的蓝牙功能以配对连接设备,观察微雪云平台上设备是否进入 online 状态,若没有可以尝试刷新网页与使用 USB 转 UART 连接 PC 通过串口调试助手查看 WIFI 与 MQTT 连接情况,并且在 LCD 屏上也会显示 WIFI 与 MQTT 的连接情况


ESP32-C6-GEEK 连接微雪云成功之后,可通过手机端登录微雪云 Dashboard 进行远程控制
我们能在 LCD 和串口调试助手中看到我们对设备属性值(例:"key") 的变化进行了不同的反馈,后续还可以在 callback 函数中将按键修改成 Ctrl+C、Ctrl+V 等组合键,自己 DIY 属于你的远程控制蓝牙键盘

还可通过 键盘测试 的网站来测试 ESP32-C6-GEEK 蓝牙控制按下了哪些按键
打开键盘测试此界面,用手机端控制,键盘测试界面可显示按下了哪些按键

本章节包含以下两部分,请按需阅读:
以下环境设置适用于 Windows 10/11 系统,Mac/Linux 用户请参考 官方说明
下载并安装 Visual Studio Code。
在 VS Code 中,通过点击 VS Code 侧边活动栏中的 或使用快捷键(Ctrl+Shift+X)来打开 扩展 视图。然后,搜索 ESP-IDF 扩展并安装。

安装扩展后,VS Code 左侧活动栏中会出现 图标,点击该图标可查看 ESP-IDF 扩展的基本命令列表,在 Advanced 中选择 配置 ESP-IDF 扩展。

选择 Express 进入快速配置模式:

根据需要修改以下选项。

点击 Install 开始安装。你将看到一个显示安装进度的页面,包括 ESP-IDF 下载、ESP-IDF 工具下载安装以及 Python 虚拟环境创建的进度状态。

如果安装正确,你会看到所有设置已配置完成的提示,即可开始使用该扩展程序。

注意:如果 ESP-IDF 安装失败或需要重新安装,可以尝试删除 C:\Users\%Username%\esp 和 C:\Users\%Username%\.espressif 文件夹后重试。
ESP-IDF 示例程序位于 示例程序包 的 ESP-IDF 目录中。
本示例演示了 ESP32-C6-GEEK 测试 SD 卡的读写功能

其余准备
代码解释
使用 SDSPI 方式初始化 SD 卡 :
SD_card_Init();
测试 SD 卡读写功能 :
example_sdcard_task();
该示例可将开发板设置为热点,允许手机或其他处于 STA 模式的设备连接到开发板。

代码解释
在 softap_example_main.c 文件找到 SSID 和 PASSWORD,然后手机或其他处于 STA 模式的设备即可使用该 SSID 和 PASSWORD 连接到开发板。
#define EXAMPLE_ESP_WIFI_SSID "waveshare_esp32"
#define EXAMPLE_ESP_WIFI_PASSWORD "wav123456"
该示例可将开发板配置为 STA 设备,以连接路由器,从而接入系统网络。

代码解释
在 esp_wifi_bsp.c 文件找到 ssid 和 password,然后将其修改为当前环境中可用路由器的 SSID 和 Password。
wifi_config_t wifi_config = {
.sta = {
.ssid = "PDCN",
.password = "1234567890",
},
};
该示例可将 boot 按键变成一个多功能按键,可进行单击、双击或者长按以执行不同的操作
代码解释
初始化 boot 按钮,绑定按钮事件函数 :
void button_init(void)
{
button_config_t btn_cfg = {0};
button_gpio_config_t gpio_cfg = {
.gpio_num = BOOT_BUTTON_NUM,
.active_level = 0,
.enable_power_save = true,
};
esp_err_t ret = iot_button_new_gpio_device(&btn_cfg, &gpio_cfg, &boot_btn);
assert(ret == ESP_OK);
ret |= iot_button_register_cb(boot_btn, BUTTON_SINGLE_CLICK, NULL, button_event_cb, NULL);
ret |= iot_button_register_cb(boot_btn, BUTTON_DOUBLE_CLICK, NULL, button_event_cb, NULL);
ret |= iot_button_register_cb(boot_btn, BUTTON_LONG_PRESS_START, NULL, button_event_cb, NULL);
}
通过移植 LVGL,在屏幕上实现一些多功能的 GUI 界面。

开发板设计文件
ESP32-C6 芯片官方手册
数据手册
周一-周五(9:30-6:30)周六(9:30-5:30)
手机:13434470212
邮箱:services04@spotpear.cn
QQ:202004841
