Arduino e SSH1106 Display oled 1.3 pollici

Ciao!

in questo post vedremo come interfacciare il display SSH1106 ad Arduino.



Questo display (link eBay) è molto simile al display ssd1306 che ho utilizzato in questo post, ma è leggermente più grande, infatti la parte utile è di 1.3 pollici contro 0.96 del modello ssd

Ho utilizzato la libreria Adafruit di wonho-maker è sufficiente cliccare sul link, estrarla e copiarla nella directory Libraries della cartella dove avete installato Arduino.

A questo punto siete pronti per collegare il display ad Arduino ed iniziare ad utilizzarlo.



Dopo aver effettuato il collegamento, caricate lo sketch di esempio presente nella libreria,
per comodità l'ho riportato qui sotto

  1. /*********************************************************************
  2. This is an example for our Monochrome OLEDs based on SSD1306 drivers
  3.   Pick one up today in the adafruit shop!
  4.   ------> http://www.adafruit.com/category/63_98
  5. This example is for a 128x64 size display using I2C to communicate
  6. 3 pins are required to interface (2 I2C and one reset)
  7. Adafruit invests time and resources providing this open source code,
  8. please support Adafruit and open-source hardware by purchasing
  9. products from Adafruit!
  10. Written by Limor Fried/Ladyada  for Adafruit Industries.  
  11. BSD license, check license.txt for more information
  12. All text above, and the splash screen must be included in any redistribution
  13. *********************************************************************/
  14. /*********************************************************************
  15. I change the adafruit SSD1306 to SH1106
  16. SH1106 driver don't provide several functions such as scroll commands.
  17. *********************************************************************/
  18. #include <SPI.h>
  19. #include <Wire.h>
  20. #include <Adafruit_GFX.h>
  21. #include <Adafruit_SH1106.h>
  22. #define OLED_RESET 4
  23. Adafruit_SH1106 display(OLED_RESET);
  24. #define NUMFLAKES 10
  25. #define XPOS 0
  26. #define YPOS 1
  27. #define DELTAY 2
  28. #define LOGO16_GLCD_HEIGHT 16
  29. #define LOGO16_GLCD_WIDTH  16
  30. static const unsigned char PROGMEM logo16_glcd_bmp[] =
  31. { B00000000, B11000000,
  32.   B00000001, B11000000,
  33.   B00000001, B11000000,
  34.   B00000011, B11100000,
  35.   B11110011, B11100000,
  36.   B11111110, B11111000,
  37.   B01111110, B11111111,
  38.   B00110011, B10011111,
  39.   B00011111, B11111100,
  40.   B00001101, B01110000,
  41.   B00011011, B10100000,
  42.   B00111111, B11100000,
  43.   B00111111, B11110000,
  44.   B01111100, B11110000,
  45.   B01110000, B01110000,
  46.   B00000000, B00110000 };
  47. #if (SH1106_LCDHEIGHT != 64)
  48. #error("Height incorrect, please fix Adafruit_SH1106.h!");
  49. #endif
  50. void setup()   {                
  51.   Serial.begin(9600);
  52.   // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
  53.   display.begin(SH1106_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3D (for the 128x64)
  54.   // init done
  55.   // Show image buffer on the display hardware.
  56.   // Since the buffer is intialized with an Adafruit splashscreen
  57.   // internally, this will display the splashscreen.
  58.   display.display();
  59.   delay(2000);
  60.   // Clear the buffer.
  61.   display.clearDisplay();
  62.   // draw a single pixel
  63.   display.drawPixel(10, 10, WHITE);
  64.   // Show the display buffer on the hardware.
  65.   // NOTE: You _must_ call display after making any drawing commands
  66.   // to make them visible on the display hardware!
  67.   display.display();
  68.   delay(2000);
  69.   display.clearDisplay();
  70.   // draw many lines
  71.   testdrawline();
  72.   display.display();
  73.   delay(2000);
  74.   display.clearDisplay();
  75.   // draw rectangles
  76.   testdrawrect();
  77.   display.display();
  78.   delay(2000);
  79.   display.clearDisplay();
  80.   // draw multiple rectangles
  81.   testfillrect();
  82.   display.display();
  83.   delay(2000);
  84.   display.clearDisplay();
  85.   // draw mulitple circles
  86.   testdrawcircle();
  87.   display.display();
  88.   delay(2000);
  89.   display.clearDisplay();
  90.   // draw a white circle, 10 pixel radius
  91.   display.fillCircle(display.width()/2, display.height()/2, 10, WHITE);
  92.   display.display();
  93.   delay(2000);
  94.   display.clearDisplay();
  95.   testdrawroundrect();
  96.   delay(2000);
  97.   display.clearDisplay();
  98.   testfillroundrect();
  99.   delay(2000);
  100.   display.clearDisplay();
  101.   testdrawtriangle();
  102.   delay(2000);
  103.   display.clearDisplay();
  104.    
  105.   testfilltriangle();
  106.   delay(2000);
  107.   display.clearDisplay();
  108.   // draw the first ~12 characters in the font
  109.   testdrawchar();
  110.   display.display();
  111.   delay(2000);
  112.   display.clearDisplay();
  113.   // draw scrolling text
  114.  /* testscrolltext();
  115.   delay(2000);
  116.   display.clearDisplay();*/
  117.   // text display tests
  118.   display.setTextSize(1);
  119.   display.setTextColor(WHITE);
  120.   display.setCursor(0,0);
  121.   display.println("Hello, world!");
  122.   display.setTextColor(BLACK, WHITE); // 'inverted' text
  123.   display.println(3.141592);
  124.   display.setTextSize(2);
  125.   display.setTextColor(WHITE);
  126.   display.print("0x"); display.println(0xDEADBEEF, HEX);
  127.   display.display();
  128.   delay(2000);
  129.   // miniature bitmap display
  130.   display.clearDisplay();
  131.   display.drawBitmap(30, 16,  logo16_glcd_bmp, 16, 16, 1);
  132.   display.display();
  133.   // invert the display
  134.   display.invertDisplay(true);
  135.   delay(1000);
  136.   display.invertDisplay(false);
  137.   delay(1000);
  138.   // draw a bitmap icon and 'animate' movement
  139.   testdrawbitmap(logo16_glcd_bmp, LOGO16_GLCD_HEIGHT, LOGO16_GLCD_WIDTH);
  140. }
  141. void loop() {
  142. }
  143. void testdrawbitmap(const uint8_t *bitmap, uint8_t w, uint8_t h) {
  144.   uint8_t icons[NUMFLAKES][3];
  145.   // initialize
  146.   for (uint8_t f=0; f< NUMFLAKES; f++) {
  147.     icons[f][XPOS] = random(display.width());
  148.     icons[f][YPOS] = 0;
  149.     icons[f][DELTAY] = random(5) + 1;
  150.    
  151.     Serial.print("x: ");
  152.     Serial.print(icons[f][XPOS], DEC);
  153.     Serial.print(" y: ");
  154.     Serial.print(icons[f][YPOS], DEC);
  155.     Serial.print(" dy: ");
  156.     Serial.println(icons[f][DELTAY], DEC);
  157.   }
  158.   while (1) {
  159.     // draw each icon
  160.     for (uint8_t f=0; f< NUMFLAKES; f++) {
  161.       display.drawBitmap(icons[f][XPOS], icons[f][YPOS], logo16_glcd_bmp, w, h, WHITE);
  162.     }
  163.     display.display();
  164.     delay(200);
  165.    
  166.     // then erase it + move it
  167.     for (uint8_t f=0; f< NUMFLAKES; f++) {
  168.       display.drawBitmap(icons[f][XPOS], icons[f][YPOS],  logo16_glcd_bmp, w, h, BLACK);
  169.       // move it
  170.       icons[f][YPOS] += icons[f][DELTAY];
  171.       // if its gone, reinit
  172.       if (icons[f][YPOS] > display.height()) {
  173.     icons[f][XPOS] = random(display.width());
  174.     icons[f][YPOS] = 0;
  175.     icons[f][DELTAY] = random(5) + 1;
  176.       }
  177.     }
  178.    }
  179. }
  180. void testdrawchar(void) {
  181.   display.setTextSize(1);
  182.   display.setTextColor(WHITE);
  183.   display.setCursor(0,0);
  184.   for (uint8_t i=0; i < 168; i++) {
  185.     if (== '\n') continue;
  186.     display.write(i);
  187.     if ((> 0) && (% 21 == 0))
  188.       display.println();
  189.   }    
  190.   display.display();
  191. }
  192. void testdrawcircle(void) {
  193.   for (int16_t i=0; i<display.height(); i+=2) {
  194.     display.drawCircle(display.width()/2, display.height()/2, i, WHITE);
  195.     display.display();
  196.   }
  197. }
  198. void testfillrect(void) {
  199.   uint8_t color = 1;
  200.   for (int16_t i=0; i<display.height()/2; i+=3) {
  201.     // alternate colors
  202.     display.fillRect(i, i, display.width()-i*2, display.height()-i*2, color%2);
  203.     display.display();
  204.     color++;
  205.   }
  206. }
  207. void testdrawtriangle(void) {
  208.   for (int16_t i=0; i<min(display.width(),display.height())/2; i+=5) {
  209.     display.drawTriangle(display.width()/2, display.height()/2-i,
  210.                      display.width()/2-i, display.height()/2+i,
  211.                      display.width()/2+i, display.height()/2+i, WHITE);
  212.     display.display();
  213.   }
  214. }
  215. void testfilltriangle(void) {
  216.   uint8_t color = WHITE;
  217.   for (int16_t i=min(display.width(),display.height())/2; i>0; i-=5) {
  218.     display.fillTriangle(display.width()/2, display.height()/2-i,
  219.                      display.width()/2-i, display.height()/2+i,
  220.                      display.width()/2+i, display.height()/2+i, WHITE);
  221.     if (color == WHITE) color = BLACK;
  222.     else color = WHITE;
  223.     display.display();
  224.   }
  225. }
  226. void testdrawroundrect(void) {
  227.   for (int16_t i=0; i<display.height()/2-2; i+=2) {
  228.     display.drawRoundRect(i, i, display.width()-2*i, display.height()-2*i, display.height()/4, WHITE);
  229.     display.display();
  230.   }
  231. }
  232. void testfillroundrect(void) {
  233.   uint8_t color = WHITE;
  234.   for (int16_t i=0; i<display.height()/2-2; i+=2) {
  235.     display.fillRoundRect(i, i, display.width()-2*i, display.height()-2*i, display.height()/4, color);
  236.     if (color == WHITE) color = BLACK;
  237.     else color = WHITE;
  238.     display.display();
  239.   }
  240. }
  241.    
  242. void testdrawrect(void) {
  243.   for (int16_t i=0; i<display.height()/2; i+=2) {
  244.     display.drawRect(i, i, display.width()-2*i, display.height()-2*i, WHITE);
  245.     display.display();
  246.   }
  247. }
  248. void testdrawline() {  
  249.   for (int16_t i=0; i<display.width(); i+=4) {
  250.     display.drawLine(0, 0, i, display.height()-1, WHITE);
  251.     display.display();
  252.   }
  253.   for (int16_t i=0; i<display.height(); i+=4) {
  254.     display.drawLine(0, 0, display.width()-1, i, WHITE);
  255.     display.display();
  256.   }
  257.   delay(250);
  258.   display.clearDisplay();
  259.   for (int16_t i=0; i<display.width(); i+=4) {
  260.     display.drawLine(0, display.height()-1, i, 0, WHITE);
  261.     display.display();
  262.   }
  263.   for (int16_t i=display.height()-1; i>=0; i-=4) {
  264.     display.drawLine(0, display.height()-1, display.width()-1, i, WHITE);
  265.     display.display();
  266.   }
  267.   delay(250);
  268.   display.clearDisplay();
  269.   for (int16_t i=display.width()-1; i>=0; i-=4) {
  270.     display.drawLine(display.width()-1, display.height()-1, i, 0, WHITE);
  271.     display.display();
  272.   }
  273.   for (int16_t i=display.height()-1; i>=0; i-=4) {
  274.     display.drawLine(display.width()-1, display.height()-1, 0, i, WHITE);
  275.     display.display();
  276.   }
  277.   delay(250);
  278.   display.clearDisplay();
  279.   for (int16_t i=0; i<display.height(); i+=4) {
  280.     display.drawLine(display.width()-1, 0, 0, i, WHITE);
  281.     display.display();
  282.   }
  283.   for (int16_t i=0; i<display.width(); i+=4) {
  284.     display.drawLine(display.width()-1, 0, i, display.height()-1, WHITE);
  285.     display.display();
  286.   }
  287.   delay(250);
  288. }
  289. /*void testscrolltext(void) {
  290.   display.setTextSize(2);
  291.   display.setTextColor(WHITE);
  292.   display.setCursor(10,0);
  293.   display.clearDisplay();
  294.   display.println("scroll");
  295.   display.display();
  296.   display.startscrollright(0x00, 0x0F);
  297.   delay(2000);
  298.   display.stopscroll();
  299.   delay(1000);
  300.   display.startscrollleft(0x00, 0x0F);
  301.   delay(2000);
  302.   display.stopscroll();
  303.   delay(1000);    
  304.   display.startscrolldiagright(0x00, 0x07);
  305.   delay(2000);
  306.   display.startscrolldiagleft(0x00, 0x07);
  307.   delay(2000);
  308.   display.stopscroll();
  309. }*/


Questo è tutto,
per qualsiasi domanda lascia pure un commento.

Seguimi sulle mie pagine per rimanere sempre aggiornato sui nuovi post!

Nessun commento:

Posta un commento

Lascia un commento qui sotto, ti risponderò il prima possibile!

Altri Post