Hello everybody,
I'm starting on my first e-ink/arduino project with an (micro) sd card.
I already dit my research on, spi, lowpower, sd, en the e-ink module.
This being the inspiration for my project: e-ink photoframe-project
These are the modules I will be using:
- e-ink screen module
- sd card module
- an arduino Uno
My goal is to create a photoframe that with an e-ink screen. The device needs to be very power efficiënt, so I want to use a deepsleep kind off mode in the arduino. Also the device will get it's .bmp files (foto's) from the micro sd card and show a different foto every 24 hours.
This is the code I will use for showing an image on the e-ink screen:
#include"Ap_29demo.h"
//IO settings
int BUSY_Pin = 8;
int RES_Pin = 9;
int DC_Pin = 10;
int CS_Pin = 11;
int SCK_Pin = 12;
int SDI_Pin = 13;
#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(RES_Pin,LOW)
#define EPD_W21_RST_1 digitalWrite(RES_Pin,HIGH)
#define isEPD_W21_BUSY digitalRead(BUSY_Pin)
////////FUNCTION//////
void driver_delay_us(unsigned int xus);
void driver_delay_xms(unsigned long xms);
void DELAY_S(unsigned int delaytime);
void SPI_Delay(unsigned char xrate);
void SPI_Write(unsigned char value);
void EPD_W21_WriteDATA(unsigned char command);
void EPD_W21_WriteCMD(unsigned char command);
//EPD
void EPD_W21_Init(void);
void EPD_init(void);
void PIC_display(const unsigned char* picData_old,const unsigned char* picData_new);
void EPD_sleep(void);
void EPD_refresh(void);
void lcd_chkstatus(void);
void PIC_display_Clean(void);
unsigned char HRES,VRES_byte1,VRES_byte2;
void setup() {
pinMode(BUSY_Pin, INPUT);
pinMode(RES_Pin, OUTPUT);
pinMode(DC_Pin, OUTPUT);
pinMode(CS_Pin, OUTPUT);
pinMode(SCK_Pin, OUTPUT);
pinMode(SDI_Pin, OUTPUT);
}
//Tips//
/*When the electronic paper is refreshed in full screen, the picture flicker is a normal phenomenon, and the main function is to clear the display afterimage in the previous picture.
When the local refresh is performed, the screen does not flash.*/
/*When you need to transplant the driver, you only need to change the corresponding IO. The BUSY pin is the input mode and the others are the output mode. */
void loop() {
while(1)
{
//PICTURE1
EPD_init(); //EPD init
PIC_display(gImage_black1,gImage_red1);//EPD_picture1 // refers to the image in the .h file provided by GooDisplay.
EPD_refresh();//EPD_refresh
EPD_sleep();//EPD_sleep,Sleep instruction is necessary, please do not delete!!!
delay(6000);
//PICTURE Clean
EPD_init(); //EPD init
PIC_display_Clean();
EPD_refresh();//EPD_refresh
EPD_sleep();//EPD_sleep,Sleep instruction is necessary, please do not delete!!!
while(1);
}
}
/////////////////////delay//////////////////////////////////////
void driver_delay_us(unsigned int xus) //1us
{
for(;xus>1;xus--);
}
void driver_delay_xms(unsigned long xms) //1ms
{
unsigned long i = 0 , j=0;
for(j=0;j<xms;j++)
{
for(i=0; i<256; i++);
}
}
void DELAY_S(unsigned int delaytime)
{
int i,j,k;
for(i=0;i<delaytime;i++)
{
for(j=0;j<4000;j++)
{
for(k=0;k<222;k++);
}
}
}
//////////////////////SPI///////////////////////////////////
void SPI_Delay(unsigned char xrate)
{
unsigned char i;
while(xrate)
{
for(i=0;i<2;i++);
xrate--;
}
}
void SPI_Write(unsigned char value)
{
unsigned char i;
SPI_Delay(1);
for(i=0; i<8; i++)
{
EPD_W21_CLK_0;
SPI_Delay(1);
if(value & 0x80)
EPD_W21_MOSI_1;
else
EPD_W21_MOSI_0;
value = (value << 1);
SPI_Delay(1);
driver_delay_us(1);
EPD_W21_CLK_1;
SPI_Delay(1);
}
}
void EPD_W21_WriteCMD(unsigned char command)
{
SPI_Delay(1);
EPD_W21_CS_0;
EPD_W21_DC_0; // command write
SPI_Write(command);
EPD_W21_CS_1;
}
void EPD_W21_WriteDATA(unsigned char command)
{
SPI_Delay(1);
EPD_W21_CS_0;
EPD_W21_DC_1; // command write
SPI_Write(command);
EPD_W21_CS_1;
}
/////////////////EPD settings Functions/////////////////////
void EPD_W21_Init(void)
{
EPD_W21_RST_0; // Module reset
delay(100); //At least 10ms
EPD_W21_RST_1;
delay(100);
}
void EPD_init(void)
{
EPD_W21_Init(); //Electronic paper IC reset
EPD_W21_WriteCMD(0x06); //boost soft start
EPD_W21_WriteDATA (0x17); //A
EPD_W21_WriteDATA (0x17); //B
EPD_W21_WriteDATA (0x17); //C
EPD_W21_WriteCMD(0x04); //Power on
lcd_chkstatus(); //waiting for the electronic paper IC to release the idle signal
EPD_W21_WriteCMD(0x00); //panel setting
EPD_W21_WriteDATA(0x0f); //LUT from OTP£¬400x300
EPD_W21_WriteDATA(0x0d); //VCOM to 0V fast
}
void EPD_refresh(void)
{
EPD_W21_WriteCMD(0x12); //DISPLAY REFRESH
driver_delay_xms(100); //!!!The delay here is necessary, 200uS at least!!!
lcd_chkstatus();
}
void EPD_sleep(void)
{
EPD_W21_WriteCMD(0X50); //VCOM AND DATA INTERVAL SETTING
EPD_W21_WriteDATA(0xf7);
EPD_W21_WriteCMD(0X02); //power off
lcd_chkstatus();
EPD_W21_WriteCMD(0X07); //deep sleep
EPD_W21_WriteDATA(0xA5);
}
void PIC_display(const unsigned char* picData_old,const unsigned char* picData_new)
{
unsigned int i;
EPD_W21_WriteCMD(0x10); //Transfer old data
for(i=0;i<15000;i++)
{
EPD_W21_WriteDATA(pgm_read_byte(&picData_old[i]));
}
EPD_W21_WriteCMD(0x13); //Transfer new data
for(i=0;i<15000;i++)
{
EPD_W21_WriteDATA(pgm_read_byte(&picData_new[i]));
}
}
void PIC_display_Clean(void)
{
unsigned int i;
EPD_W21_WriteCMD(0x10); //Transfer old data
for(i=0;i<15000;i++)
{
EPD_W21_WriteDATA(0xff);
}
EPD_W21_WriteCMD(0x13); //Transfer new data
for(i=0;i<15000;i++)
{
EPD_W21_WriteDATA(0xff);
}
}
void lcd_chkstatus(void)
{
unsigned char busy;
do
{
EPD_W21_WriteCMD(0x71);
busy = isEPD_W21_BUSY;
busy =!(busy & 0x01);
}
while(busy);
driver_delay_xms(200);
}
//////////////////////////////////END/////////////////////////////////////////
The code is provided by GooDisplay.
Now the problem: i'm not a very good programmer, far from it. I don't know how I'm supposed to program the rest of the code. Can someone tell me how I could replace the Image_black and Image_red with a reference to a .bmp file on the micro sd card? That would be an amazing start.
Thanks a lot in advance.
-Casper