Waveshare e-Paper HAT, чтобы войти в глубокий сон и периодически просыпаться - PullRequest
0 голосов
/ 08 сентября 2018

В настоящее время я делаю аппаратный проект, в соответствии с которым мне необходимо

  • Проснись дисплей электронной бумаги
  • Обновить
  • Установите контроллер E-paper на глубокий сон

Аппаратное обеспечение, которое я использовал, это контроллер Waveshare e-Paper Hat и дисплей Waveshare e-Paper Hat с диагональю 7,5 дюйма. Я также использую контроллер Arduino под названием ESP32, но Sparkfun, который имеет 2 ядра.

Не уверен, что это актуально, но метод обновления дисплея запускается вместе с методом мигания светодиода, который обрабатывается на двух ядрах в ESP32.

При способе отображения экран обновляется, а затем переходит в режим глубокого сна и активируется через 12 часов. Я сократил продолжительность с 12 часов до 1 минуты. Однако я сталкиваюсь с этой странной проблемой, когда контроллер e-Paper Hat может спать и инициализироваться в течение одного цикла, а затем не может сделать это снова. (В этом случае я просто обновил слова на дисплее, чтобы они стали случайными числами 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 */ 
}

Приведенный ниже код представляет собой метод отображения обновлений, который должен периодически запускаться и переходить в глубокий сон после каждого обновления

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);

Любая помощь будет принята с благодарностью! Так как это мой первый опыт работы с оборудованием, было бы полезно, если бы вы все упростили его. Ура

...