189 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			189 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			C++
		
	
	
	
| // Display grey-scale images on a Monchrome ePaper display using
 | |
| // Floyd-Steinberg dithering
 | |
| // https://en.wikipedia.org/wiki/Floyd%E2%80%93Steinberg_dithering
 | |
| 
 | |
| // Example created by Bodmer 31/3/18 for TFT_eSPI library:
 | |
| // https://github.com/Bodmer/TFT_eSPI
 | |
| // Select the ePaper setup in library's "User_Setup_Select.h" file
 | |
| 
 | |
| // This sketch supports Waveshare 2 colour ePaper displays
 | |
| // https://www.waveshare.com/product/modules/oleds-lcds/e-paper.htm
 | |
| 
 | |
| // Test images are in the Data folder with sketch (press Ctrl+k)
 | |
| // Upload using the Tools menu "ESP8266 Sketch Data Upload" option
 | |
| 
 | |
| ///////////////////////////////////////////////////////////////////
 | |
| //   For ESP8266 connect as follows:                             //
 | |
| //   Display  3.3V to NodeMCU 3V3                                //
 | |
| //   Display   GND to NodeMCU GND                                //
 | |
| //                                                               //
 | |
| //   Display   GPIO   NodeMCU pin                                //
 | |
| //    BUSY       5      D1                                       //
 | |
| //    RESET      4      D2                                       //
 | |
| //    DC         0      D3                                       //
 | |
| //    CS         2      D4                                       //
 | |
| //    CLK       14      D5                                       //
 | |
| //                      D6 (MISO not connected to display)       //
 | |
| //    DIN       13      D7                                       //
 | |
| //                                                               //
 | |
| //  Note: Pin allocations for the ePaper signals are defined in  //
 | |
| //  ePaper library's epdif.h file, above are the default pins    //
 | |
| ///////////////////////////////////////////////////////////////////
 | |
| 
 | |
| // READ THIS  READ THIS  READ THIS  READ THIS  READ THIS  READ THIS
 | |
| // Install the ePaper library for your own display size and type
 | |
| // from here:
 | |
| // https://github.com/Bodmer/EPD_Libraries
 | |
| 
 | |
| // The following is for the Waveshare 2.7" colour ePaper display
 | |
| // include <epd?in?.h>  where ?.?? is screen size in inches
 | |
| #include   <epd2in7.h>                  // Screen specific library
 | |
| //#include <epd2in13.h>
 | |
| 
 | |
| Epd ePaper;                             // Create an instance ePaper
 | |
| 
 | |
| #include <TFT_eSPI.h>                   // Graphics library and Sprite class
 | |
| 
 | |
| TFT_eSPI      glc = TFT_eSPI();         // Invoke the graphics library class
 | |
| TFT_eSprite frame = TFT_eSprite(&glc);  // Invoke the Sprite class for the image frame buffer
 | |
| 
 | |
| #define INK    COLORED                  // Black ink
 | |
| #define PAPER  UNCOLORED                // 'paper' background colour
 | |
| 
 | |
| uint16_t epd_width  = EPD_WIDTH;        // Set the initial values, these are swapped
 | |
| uint16_t epd_height = EPD_HEIGHT;       // in different landscape/portrait rotations
 | |
|                                         // so call frame.width() or frame.height() to get new values
 | |
| 
 | |
| #define EPD_BUFFER 1                    // Label for the black frame buffer 1
 | |
| 
 | |
| uint8_t* framePtr = NULL;               // Pointer for the black frame buffer
 | |
| 
 | |
| #include "EPD_Support.h"                // Include sketch EPD support functions last!
 | |
| 
 | |
| int8_t limit = 5;                      // Limit the number of loops before halting
 | |
| //------------------------------------------------------------------------------------
 | |
| // Setup
 | |
| //------------------------------------------------------------------------------------
 | |
| void setup() {
 | |
| 
 | |
|   Serial.begin(250000); // Used for messages
 | |
| 
 | |
|   // Initialise the ePaper library
 | |
|   if (ePaper.Init(INIT_LUT) != 0) {
 | |
|     Serial.print("ePaper init failed");
 | |
|     while (1) yield(); // Wait here until re-boot
 | |
|   }
 | |
|   
 | |
|   Serial.println("\r\n ePaper initialisation OK");
 | |
| 
 | |
|   // Initialise the SPIFFS filing system
 | |
|   if (!SPIFFS.begin()) {
 | |
|     Serial.println("SPIFFS initialisation failed!");
 | |
|     while (1) yield(); // Stay here twiddling thumbs
 | |
|   }
 | |
| 
 | |
|   Serial.println(" SPIFFS initialisation OK");
 | |
| 
 | |
|   frame.setColorDepth(1); // Must set the bits per pixel to 1 for ePaper displays
 | |
|                           // Set bit depth BEFORE creating Sprite, default is 16!
 | |
| 
 | |
|   // Create a frame buffer in RAM of defined size and save the pointer to it
 | |
|   // RAM needed is about (EPD_WIDTH * EPD_HEIGHT)/8 , ~5000 bytes for 200 x 200 pixels
 | |
|   // Note: always create the Sprite before setting the Sprite rotation
 | |
|   framePtr = (uint8_t*) frame.createSprite(EPD_WIDTH, EPD_HEIGHT);
 | |
| 
 | |
|   Serial.println("\r\nInitialisation done.");
 | |
| 
 | |
|   listFiles();  // List all the files in the SPIFFS
 | |
| }
 | |
