2019年4月30日 星期二

ESP32+Oled 1306

OLED是相當實用的顯示模組,這次用的是 SSD1306 128X64。要使用 OLED 要先下載相關的函數庫,解壓縮後,並放到 arduino/libraries 資料夾下。函數庫的連結如下:

1. Adafruit SSD 1306 OLED Driver Library
2. Adafruit GFX Library

下載後,可以用 SSD1306 函數庫提供的範例 Adafruit SSD1306下的ssd1306_128x64_i2c做測試:

如果使用的OLED是 128x64,要去修改 Arduino下 ibraries 資料夾中 Adafruit_SSD1306-master 裡的 Adafruit_SSD1306.h ,建議用 Notepad開啟。
Adafruit_SSD1306.h裡面要修改的地方有兩個:
1. 把55行定義的位址 #define SSD1306_I2C_ADDRESS   0x3D 改成 0x3C
2. 再到 73、74行,因為用的OLED是 128x64,所以在 #define SSD1306_128_32 前面加上
     //。並刪除 #define SSD1306_128_64 前面的 //

修改後,記得存檔。


使用Adafruit_SSD1306 OLED提供的範例進行測試,選擇 檔案 / 範例 / Adafruit_SSD1306/ssd1306_128x64_i2c

程式中要記得修改的 display.begin(SSD1306_SWITCHCAPVCC, 0x3D);中的位址為0x3C。



接線的部分,參考網路上提供的接法:

「esp32 oled」的圖片搜尋結果(註1)
執行後的結果,如下影片,這是函數庫中提供的範例:


接下來從範例中修改,在OLED上顯示不同文字大小的文字:
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>                              //掛載 OLED 函數庫
#include <Adafruit_SSD1306.h>                       //掛載 OLED 繪圖及圖形函數庫
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);    //宣告一個OLED物件為display
#define LOGO16_GLCD_HEIGHT 16
#define LOGO16_GLCD_WIDTH  16
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
void setup()   {             
  display.begin(SSD1306_SWITCHCAPVCC, 0x3c);  // initialize with the I2C addr 0x3c (for the
                                                                                          128x64)
  // Clear the buffer.
  display.clearDisplay();
  delay(2000);
}
void loop() {
  display.setTextColor(WHITE);                           //設定顯示文字的顏色
  display.setTextSize(1);                                        //設定第1行文字的大小為1
  display.setCursor(0,0);                                        //設定第1行文字在oled上顯示的座標
  display.println("Hello, world!");                         //設定第1行顯示的文字

  display.setTextSize(2);                                        //設定第2行文字的大小為2
  display.setCursor(0,15);                                      //設定第2行文字在oled上顯示的座標
  display.println("First");                                       //設定第2行顯示的文字

  display.setTextSize(3);                                        //設定第3行文字的大小為3
  display.setCursor(0,40);                                      //設定第3行文字在oled上顯示的座標
  display.println("Second");                                  //設定第3行顯示的文字

  display.display();                                                 //顯示資料緩衝區內的資料
  delay(2000);
  display.clearDisplay();                                        //清除資料緩衝區內的資料
}

顯示結果:



使用 Adafruit_SSD1306 OLED函數庫的話,是不用設定 SDA及SCL接腳,預設就是使用ESP32上的GPIO21(SDA)及GPIO22(SCL);但是換句話說,也就是不能自行設定在其他接腳,這在需要使用多個 I2C 模組的電路,應該會很不方便。在 Google 查詢許多方法,終於找到是修改。

在 C:\Program Files (x86)\Arduino\libraries\Adafruit_SSD1306-master 的路徑下,開啟Adafruit_SSD1306.ccp 檔案。

將第206行的指令敘述 Wire.begin();修改為 Wire.begin(SDA,SCL),參數就是 SDA及SCL的接腳,就可以改用 ESP32 的其他接腳來連結 I2C 的模組。

除了使用 Adafruit_SSD1306函數庫外,還可以使用能和 ESP8266 通用的OLED SSD1306函數庫定。下載的網址   esp8266-oled-ssd1306,這個函數庫的好處,是在宣告 Oled的 SSD1306物件時,直接就告知 I2C 的 SDA及SCL接腳。
           SSD1306  display( Oled模組的位址SDA接腳SCL接腳 );



註:
   1.電路圖參考網址:ESP32 Arduino OLED SSD1306 Schematic I2C


2019年4月22日 星期一

ESP32初體驗

最近科裡老師上專題製作課程,買了幾顆ESP32,之前曾使用過ESP8266,得知32比起8266功能多出了很多IO接腳,也含有藍芽(BLE)的功能,所以要了一顆來玩。
(註1)

要能使電腦能和 ESP32聯繫上,必須先安裝驅動程式,要到 SILICON LABS 的網站去下載

CP210x USB to UART Bridge VCP Drivers ,解壓縮安裝完後,在裝置管理員裡的連接埠就會多出一項,Silicon Labs CP210x USB to UART Bridge,後面的 COM4是隨著使用者的電腦而有所不同,這個COM4在 Arduino IDE設定上也很重要。


接著要在 Arduino IDE上,安裝ESP32,首先在 Arduino IDE的選擇 檔案 / 偏好設定。(註2)

在視窗的額外的開發版管理員網址上輸入:https://dl.espressif.com/dl/package_esp32_index.json, http://arduino.esp8266.com/stable/package_esp8266com_index.json,再按下確定的按鈕。

然後在 工具 / 開發板 下的功能表中選擇 開發板管理員。
在開發板管理員上方的過濾尋找欄位內輸入 ESP32,就會找到 ESP32 for Arduino函數庫,按下安裝的按鈕,只要經過幾分鐘就可以安裝好。


安裝好後,就是要進行測試,是否能在Arduino IDE上開發ESP32。
一樣最簡單的測試方式,就是LED的閃爍測試;如同Arduino UNO上有一顆接在第13腳的LED,而 ESP32上也有一顆藍色LED,可以用來做基本的輸出測試。試了第13腳,結果不對,查了網路資料,終於找到是接到GPIO2腳。

#define LED_BUILTIN 2
void setup() {
   pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);                     
  digitalWrite(LED_BUILTIN, LOW); 
  delay(1000);                     
}


在編譯完後,上傳時,在訊息視窗會出現 Connecting......,這個時候要按下扳子上的 BOOT按鈕,等到出現Writing at 0x00010000...(12%),就可以放開 BOOT按鈕。接著就完成上傳程式的部分。


顯示結果:




註:
1. 圖片取自:https://circuits4you.com/wp-content/uploads/2018/12/ESP32-Pinout.jpg。
2. 安裝ESP32到Arduino IDE的相關步驟,請參考:

   Installing the ESP32 Board in Arduino IDE (Windows instructions)