ผู้เขียน หัวข้อ: งานครั้งที่ 20 การใช้งานจอ OLED i2c ที่ใช้ชิพ SH1106  (อ่าน 7188 ครั้ง)

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์
การใช้งานจอ OLED i2c ที่ใช้ชิพ SH1106

การติดตั้งไลบารี่  .จากการทดลองในงานครั้งที่ 9 เป็นการใช้จอ OLED i2c ที่ใช้ชิพ SS1306 ซึ่งสามารถใช้งานไลบรารี่ของ Adafruit ได้ แต่ถ้าใช้งานจอที่ใช้ชิพ SH1106 ณ ปัจจุบัน (2017) ไลบรารี่ของ Adafruit  ยังไม่รองรับ ESP8266 ดังนั้นจึงต้องใช้ไลบรารี่ของตัวอื่นแทน การดำเนินการมีขั้นตอนดังนี้

1. ดาวน์โหลดไฟล์ zip จากเวปไซด์  https://github.com/squix78/esp8266-oled-ssd1306


2. ทำการเพิ่มไลบรารี่ลงในโปรแกรม Arduino IDE โดยการเพิ่มจากไฟล์ zip แล้วทำการหาไฟล์ zip ที่ได้จากการดาวน์โหลดในข้อ 1


ฟังก์ชั่นใช้งาน
SH1106 object(0x3c, SDA, SCL);//ประกาศใช้งานไลบรารี่ในชื่อออปเจคที่ต้องการ
.init();// Initialize the display
.end();// Free the memory used by the display
.resetDisplay(void);// Cycle through the initialization
.reconnect(void);// Connect again to the display through I2C
.displayOn(void);// Turn the display on
.displayOff(void);// Turn the display offs
.clear(void);// Clear the local pixel buffer
.display(void);// Write the buffer to the display memory
.invertDisplay(void);// Inverted display mode
.normalDisplay(void);// Normal display mode
.setContrast(char contrast);// Set display contrast
.flipScreenVertically();// Turn the display upside down
.setColor();// Sets the color of all pixel operations
.setPixel(x,y);// Draw a pixel at given position
.drawLine(x0,y0,x1,y1);// Draw a line from position 0 to position 1
.drawRect(x,y,width,height);// Draw the border of a rectangle at the given location
.fillRect(x,y,width,height);// Fill the rectangle
.drawCircle(x,y,radius);// Draw the border of a circle
.fillCircle(x,y,radius);// Fill circle
.drawHorizontalLine(x,y,length);// Draw a line horizontally
.drawVerticalLine(x,y,length);// Draw a lin vertically
.drawProgressBar(x,y,width,height,progress);// Draws a rounded progress bar
.drawFastImage(x,y,width,height,image);// Draw a bitmap in the internal image format
.drawXbm(x,y,width,height,xbm);// Draw a XBM
.drawString(x,y,text);
.drawStringMaxWidth(x,y,maxLineWidth,text);
.getStringWidth(text,length);
.getStringWidth(text);
.setTextAlignment(textAlignment);
.setFont(const char* fontData)// Sets the current font

โจทย์โปรแกรม
-เขียนโปรแกรมแสดงผลจากเซนเซอร์ต่างต่างด้วยจอ OLED i2c SH1106
-โปรแกรมรายละเอียดพิเศษรายกลุ่ม (แจ้งให้ทราบเมื่อถึงชั่วโมงเรียน)

วงจรที่ใช้ทดลอง
กรณีใช้บอร์ดรุ่น NodeMCU

กรณีใช้บอร์ดรุ่น WeMos D1 mini


ตัวอย่างโปรแกรม
โค๊ด: [Select]
#include <Wire.h>
#include <SH1106.h>
int counter = 1;
SH1106 display(0x3c, SDA, SCL);
void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.println();
  display.init();
  display.flipScreenVertically();
  display.setFont(ArialMT_Plain_10);
}
void drawFontFaceDemo() {
    display.setTextAlignment(TEXT_ALIGN_LEFT);
    display.setFont(ArialMT_Plain_10);
    display.drawString(0, 0, "Hello world");
    display.setFont(ArialMT_Plain_16);
    display.drawString(0, 10, "Hello world");
    display.setFont(ArialMT_Plain_24);
    display.drawString(0, 26, "Hello world");
}
void drawTextFlowDemo() {
    display.setFont(ArialMT_Plain_10);
    display.setTextAlignment(TEXT_ALIGN_LEFT);
    display.drawStringMaxWidth(0, 0, 128,
      "Lorem ipsum\n dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore." );
}

void drawTextAlignmentDemo() {
  display.setFont(ArialMT_Plain_10);
  display.setTextAlignment(TEXT_ALIGN_LEFT);
  display.drawString(0, 10, "Left aligned (0,10)");
  display.setTextAlignment(TEXT_ALIGN_CENTER);
  display.drawString(64, 22, "Center aligned (64,22)");
  display.setTextAlignment(TEXT_ALIGN_RIGHT);
  display.drawString(128, 33, "Right aligned (128,33)");
}
void drawRectDemo() {
    for (int i = 0; i < 10; i++) {
      display.setPixel(i, i);
      display.setPixel(10 - i, i);
    }
    display.drawRect(12, 12, 20, 20);
    display.fillRect(14, 14, 17, 17);// Fill the rectangle
    display.drawHorizontalLine(0, 40, 20);// Draw a line horizontally
    display.drawVerticalLine(40, 0, 20); // Draw a line horizontally
}
void drawCircleDemo() {
  for (int i=1; i < 8; i++) {
    display.setColor(WHITE);
    display.drawCircle(32, 32, i*3);
    if (i % 2 == 0) {
      display.setColor(BLACK);
    }
    display.fillCircle(96, 32, 32 - i* 3);
  }
}
void drawProgressBarDemo() {
  int progress = (counter / 5) % 100;
  display.drawProgressBar(0, 32, 120, 10, progress);
  display.setTextAlignment(TEXT_ALIGN_CENTER);
  display.drawString(64, 15, String(progress) + "%");
  counter++;
}
void loop() {
  display.clear();
  display.setTextAlignment(TEXT_ALIGN_RIGHT);
  display.drawString(10, 128, String(millis()));
  display.display(); delay(1000);
  drawFontFaceDemo();
  display.display(); delay(1000);display.clear();
  drawTextFlowDemo();
  display.display(); delay(1000);display.clear();
  drawTextAlignmentDemo();
  display.display(); delay(1000);display.clear();
  drawRectDemo();
  display.display(); delay(1000);display.clear();
  drawCircleDemo();
  display.display(); delay(1000);display.clear();
  drawProgressBarDemo();
  display.display();delay(1000);display.clear();
}
<a href="https://www.youtube.com/v/7-Bz95iHQL8" target="_blank" class="new_win">https://www.youtube.com/v/7-Bz95iHQL8</a>
« แก้ไขครั้งสุดท้าย: กันยายน 04, 2019, 01:43:06 PM โดย admin »