Waveshare电子纸HAT进入深度睡眠并定期唤醒

时间:2018-09-08 15:11:44

标签: arduino iot esp32

我目前正在做一个基于硬件的项目,因此我需要

  • 唤醒电子纸显示屏
  • 更新
  • 将电子纸控制器设置为深度睡眠

我使用的硬件是Waveshare电子纸帽控制器和Waveshare 7.5英寸电子纸帽显示器。我还使用了一个称为ESP32的arduino控制器,但Sparkfun具有2个内核。

不确定这是否相关,但是显示更新方法与在ESP32的两个内核上处理的LED闪烁方法一起运行。

在显示方法中,屏幕将自动更新,然后进入深度睡眠,并在12小时后唤醒。我已将持续时间从12小时缩短为1分钟。但是,我遇到了一个奇怪的问题,即电子纸帽控制器能够休眠和初始化一个周期,然后又无法执行此操作。 (在这种情况下,我只是将显示屏上的单词更新为随机数1和3)

以下代码片段是上传到ESP32控制器的设置方法。

void setup() {
    // put your setup code here, to run once:
    Serial.begin(115200);
    pinMode(LED, OUTPUT); //set the LED PIN as at output
    pinMode(BUTTON, INPUT); //set the BUTTON as an input 
    // pinMode(RST, INPUT); //set the RST as an input
    // epd.setFastRefresh(true);

    gfx.init();
    gfx.setRotation(1);

    ledcSetup(channel, freq, resolution);
    ledcAttachPin(PIEZO, channel);
    Serial.println("Finished Setup");
    delay(500);

    xTaskCreatePinnedToCore(
    displayMethod,                  /* pvTaskCode */
    "Display Update",            /* pcName */
    1000,                   /* usStackDepth */
    NULL,                   /* pvParameters */
    1,                      /* uxPriority */
    &TaskA,                 /* pxCreatedTask */
    0);                     /* xCoreID */

    xTaskCreatePinnedToCore(
    alarmMethod,         /* pvTaskCode */
    "Alarm",            /* pcName */
    1000,                  /* usStackDepth */
    NULL,                  /* pvParameters */
    1,                     /* uxPriority */
    &TaskB,                /* pxCreatedTask */
    1);                    /* xCoreID */ 
}

下面的代码是update Display方法,该方法应定期运行并在每次更新后进入深度睡眠状态

void displayMethod(void * parameter ) {
    Serial.println("Display Thread");
    for (;;) {
        unsigned long start = millis();  
        int randNum = rand()%(3-0 + 1) + 0; 
        String randString(randNum);
        gfx.fillBuffer(0);
        gfx.setColor(1);
        gfx.setFont(ArialMT_Plain_24);
        gfx.drawString(10, 10, "HsKA Smart Door Display" + randString);
        gfx.drawHorizontalLine(10 , 45 , gfx.getWidth());
        gfx.setFont(ArialMT_Plain_16);
        gfx.drawString(10, 50, "Everything works!");
        gfx.commit();
        Serial.println("Commited buffer");
        workLoad();
        Serial << "Task 1 complete running on Core " << (xPortGetCoreID()) << " Time = " << (millis() - start)<< " mS"  << endl;
        unsigned long waiting = millis();
        while(millis() - waiting < 1000)
        {
            epd.Sleep(); // Makes the display go to sleep 
            Serial << "Waited for a total of " << millis() -  waiting << " milliseconds " << endl;
        }
        epd.init();

    }
}

我以为epd.Sleep()是使控制器进入睡眠状态,而epd.init()是我以为初始化控制器。

这是我的初始化,如果有用的话

//Display 
#define BUSY 27
#define RST 4 
#define DC 17
#define CS 16 
#define CLK 18 
#define DIN 23
#define BITS_PER_PIXEL 2  // 2^2 = 4 colors
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 384

uint16_t palette[] = {0,3,4};
uint8_t rotation = 1;


//Declaration for PIN mapping 
const int LED = 5; 
const int BUTTON = 0; 

//Initialization
EPD_WaveShare75 epd(CS, RST, DC, BUSY);    
MiniGrafx gfx= MiniGrafx(&epd, BITS_PER_PIXEL, palette);

任何帮助将不胜感激!因为这是我第一次涉足硬件,所以如果你们都简化了它会有所帮助。欢呼声

0 个答案:

没有答案