Skip to content

Instantly share code, notes, and snippets.

@TamojitSaha
Last active January 9, 2023 10:54
Show Gist options
  • Save TamojitSaha/cc06ab4e63a086238713b06a04a20f5c to your computer and use it in GitHub Desktop.
Save TamojitSaha/cc06ab4e63a086238713b06a04a20f5c to your computer and use it in GitHub Desktop.
// Pin definition
#define RST_PIN 2
#define DC_PIN 4
#define CS_PIN 15
#define BUSY_PIN 5
#define SCK_PIN 14
#define SDI_PIN 13
#define SWRESET 0x12
#define ACT_DISPLAY_UPDATE 0x20
#define SLEEP_MODE 0x10
#define EPD_W21_MOSI_0 digitalWrite(SDI_PIN,LOW)
#define EPD_W21_MOSI_1 digitalWrite(SDI_PIN,HIGH)
#define EPD_W21_CLK_0 digitalWrite(SCK_PIN,LOW)
#define EPD_W21_CLK_1 digitalWrite(SCK_PIN,HIGH)
#define EPD_W21_CS_0 digitalWrite(CS_PIN,LOW)
#define EPD_W21_CS_1 digitalWrite(CS_PIN,HIGH)
#define EPD_W21_DC_0 digitalWrite(DC_PIN,LOW)
#define EPD_W21_DC_1 digitalWrite(DC_PIN,HIGH)
#define EPD_W21_RST_0 digitalWrite(RST_PIN,LOW)
#define EPD_W21_RST_1 digitalWrite(RST_PIN,HIGH)
#define isEPD_W21_BUSY digitalRead(BUSY_PIN)
#define SDI_PIN_READ digitalRead(SDI_PIN)
#define DEBUG
#define printf(_s) Serial.print(_s)
////////FUNCTION//////
void SPI_Write(unsigned char value);
uint8_t SPI_Read(void);
void EPD_W21_WriteDATA(unsigned char command);
void EPD_W21_WriteCMD(unsigned char command);
//EPD
void EPD_W21_Init(void);
// void PIC_display(const unsigned char* picData_old,const unsigned char* picData_new);
void EPD_update(void);
void EPD_sleep(void);
void EPD_read_busy(void);
// void PIC_display_Clean(void);
void EPD_all_white(void);
void EPD_all_black(void);
void EPD_all_red(void);
void EPD_partial_display_Color(unsigned int x_start, unsigned int y_start, const unsigned char *old_data, const unsigned char *new_data, unsigned int PART_COLUMN, unsigned int PART_LINE, unsigned char mode); //partial display
//LUT
// void EPD_init_LUT(void);
void setup() {
pinMode(BUSY_PIN, INPUT);
pinMode(RST_PIN, OUTPUT);
pinMode(DC_PIN, OUTPUT);
pinMode(CS_PIN, OUTPUT);
pinMode(SCK_PIN, OUTPUT);
pinMode(SDI_PIN, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT); //ESP8266 Status light
ESP.wdtDisable();//Turn off the software watchdog
#ifdef DEBUG
Serial.begin(115200);
#endif
}
void loop() {
printf("Load white\n");
EPD_W21_Init();
printf("Init white done\n");
EPD_all_white();
EPD_update();
EPD_deepSleep();
delay(8000);
printf("Load Red\n");
EPD_W21_Init();
printf("Init Red done\n");
EPD_all_red();
EPD_update();
EPD_deepSleep();
delay(8000);
printf("Load Black\n");
EPD_W21_Init();
printf("Init Black done\n");
EPD_all_black();
EPD_update();
EPD_deepSleep();
delay(8000);
// ESP.wdtFeed();
}
//////////////////////SPI///////////////////////////////////
void SPI_Write(unsigned char value)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
EPD_W21_CLK_0;
if (value & 0x80)
EPD_W21_MOSI_1;
else
EPD_W21_MOSI_0;
value = (value << 1);
EPD_W21_CLK_1;
}
}
uint8_t SPI_Read(void)
{
EPD_W21_DC_1;
delayMicroseconds(5);
EPD_W21_CLK_0;
unsigned char i, value;
for (i = 0; i <= 8; i++) {
value = value << 1;
value |= SDI_PIN_READ;
EPD_W21_CLK_1;
delayMicroseconds(5);
EPD_W21_CLK_0;
}
return value;
}
void EPD_W21_WriteCMD(unsigned char command)
{
EPD_W21_CS_0;
EPD_W21_DC_0; // command write
SPI_Write(command);
EPD_W21_CS_1;
}
void EPD_W21_WriteDATA(unsigned char data)
{
EPD_W21_CS_0;
EPD_W21_DC_1; // command write
SPI_Write(data);
EPD_W21_CS_1;
}
/////////////////EPD settings Functions/////////////////////
void EPD_W21_Init(void)
{
delay(10);
EPD_W21_RST_0; // Module reset
delay(10); //At least 10ms
EPD_W21_RST_1;
delay(10);
EPD_read_busy();
EPD_W21_WriteCMD(SWRESET);
EPD_read_busy();
}
void EPD_update(void) {
EPD_W21_WriteCMD(ACT_DISPLAY_UPDATE);
EPD_read_busy();
}
void EPD_deepSleep(void) {
EPD_W21_WriteCMD(SLEEP_MODE);
EPD_W21_WriteDATA(0x01);
delay(100);
}
void EPD_read_busy(void)
{
// EPD_W21_WriteCMD(0x71);
while (1)
{ //=1 BUSY
if (isEPD_W21_BUSY == 0) break;
delayMicroseconds(5) ;
ESP.wdtFeed();
}
delayMicroseconds(100) ;
// while (!isEPD_W21_BUSY) //0 is busy
// {
//#ifdef DEBUG
// printf("Epaper Busy\n");
//#endif
//
// ESP.wdtFeed(); //Feed dog to prevent system reset
// }
#ifdef DEBUG
printf("Epaper Release\n");
#endif
delay(100);
}
void EPD_all_white(void) {
EPD_W21_WriteCMD(0x24);
uint16_t i, j;
for (i = 0; i < 296; i++)
{
for (j = 0; j < 16; j++) {
EPD_W21_WriteDATA(0xff);
}
}
EPD_read_busy();
EPD_W21_WriteCMD(0x26);
for (i = 0; i < 296; i++)
{
for (j = 0; j < 16; j++) {
EPD_W21_WriteDATA(0x00);
}
}
}
void EPD_all_black(void) {
EPD_W21_WriteCMD(0x24);
uint16_t i, j;
for (i = 0; i < 296; i++)
{
for (j = 0; j < 16; j++) {
EPD_W21_WriteDATA(0x00);
}
}
EPD_W21_WriteCMD(0x26);
for (i = 0; i < 296; i++) {
for (j = 0; i < 16; i++)
{
EPD_W21_WriteDATA(0x00);
}
}
}
void EPD_all_red(void) {
EPD_W21_WriteCMD(0x24);
uint16_t i, j;
for (i = 0; i < 296; i++)
{
for (j = 0; j < 16; j++) {
EPD_W21_WriteDATA(0xFF);
}
}
EPD_read_busy();
EPD_W21_WriteCMD(0x26);
for (i = 0; i < 296; i++)
{
for (j = 0; j < 16; j++) {
EPD_W21_WriteDATA(0xFF);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment