【发布时间】:2021-02-02 18:23:13
【问题描述】:
问题
我有一个使用 Adafruit_SSD1306 库连接的带有 I2C OLED 的 ESP32 T-call SIM800L。在设置或循环中调用 displayText() 函数时它工作得很好,虽然我有一个设置为 1Hz 的定时器中断,我试图在 OLED 上显示一条消息,但它不起作用。 ISR 本身确实有效,我有一个计数变量,它在每次中断时递增,我将它打印到串行监视器(我知道你不应该真的在 ISR 中做串行的东西,但它仍然有效)所以 ISR 肯定会中断正确。奇怪的是,我发誓我之前有它工作过(在 ISR 中显示),所以我相信这是可能的。我尝试删除 ISR 中的所有其他内容,只包括显示功能,但没有成功。
非常感谢任何帮助
代码:
#include <Adafruit_SSD1306.h> //OLED
#include <Adafruit_GFX.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
volatile int count = 0;
void setupDisplay ()
{
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) // Address 0x3C for 128x32
{
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
}
void displayText(int count)
{
display.clearDisplay();
display.setTextSize(1); // Draw 2X-scale text
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print(count);
display.display(); // Show initial text
}
///* create a hardware timer */
hw_timer_t * timer = NULL;
void IRAM_ATTR onTimer()
{
count++;
Serial.println(count);
//displayText(count);
display.clearDisplay();
display.setTextSize(1); // Draw 2X-scale text
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("Display from ISR");
display.display(); // Show initial text
}
void setup()
{
Serial.begin(115200);
setupDisplay();
displayText(count);
timer = timerBegin(0, 80, true);
timerAttachInterrupt(timer, &onTimer, true);
timerAlarmWrite(timer, 1000000, true);
timerAlarmEnable(timer);
Serial.println("start timer");
}
void loop()
{
}
串行监视器打印输出
start timer
1
2
3
4
5
6
7
8
9
10
【问题讨论】:
标签: arduino esp32 arduino-c++