Use two screens connected to the same host¶
This procedure explains how to use two screens connected to the same host.
Configure¶
Boards¶
Define two boards, one per screen.
-
The SPI signals,
SCK
,MOSI
andMISO
are shared. -
The GPIOs for
.panelBusy
,.panelDC
,.panelReset
,.flashCS
and.panelCS
are specific to each screen. -
The remaining GPIOs are set to
NOT_CONNECTED
.
``` cpp const pins_t boardRaspberryPiPico_RP2040_0 = { .panelBusy = 13, ///< EXT3 and EXT3.1 pin 3 Red -> GP13 .panelDC = 12, ///< EXT3 and EXT3.1 pin 4 Orange -> GP12 .panelReset = 11, ///< EXT3 and EXT3.1 pin 5 Yellow -> GP11 .flashCS = 10, ///< EXT3 and EXT3.1 pin 8 Violet -> GP10 .panelCS = 17, ///< EXT3 and EXT3.1 pin 9 Grey -> GP17 .panelCSS = NOT_CONNECTED, ///< EXT3 and EXT3.1 pin 12 Grey2 -> GP14 .flashCSS = NOT_CONNECTED, ///< EXT3 pin 20 or EXT3.1 pin 11 Black2 -> GP15 .touchInt = NOT_CONNECTED, ///< EXT3-Touch pin 3 Red -> GP2 .touchReset = NOT_CONNECTED, ///< EXT3-Touch pin 4 Orange -> GP3 .panelPower = NOT_CONNECTED, ///< Optional power circuit .cardCS = NOT_CONNECTED, ///< Separate SD-card board .cardDetect = NOT_CONNECTED, ///< Separate SD-card board };
const pins_t boardRaspberryPiPico_RP2040_1 = { .panelBusy = 9, ///< EXT3 and EXT3.1 pin 3 Red -> GP13 .panelDC = 8, ///< EXT3 and EXT3.1 pin 4 Orange -> GP12 .panelReset = 7, ///< EXT3 and EXT3.1 pin 5 Yellow -> GP11 .flashCS = 6, ///< EXT3 and EXT3.1 pin 8 Violet -> GP10 .panelCS = 21, ///< EXT3 and EXT3.1 pin 9 Grey -> GP17 .panelCSS = NOT_CONNECTED, ///< EXT3 and EXT3.1 pin 12 Grey2 -> GP14 .flashCSS = NOT_CONNECTED, ///< EXT3 pin 20 or EXT3.1 pin 11 Black2 -> GP15 .touchInt = NOT_CONNECTED, ///< EXT3-Touch pin 3 Red -> GP2 .touchReset = NOT_CONNECTED, ///< EXT3-Touch pin 4 Orange -> GP3 .panelPower = NOT_CONNECTED, ///< Optional power circuit .cardCS = NOT_CONNECTED, ///< Separate SD-card board .cardDetect = NOT_CONNECTED, ///< Separate SD-card board }; ```
Drivers¶
Define two drivers, one per screen.
- When using screens with different films,
``` cpp
include “Pervasive_Wide_Small.h”¶
Pervasive_Wide_Small myDriver_0(eScreen_EPD_266_KS_0C, boardRaspberryPiPico_RP2040_0);
include “Pervasive_BWRY_Small.h”¶
Pervasive_Wide_Small myDriver_1(eScreen_EPD_266_QS_0F, boardRaspberryPiPico_RP2040_0); ```
- When using multiple screens with the same film,
``` cpp
include “Pervasive_Wide_Small.h”¶
Pervasive_Wide_Small myDriver_0(eScreen_EPD_266_KS_0C, boardRaspberryPiPico_RP2040_0); Pervasive_Wide_Small myDriver_1(eScreen_EPD_266_KS_0C, boardRaspberryPiPico_RP2040_1); ```
Screens¶
Define two screens, one per screen.
``` cpp
include “PDLS_Basic.h”¶
Screen_EPD myScreen_0(&myDriver_0); Screen_EPD myScreen_1(&myDriver_1); ```
Frame-buffers¶
Ensure the host provides enough RAM for the frame-buffers.
Each screen creates its own frame-buffer dynamically at run-time with
cpp
static uint8_t * _newFrameBuffer;
_newFrameBuffer = new uint8_t[u_pageColourSize * u_bufferDepth];
s_newImage = (uint8_t *) _newFrameBuffer;
If this solution raises an issue, create the frame-buffers statically at build-time and pass them on to the constructors as parameters.
``` cpp
include “PDLS_Basic.h”¶
uint8_t frameBuffer_0[frameSize_EPD_266]; Screen_EPD myScreen_0(&myDriver_0, frameBuffer_0);
uint8_t frameBuffer_1[frameSize_EPD_266]; Screen_EPD myScreen_1(&myDriver_1, frameBuffer_1); ```
Fonts¶
Each screen can have its own set of fonts. However, it is recommended to add the fonts in the same order for each screen.
``` cpp fontSmall = myScreen_0.addFont(Font_DejaVuSans16); fontSmall = myScreen_1.addFont(Font_DejaVuSans16); fontSmall -= (fontSmall > 0) ? 1 : 0;
fontMedium = myScreen_0.addFont(Font_DejaVuSans24); fontMedium = myScreen_1.addFont(Font_DejaVuSans24); fontMedium -= (fontMedium > 0) ? 1 : 0;
fontLarge = myScreen_0.addFont(Font_DejaVuSans48); fontLarge = myScreen_1.addFont(Font_DejaVuSans48); fontLarge -= (fontLarge > 0) ? 1 : 0; ```
Use¶
Use the two screens normally.
Example¶
The example below helps to identify each screen.
``` cpp // SDK and configuration
include “PDLS_Common.h”¶
// Define variables and constants // Boards const pins_t boardRaspberryPiPico_RP2040_0 = { .panelBusy = 13, ///< EXT3 and EXT3.1 pin 3 Red -> GP13 .panelDC = 12, ///< EXT3 and EXT3.1 pin 4 Orange -> GP12 .panelReset = 11, ///< EXT3 and EXT3.1 pin 5 Yellow -> GP11 .flashCS = 10, ///< EXT3 and EXT3.1 pin 8 Violet -> GP10 .panelCS = 17, ///< EXT3 and EXT3.1 pin 9 Grey -> GP17 .panelCSS = NOT_CONNECTED, ///< EXT3 and EXT3.1 pin 12 Grey2 -> GP14 .flashCSS = NOT_CONNECTED, ///< EXT3 pin 20 or EXT3.1 pin 11 Black2 -> GP15 .touchInt = NOT_CONNECTED, ///< EXT3-Touch pin 3 Red -> GP2 .touchReset = NOT_CONNECTED, ///< EXT3-Touch pin 4 Orange -> GP3 .panelPower = NOT_CONNECTED, ///< Optional power circuit .cardCS = NOT_CONNECTED, ///< Separate SD-card board .cardDetect = NOT_CONNECTED, ///< Separate SD-card board };
const pins_t boardRaspberryPiPico_RP2040_1 = { .panelBusy = 9, ///< EXT3 and EXT3.1 pin 3 Red -> GP13 .panelDC = 8, ///< EXT3 and EXT3.1 pin 4 Orange -> GP12 .panelReset = 7, ///< EXT3 and EXT3.1 pin 5 Yellow -> GP11 .flashCS = 6, ///< EXT3 and EXT3.1 pin 8 Violet -> GP10 .panelCS = 21, ///< EXT3 and EXT3.1 pin 9 Grey -> GP17 .panelCSS = NOT_CONNECTED, ///< EXT3 and EXT3.1 pin 12 Grey2 -> GP14 .flashCSS = NOT_CONNECTED, ///< EXT3 pin 20 or EXT3.1 pin 11 Black2 -> GP15 .touchInt = NOT_CONNECTED, ///< EXT3-Touch pin 3 Red -> GP2 .touchReset = NOT_CONNECTED, ///< EXT3-Touch pin 4 Orange -> GP3 .panelPower = NOT_CONNECTED, ///< Optional power circuit .cardCS = NOT_CONNECTED, ///< Separate SD-card board .cardDetect = NOT_CONNECTED, ///< Separate SD-card board };
// Drivers
include “Pervasive_Wide_Small.h”¶
Pervasive_Wide_Small myDriver_0(eScreen_EPD_266_KS_0C, boardRaspberryPiPico_RP2040_0);
include “Pervasive_BWRY_Small.h”¶
Pervasive_Wide_Small myDriver_1(eScreen_EPD_266_QS_0F, boardRaspberryPiPico_RP2040_0);
// Screens
include “PDLS_Basic.h”¶
Screen_EPD myScreen_0(&myDriver_0); Screen_EPD myScreen_1(&myDriver_1);
// Functions void displayIdentity(Screen_EPD aScreen, uint8_t number) { aScreen.clear(); aScreen.setOrientation(myOrientation); aScreen.setPenSolid(false);
aScreen.selectFont(fontLarge);
aScreen.gTextLarge(0, 0, formatString("%i", number));
aScreen.flush();
}
// Add setup code void setup() { hV_HAL_begin();
myScreen_0.begin();
myScreen_1.begin();
fontLarge = myScreen_0.addFont(Font_DejaVuMono48);
fontLarge = myScreen_1.addFont(Font_DejaVuMono48);
fontLarge -= (fontLarge > 0) ? 1 : 0;
myScreen_0.setOrientation(myOrientation);
myScreen_0.clear();
myScreen_1.setOrientation(myOrientation);
myScreen_1.clear();
hV_HAL_log(LEVEL_DEBUG, "DISPLAY_IDENTITY");
displayIdentity(myScreen_0, 0);
displayIdentity(myScreen_1, 1);
wait(8);
hV_HAL_log(LEVEL_DEBUG, "Regenerate... ");
myScreen_0.regenerate();
myScreen_1.regenerate();
hV_HAL_end();
}
void loop() { delay(1000); } ```