| 
 | |
| //------------------------------------------------------------------------------------
 | |
| // Loop
 | |
| //------------------------------------------------------------------------------------
 | |
| void loop() {
 | |
| 
 | |
|   frame.setRotation(random(4)); // Set the rotation to 0, 1, 2 or 3 ( 1 & 3 = landscape)
 | |
| 
 | |
|   frame.fillSprite(PAPER);
 | |
| 
 | |
|   // Draw 8 bit grey-scale bitmap using Floyd-Steinberg dithering at x,y
 | |
|   //           /File name      x  y
 | |
|   //drawFSBmp("/TestCard.bmp", 0, 0); // 176 x 264 pixels
 | |
| 
 | |
|   drawFSBmp("/Tiger.bmp", (frame.width()-176)/2, (frame.height()-234)/2); // 176 x 234 pixels
 | |
| 
 | |
|   updateDisplay();  // Send image to display and refresh
 | |
| 
 | |
|   delay(5000);
 | |
| 
 | |
|   frame.fillSprite(PAPER);  // Fill frame with white
 | |
| 
 | |
|   // Draw circle in frame buffer (x, y, r, color) in center of screen
 | |
|   frame.drawCircle(frame.width()/2, frame.height()/2, frame.width()/6, INK);
 | |
| 
 | |
|   // Draw diagonal lines
 | |
|   frame.drawLine(0 ,                0, frame.width()-1, frame.height()-1, INK);
 | |
|   frame.drawLine(0 , frame.height()-1, frame.width()-1,                0, INK);
 | |
| 
 | |
|   updateDisplay();  // Send image to display and refresh
 | |
| 
 | |
|   delay(3000);
 | |
| 
 | |
|   // Run a rotation test
 | |
|   rotateTest();
 | |
| 
 | |
|   // Put screen to sleep to save power (if wanted)
 | |
|   ePaper.Sleep();
 | |
| 
 | |
|   if (--limit <= 0) while(1) yield(); // Wait here
 | |
| 
 | |
|   delay(20000); // Wait here for 20s
 | |
| 
 | |
|   // Wake up ePaper display so we can talk to it
 | |
|   Serial.println("Waking up!");
 | |
|   ePaper.Init(INIT_LUT);
 | |
| 
 | |
| } // end of loop()
 | |
| 
 | |
| 
 | |
| //------------------------------------------------------------------------------------
 | |
| // setRotation() actually rotates the drawing coordinates, not the whole display frame
 | |
| // buffer so we can use this to draw text at right angles or upside down
 | |
| //------------------------------------------------------------------------------------
 | |
| void rotateTest(void)
 | |
| {
 | |
|   //frame.fillSprite(PAPER);             // Fill buffer with white to clear old graphics
 | |
| 
 | |
|   // Draw some text in frame buffer
 | |
|   frame.setTextFont(4);                  // Select font 4
 | |
|   frame.setTextColor(INK);               // Set colour to ink
 | |
|   frame.setTextDatum(TC_DATUM);          // Middle centre text datum
 | |
| 
 | |
|   frame.setRotation(0);                  // Set the display rotation to 0, 1, 2 or 3 ( 1 & 3 = landscape)
 | |
|   epd_width  = frame.width();            // Get the values for the current rotation
 | |
|   epd_height = frame.height();           // epd_height is not used in this sketch
 | |
| 
 | |
|   frame.drawString("Rotation 0",   epd_width / 2, 10);
 | |
| 
 | |
|   frame.setRotation(1);                  // Set the display rotation to 1
 | |
|   epd_width  = frame.width();            // Get the values for the current rotation
 | |
|   epd_height = frame.height();           // epd_height is not used in this sketch
 | |
| 
 | |
|   frame.drawString("Rotation 1",   epd_width / 2, 10);
 | |
| 
 | |
|   frame.setRotation(2);                  // Set the display rotation to 2
 | |
|   epd_width  = frame.width();            // Get the values for the current rotation
 | |
|   epd_height = frame.height();           // epd_height is not used in this sketch
 | |
| 
 | |
|   frame.drawString("Rotation 2",   epd_width / 2, 10);
 | |
| 
 | |
|   frame.setRotation(3);                  // Set the display rotation to 3
 | |
|   epd_width  = frame.width();            // Get the values for the current rotation
 | |
|   epd_height = frame.height();           // epd_height is not used in this sketch
 | |
| 
 | |
|   frame.drawString("Rotation 3",   epd_width / 2, 10);
 | |
| 
 | |
|   Serial.println("Updating display");
 | |
|   updateDisplay();  // Update display
 | |
| }
 |