michaelzhouh 2023-06-06 11:11 采纳率: 0%
浏览 23

ESP32想让oled屏幕模块化开启和关闭,怎么封装呢?

ESP32如何让oled屏幕模块化开启和关闭,我现在各个部件单独都实现了功能:
1、一个oled屏幕
2、一个按键button1,我已经实现了点击按键控制屏幕上的一个数字依次加一,并展示。
但是我这个oled屏幕不需要常亮,我想把它作为一个模块(或者叫一个独立的外设),我的需求是想增加一个按钮button2,点击这个按钮让oled屏幕功能启用或显示,再按一次关闭屏幕,然后再执行点击button1,数字+1,并展示。

现在我屏幕展示用的timer1,按钮点击用了timer2。我应该怎么封装才能实现这个功能呢?(oled的电源线用自锁按键开关?还是什么的?)求指点思路。

  • 写回答

1条回答 默认 最新

  • 辞轩. 2023-06-07 14:06
    关注

    实现这个功能可以考虑以下步骤:

    1. 定义一个变量来存储屏幕开关状态,例如isOLEDOn,初始值设置为关闭状态(false)。

    2. 在button2的回调函数中,判断isOLEDOn的值,如果为false,则将其设置为true,打开屏幕显示;如果为true,则将其设置为false,关闭屏幕显示。

    3. 在button1的回调函数中,添加判断逻辑,判断isOLEDOn的值,如果为true,则执行数字+1并展示的操作,否则不执行任何操作。

    4. 在初始化时,打开和关闭屏幕。

    为了控制屏幕的电源,可以使用一个自锁按键开关。只需要将OLED的电源线连接到开关的一个端口,再将另一个端口连接到5V电源和GND,然后在按下开关时切换电源的连接状态,从而实现屏幕的启用和关闭。

    以下是示例代码:

    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    
    #define SCREEN_WIDTH 128
    #define SCREEN_HEIGHT 32
    #define OLED_RESET -1
    
    Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
    
    int button1Pin = 15;
    int button2Pin = 2;
    bool isOLEDOn = false;
    
    void button1Pressed() {
      if (isOLEDOn) {
        // 执行数字+1并展示的操作
      }
    }
    
    void button2Pressed() {
      if (isOLEDOn) {
        // 关闭屏幕显示
        isOLEDOn = false;
        display.ssd1306_command(SSD1306_DISPLAYOFF);
      } else {
        // 打开屏幕显示
        isOLEDOn = true;
        display.ssd1306_command(SSD1306_DISPLAYON);
      }
    }
    
    void setup() {
      pinMode(button1Pin, INPUT_PULLUP);
      pinMode(button2Pin, INPUT_PULLUP);
      attachInterrupt(button1Pin, button1Pressed, FALLING);
      attachInterrupt(button2Pin, button2Pressed, FALLING);
      display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
    }
    
    void loop() {
      // 持续运行
    }
    

    这是一个简单的示例,只是实现了基本的逻辑,具体实现方式可以根据具体需求进行调整。

    评论

报告相同问题?

问题事件

  • 创建了问题 6月6日