การใช้งานจอ 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();
}
ความคิดเห็น
แสดงความคิดเห็น