本實驗會用到 0.96 單色 OLED,相關訊息請參考
家豪教學網 OLED
範例二會用到 NTP server,相關訊息請參考
家豪教學網 NTP server
本實驗會用到 I
2
C 介面,因此有關 I
2
C 介面尋找位址,請參考之前 lcd 實習。
範例一
oled 基本顯示英文字母
電路圖
程式碼
#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define CREEN_WIDTH 128 //設定OLED螢幕的寬度像素 #define CREEN_HEIGHT 64 //設定OLED螢幕的寬度像素 //OLED顯示器使用2C連線並宣告名為display物件 Adafruit_SSD1306 display(CREEN_WIDTH, CREEN_HEIGHT, &Wire, OLED_RESET); bool OLEDStatus = true; void setup() { Serial.begin(115200); //設定位址為 0x3c (可以先測試位址確定 0x3c) if(!display.begin(SSD1306_SWITCHCAPVCC,0x3c)) { //F(字串):將字串儲存在fash並非在RAM Serial.println(F("SSD1306 allocation falled")); //若沒有電腦序列埠監控視窗,可用 led 顯示 } else { //如果開啟成功則顯示文字 display.clearDisplay(); //清除緩衝區資料 display.setTextSize(2); //設定文字尺寸為 1,1:6x8,2:12x16,3:18x24...etc display.setCursor(0, 0); //設定起始點位置(0,0) display.setTextColor(WHITE,BLACK); //白字黑底 display.println("Hi~ hcvs") ; //將"Hello"存入RAM display.setCursor(0,18); //設定起始點位置(0,18),上面高為 16 display.setTextSize(1); //設定文字尺寸為 1 display.println("This is a small text."); //將"Hello"存入RAM display.setTextSize(3); //設定文字尺寸為3 display.setCursor(0,30); //設定起始點位置(0,30),上面高為 18+8=26 display.println("Large"); //將"Hello"存入RAM display.display(); //顯示所設定文字 } } void loop() { }
執行結果
範例二
使用 u8g2 寫入中文
電路圖同上
程式碼
#include <Arduino.h> #include <U8g2lib.h> #include <SPI.h> #include <Wire.h> U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); void setup(void) { u8g2.begin(); } void loop(void) { u8g2.firstPage(); u8g2.enableUTF8Print(); //啟用UTF8文字的功能 do { u8g2.setFont(u8g2_font_unifont_t_chinese1); //使用我們做好的字型 u8g2.setCursor(0, 14);//使用左下角定位 u8g2.print("海青資訊科"); u8g2.setCursor(0, 38); u8g2.print("資訊科 103/12/06"); u8g2.setCursor(0, 63); u8g2.print("漆慶福 03:12:25"); } while (u8g2.nextPage() ); delay(1000); }
執行結果
範例三
使用 點陣式寫入中文
電路圖同上
程式碼
#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <WiFi.h> #include "time.h" #define CREEN_WIDTH 128 //設定OLED螢幕的寬度像素 #define CREEN_HEIGHT 64 //設定OLED螢幕的寬度像素 #define OLED_RESET -1 //Reset pin如果OLED上沒有RESET腳位,將它設置為-1 //OLED顯示器使用2C連線並宣告名為display物件 Adafruit_SSD1306 display(CREEN_WIDTH, CREEN_HEIGHT, &Wire, OLED_RESET); const char* ssid = "你的wifi名稱"; //連線名稱 const char* password ="你的 wifi 密碼"; //連線密碼 const char* ntpServer = "pool.ntp.org"; //NTP Server網址 const long gmtOffset_sec =28800; //台灣為GMT8小时·8hrs=28800sec const int daylightOffset_sec= 0; //日光節時間為0 static const unsigned char PROGMEM hcvs[4][32]= {{//海 0X00,0X00,0X42,0X00,0X26,0X00,0X17,0XFE,0X0C,0X00,0X8B,0XF8,0X62,0XC8,0X14,0X28, 0X1F,0XFE,0X05,0X08,0X28,0XC8,0X28,0X28,0X4F,0XFE,0X40,0X08,0X80,0XF0,0X00,0X00 },{//青 0X00,0X00,0X00,0X80,0X1F,0XFC,0X00,0X80,0X1F,0XFC,0X00,0X80,0X3F,0XFE,0X00,0X00, 0X0F,0XF8,0X08,0X08,0X0F,0XF8,0X08,0X08,0X1F,0XF8,0X10,0X08,0X20,0X38,0X00,0X00 },{//工 0X00,0X00,0X3F,0XFC,0X00,0X80,0X00,0X80,0X00,0X80,0X00,0X80,0X00,0X80,0X00,0X80, 0X00,0X80,0X00,0X80,0X00,0X80,0X00,0X80,0X00,0X80,0X7F,0XFE,0X00,0X00,0X00,0X00 },{//商 0X01,0X80,0X7F,0XFE,0X04,0X20,0X04,0X20,0X3F,0XFC,0X22,0X44,0X22,0X44,0X24,0X74, 0X38,0X04,0X27,0XE4,0X24,0X24,0X24,0X24,0X27,0XE4,0X20,0X04,0X20,0X1C,0X00,0X00 }}; void setup() { Serial.begin(19200); if(!display.begin(SSD1306_SWITCHCAPVCC,0x3c)) { //設定 oled 位址 Serial.println(F("SSD1306 allocation falled")); //F(字串):將字串儲存在fash並非在RAM for(;;); //開啟 OLED 失敗,則無窮迴圈 } Serial.printf("Connecting to %s ", ssid); //顯示連線AP SSID WiFi.begin(ssid, password); //建立WiFi連線 while (WiFi.status() != WL_CONNECTED) { //當狀態不是已連線 Serial.print("."); //印出一個"." } Serial.println("\nWiFi connected."); //初始化並取回時間 configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); //設定NTP參數 } void loop() { struct tm timeinfo; //建立一個時間結構,為timeinfo if(!getLocalTime(&timeinfo)){ //取回NTP時間 Serial.println("NTP Server open Failed.");//連接 ntp server 若失敗,顯示失敗訊息" return; } Serial.println(&timeinfo,"%A, %B %d %Y %H:%M:%S"); //顯示"星期,月日年,時:分:秒 display.clearDisplay(); //清除緩衝區資料 display.setTextColor(WHITE, BLACK); //設定白字黑底 for(int i=0;i<4;i++){ display.drawBitmap(i*18+30,0,hcvs[i],16,16,WHITE); //顯示海青工商 4 字,左上角定位 } display.setTextSize(2); //設定字型大小為2 display.setCursor(4,18); //設定文字起始位置為(4,0) display.println(&timeinfo, "%F"); //設定文字内容為年月日,格式為"西元年-月-日" display.setCursor(10,34); //設定文字起始位置為(10,16) display.println(&timeinfo, "%A"); //顯示星期 display.setCursor(16,50); //設定文字起始位置為(16,48) display.println(&timeinfo, "%T"); //設定文字內容為年月日,格式為"時:分:秒" display.display(); //顯示所設定的文字 delay(1000); }
執行結果
你的瀏覽器不支援 video 標籤.