完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
论坛的新手,ESP8266 也是如此。我有一个项目将 I2c 用于 OLED 显示器并通过串行(引脚 3-RX、1-TX)与另一个设备通信。我让一切正常,或者我是这么想的,并且发现在“启动”时一切都运行良好。然后 ESP 进入 DeepSleep,当它醒来时,它只是“可能”向串行发送命令,但也可能不会。
因此,我从头开始,对代码进行细化,以减少在该问题中发挥潜在作用的变量。当我执行以下操作时,它 100% 的时间都有效。(working = Serial.print(“我醒了”),打开 LED,睡眠 5 秒,进入深度睡眠,点击一个按钮唤醒,该按钮向 RST 发送低电平并按预期重复)。这是非常简单的代码,似乎在 100% 的时间里都能正常工作。 代码:全选#define LED 2 //Define connection of LED void setup() { Serial.begin(115200); Serial.setTimeout(2000); while(!Serial){} Serial.println("I'm awake now!); pinMode(LED, OUTPUT); // Initialize the LED_BUILTIN pin as an output digitalWrite(LED, LOW); // Turn the LED on (Note that LOW is the voltage level delay(5000); ESP.deepSleep(0); } void loop() { } 但是,当我为 OLED 添加显示代码时,会发生以下情况...... 1 - 它始终在加电(启动)时工作 2 - 第一次或第二次唤醒也可能工作 3 - 再也不会工作,但代码永远不会出错,它只是就像它传输并移动到代码中的下一行一样。例如,显示器将加载所有标题图像,然后加载“Hello World” 5 秒钟,然后返回深度睡眠。但是在下面的代码中没有任何东西被发送到串行监视器。(或者我的项目代码中的设备只是发送“Serial.print('O');” 正如我刚才提到的,我用串行终端验证了这一点并且感到震惊(不知道为什么)我看到了这个完全相同的行为也有。这是无法按预期工作的代码。 代码:全选#include #include #define LED 2 //Define connection of LED // OLED Display #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 32 // OLED display height, in pixels #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); #define CHARGE_AREA_START_X 20 #define CHARGE_AREA_START_Y 18 #define CHARGE_AREA_WIDTH 83 #define CHARGE_AREA_HEIGHT 28 // 'FullBat', 25x8px const unsigned char fullBat [] PROGMEM = { 0x1f, 0xff, 0xff, 0x80, 0x18, 0x00, 0x01, 0x80, 0xfb, 0xff, 0xfd, 0x80, 0xfb, 0xff, 0xfd, 0x80, 0xfb, 0xff, 0xfd, 0x80, 0xfb, 0xff, 0xfd, 0x80, 0x18, 0x00, 0x01, 0x80, 0x1f, 0xff, 0xff, 0x80 }; // 'wifi', 15x10px const unsigned char wifi [] PROGMEM = { 0x00, 0x00, 0x3f, 0xf8, 0x7f, 0xfc, 0x70, 0x1c, 0x07, 0xe0, 0x1f, 0xf0, 0x0c, 0x60, 0x01, 0x00, 0x03, 0x80, 0x01, 0x00 }; void setup() { // Serial Setup Serial.begin(115200); Serial.setTimeout(2000); while(!Serial) { } Serial.println("I'm awake now"); // OLED Setup display.setRotation(2); // Set rotation if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32 for(;;); // Don't proceed, loop forever } DrawScreen(); // Turn the LED on pinMode(LED, OUTPUT); digitalWrite(LED, LOW); delay(5000); // Going to Deep Sleep Serial.println("I'm shutting down now"); display.clearDisplay(); display.display(); ESP.deepSleep(0); } void loop() { } void DrawScreen(void) { display.clearDisplay(); display.setTextColor(SSD1306_WHITE); display.drawBitmap(0,0,wifi,15,10,1); // Wifi (18,12) display.drawBitmap(87,0,fullBat,25,8,1); // Battery display.setCursor(0, 16); display.setTextSize(.5); display.print("Hello World"); display.display(); } 你们以前见过这个吗?我也尝试过使用 SoftwareSerial 以防它是标准串行库中的错误但没有骰子,结果相同。 |
|
相关推荐
1个回答
|
|
尝试使用硬串口(例如UART)而不是软串口(例如SoftwareSerial)。软串口在 ESP8266 上可能会出现类似您遇到的问题。另外,确保您在 ESP8266 的唤醒步骤中正确地初始化您的串口。这可能需要您在每次唤醒时重新初始化它。最后,您可以尝试使用更长的等待时间来确保 ESP8266 刚刚醒来时已经完全唤醒。
|
|
|
|
只有小组成员才能发言,加入小组>>
545浏览 6评论
457浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
437浏览 5评论
441浏览 4评论
411浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 01:08 , Processed in 0.851156 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号