
文章目录前言一、 ESP32串口引脚更改程序二、 ESP32 I2C 扫描仪代码三、ESP32读取BH1750程序来源千问1.使用 BH1750 库推荐四、 ESP32驱动TM1637显示BH1750数值串口同时显示五、ESP32读取点亮IPS ST7789VMAC读取程序2.读入数据总结前言随着人工智能的不断发展ESP32的学习门槛越来越低本系列文章所有的程序都是由豆包、千问、deekseep等人工智能生成然后按照实际情况加以修改上传运行。一、 ESP32串口引脚更改程序更改串口引脚可以不占用下载口用单独的下载口观察程序内容#include Arduino.h #include HardwareSerial.h #define SER_TX 6 // 定义新的串口引脚 #define SER_RX 7 // 创建一个新的 HardwareSerial 实例 // 可以使用 Serial1, Serial2 或自定义名称ESP32 通常支持 Serial, Serial1, Serial2 HardwareSerial Ser(1); // 参数 1 代表 UART1 (0是默认UART1和2可用) void setup() { Ser.begin(115200, SERIAL_8N1, SER_RX, SER_TX); } void loop() { Ser.println(欢迎来到ESP32的世界); delay(10); }二、 ESP32 I2C 扫描仪代码这是一个非常实用的工具代码。当你连接了 BH1750、OLED 屏幕或其他 I2C 设备但无法读取数据时I2C 扫描仪是排查问题的第一步。它可以告诉你ESP32 是否成功连接到了设备。设备的 I2C 地址 是多少BH1750 通常是 0x23 或 0x5C。ESP32 I2C 扫描仪代码你可以直接复制以下代码到 Arduino IDE 中上传。#include Wire.h // // 配置区域如果你的 SDA/SCL 不是默认引脚请修改这里 // 默认 ESP32: SDA 21, SCL 22 // #define I2C_SDA 21 #define I2C_SCL 22 void setup() { Serial.begin(115200); while (!Serial); // 等待串口连接 (可选) Serial.println(\n ESP32 I2C 扫描仪 ); Serial.print(正在初始化 I2C 总线 (SDA: ); Serial.print(I2C_SDA); Serial.print(, SCL: ); Serial.print(I2C_SCL); Serial.println()...); // 初始化 Wire 库指定引脚 Wire.begin(I2C_SDA, I2C_SCL); Serial.println(扫描开始...\n); } void loop() { byte count 0; // I2C 地址范围通常是 0x01 到 0x7F (0x00 和 0x7F 保留) for (byte address 1; address 127; address) { // 尝试向该地址发送数据 Wire.beginTransmission(address); byte error Wire.endTransmission(); // 如果返回 0表示设备存在 if (error 0) { Serial.print(发现设备 at 0x); if (address 16) Serial.print(0); Serial.print(address, HEX); // 常见设备提示 if (address 0x23 || address 0x5C) { Serial.print( - 可能是 BH1750 光照传感器!); } else if (address 0x3C || address 0x3D) { Serial.print( - 可能是 OLED 显示屏 (SSD1306)!); } else if (address 0x68) { Serial.print( - 可能是 MPU6050 陀螺仪!); } else if (address 0x44 || address 0x45) { Serial.print( - 可能是 SHT30/SHT31 温湿度传感器!); } Serial.println(); count; } // 其他错误码含义: // 1: 数据太长 // 2: 收到 NACK (无应答即没设备) // 3: 传输过程中出错 // 4: 其他错误 } if (count 0) { Serial.println(未找到任何 I2C 设备。); Serial.println(请检查:); Serial.println(1. 接线是否正确 (SDA/SDA, SCL/SCL, GND, VCC)); Serial.println(2. 供电是否正常 (3.3V 或 5V)); Serial.println(3. SDA/SCL 引脚定义是否与代码一致); } else { Serial.print(\n共找到 ); Serial.print(count); Serial.println( 个设备。\n); } // 每 5 秒扫描一次 delay(5000); }三、ESP32读取BH1750程序来源千问在 ESP32 上读取 BH1750 光照强度传感器非常简单因为 BH1750 通过 I2C 协议 通信。ESP32 硬件支持 I2C且 BH1750 不需要额外的库即可通过原生 Wire 库驱动当然使用专用库会更方便。以下是两种实现方法方法一推荐使用库 和 方法二原生 Wire 库无依赖。硬件连接说明BH1750 模块通常有 4 个引脚BH1750 引脚ESP32 引脚 (默认)说明VCC3.3V (或 5V)供电 (模块通常板载稳压支持 3.3-5V)GNDGND接地SCLGPIO 22I2C 时钟线 (可自定义)SDAGPIO 21I2C 数据线 (可自定义)注意ESP32 的默认 I2C 引脚通常是 GPIO 21 (SDA) 和 GPIO 22 (SCL)。如果你使用了其他引脚如你在上一个问题中替换了串口引脚请在代码中修改 SDA/SCL 定义1.使用 BH1750 库推荐这种方法代码简洁易于理解自动处理了测量模式和转换逻辑。安装库在 Arduino IDE 中点击 工具 (Tools) - 管理库 (Manage Libraries)。搜索 BH1750。安装由 claws (Christopher Laws) 或 robtillaart 编写的库推荐 BH1750 by claws。示例代码ESP32S3测试成功#include Arduino.h #include HardwareSerial.h #include Wire.h #include BH1750.h BH1750 lightMeter; // 创建 BH1750 对象 // 定义新的串口引脚 #define SER_TX 16 #define SER_RX 17 // 创建一个新的 HardwareSerial 实例 // 可以使用 Serial1, Serial2 或自定义名称ESP32 通常支持 Serial, Serial1, Serial2 HardwareSerial Ser(1); // 参数 1 代表 UART1 (0是默认UART1和2可用) void setup() { Ser.begin(115200, SERIAL_8N1, SER_RX, SER_TX); Wire.begin(6, 7); // 设定IIC引脚I2C_SDA, I2C_SCLS顺序 // 尝试初始化BH1750光照传感器使用连续高分辨率模式 if (lightMeter.begin(BH1750::CONTINUOUS_HIGH_RES_MODE)) { // 传感器初始化成功通过串口输出提示信息 Ser.println(BH1750 传感器初始化完毕); } else { // 传感器初始化失败通过串口输出错误信息并进入死循环 Ser.println(BH1750 传感器初始化失败); while (1) { delay(100); } } } void loop() { float lux lightMeter.readLightLevel(); // 读取光照强度 Ser.println(ESP32 BH1750 示例程序); // 输出程序标题和分隔线 Ser.println(---------------------); Ser.print( 光照强度); Ser.println(lux); Ser.println(欢迎来到ESP32的世界); delay(200); }常见问题与调试读取值为 -1 或 “未找到传感器”检查接线确保 SDA 接 SDASCL 接 SCL不要接反。检查地址大多数模块地址是 0x23。如果模块上的 ADDR 引脚接到了 VCC地址会变成 0x5C。你可以使用 I2C Scanner 程序来扫描总线上有哪些设备。上拉电阻ESP32 内部有上拉电阻通常不需要外接。但如果连线过长可能需要外接 4.7kΩ 上拉电阻到 3.3V。读数不稳定或为 0确保传感器没有被完全遮挡除非你在测黑暗。尝试降低分辨率模式如 ONE_TIME_LOW_RES_MODE虽然精度降低但速度更快。结合之前的串口替换如果你之前替换了串口引脚记得在 Serial.begin() 中使用新的引脚配置但 I2C 引脚 (SDA/SCL) 是独立配置的在 Wire.begin(SDA, SCL) 中互不影响。四、 ESP32驱动TM1637显示BH1750数值串口同时显示TM1637 需要专用库。最常用且稳定的是 TM1637 by Avishay Orpaz 或 fexuan。在 Arduino IDE 中安装点击 工具 - 管理库。搜索 TM1637。安装 TM1637 by Avishay Orpaz (或者 Groove - TM1637 也可以但 Avishay 的版本更通用)。#include Arduino.h #include HardwareSerial.h #include Wire.h #include BH1750.h #include TM1637.h BH1750 lightMeter; // 创建 BH1750 对象 // 定义新的串口引脚 #define SER_TX 16 #define SER_RX 17 TM1637 tm1637(1, 2); // CLK, DIO // 创建一个新的 HardwareSerial 实例 // 可以使用 Serial1, Serial2 或自定义名称ESP32 通常支持 Serial, Serial1, Serial2 HardwareSerial Ser(1); // 参数 1 代表 UART1 (0是默认UART1和2可用) void setup() { Ser.begin(115200, SERIAL_8N1, SER_RX, SER_TX); Wire.begin(6, 7); // 设定IIC引脚I2C_SDA, I2C_SCLS顺序 tm1637.init(); tm1637.set(BRIGHT_TYPICAL); // 尝试初始化BH1750光照传感器使用连续高分辨率模式 if (lightMeter.begin(BH1750::CONTINUOUS_HIGH_RES_MODE)) { // 传感器初始化成功通过串口输出提示信息 Ser.println(BH1750 传感器初始化完毕); } else { // 传感器初始化失败通过串口输出错误信息并进入死循环 Ser.println(BH1750 传感器初始化失败); while (1) { delay(100); } } } void loop() { float lux lightMeter.readLightLevel(); // 读取光照强度 Ser.println(ESP32 BH1750 示例程序); // 输出程序标题和分隔线 Ser.println(---------------------); Ser.print( 光照强度); Ser.println(lux); Ser.println(欢迎来到ESP32的世界); int lux_int (int)lux; // 将浮点数转换为整数 int thousands lux_int / 1000; int hundreds (lux_int % 1000) / 100; int tens (lux_int % 100) / 10; int ones lux_int % 10; tm1637.display(0, thousands); tm1637.display(1, hundreds); tm1637.display(2, tens); tm1637.display(3, ones); delay(200); }五、ESP32读取点亮IPS ST7789V在PllartformIO中下载TFT_eSPI库然后用替换库替换全部文件替换库下载地址#includeTFT_eSPI.h#includeSPI.h#includeWiFi.h#includeWire.h#includebmp.h// TFT 引脚已在 TFT_eSPI 库的用户设置文件 TTGO_T_Display.h 中进行了设置。// #define TFT_MOSI 19// #define TFT_SCLK 18// #define TFT_CS 5// #define TFT_DC 16// #define TFT_RST 23// #define TFT_BL 4 // Display backlight control pinTFT_eSPI tftTFT_eSPI(135,240);// 创建对象并调用自定义库voidespDelay(intms)// 延时函数{esp_sleep_enable_timer_wakeup(ms*1000);esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH,ESP_PD_OPTION_ON);esp_light_sleep_start();}voidsetup(){// 显示屏初始化流程tft.init();// 初始化显示屏硬件tft.setRotation(1);// 设置屏幕旋转方向190度顺时针tft.fillScreen(TFT_BLACK);// 清屏填充为黑色背景tft.setTextSize(2);// 设置默认字体大小为2号tft.setTextColor(TFT_GREEN);// 设置文本颜色为绿色tft.setCursor(0,0);// 设置文本光标初始位置x0, y0tft.setTextDatum(MC_DATUM);// 设置文本对齐基准点为“中中对齐”tft.setTextSize(2);// 重新设置字体大小为1号覆盖之前的2号tft.fillScreen(TFT_BLACK);tft.setTextDatum(MC_DATUM);// tft.setTextDatum(对齐方式参数);// TL_DATUM 左上对齐默认 文本从指定坐标向右下显示// MC_DATUM 中中对齐 文本居中显示最常用// BR_DATUM 右下对齐 文本从指定坐标向左上显示// TC_DATUM 上中对齐 文本水平居中、垂直靠上// BC_DATUM 下中对齐 文本水平居中、垂直靠下intaaa6666666;floatvolt3.85435;// String str AAAAAAA: String(aaa);String StrString(volt,2);intpos10;// 模拟位置变量String showTextBBB: String(pos);// 拼接变量// tft.drawString 参数核心4 个参数依次是 “显示文本、X 坐标、Y 坐标、字体大小”tft.drawString(weizhi: ,tft.width()/2,tft.height()/2-50,2);tft.drawString(String(aaa),tft.width()/2,tft.height()/2);// 最后的加减号表示离中心点高度tft.drawString(String(Str),tft.width()/2,tft.height()/216);tft.drawString(showText,tft.width()/2,tft.height()/240,2);// tft.drawString(RightButtonLongPress:, tft.width() / 2, tft.height() / 2 48);// tft.drawString([Deep Sleep], tft.width() / 2, tft.height() / 2 64);}voidloop(){}MAC读取程序代码如下示例#includeArduino.h#includeWiFi.h#includeHardwareSerial.hHardwareSerialSer2(2);voidsetup(){Ser2.begin(115200,SERIAL_8N1,22,23);WiFi.mode(WIFI_STA);Ser2.println(MAC地址: WiFi.macAddress());// 打印本机MAC地址}voidloop(){Ser2.print(收到数据: );Ser2.println(MAC地址: WiFi.macAddress());// 打印本机MAC地址Ser2.println(IP地址: WiFi.localIP().toString());Ser2.println(MAC地址: );delay(100);}2.读入数据代码如下示例datapd.read_csv(https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv)print(data.head())该处使用的url网络请求的数据。总结提示这里对文章进行总结例如以上就是今天要讲的内容本文仅仅简单介绍了pandas的使用而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。