將溫溼度的數值以中文顯示在「OLED」,範例檔:「4.OLED_Temp.ino」。

下載u8g2函式庫,並解壓縮「U8g2-2.27.6」資料夾到Arduino主目錄的「libraries」資料夾中。

Untitled

接線圖

Untitled.png

Untitled

程式碼

#include "Wire.h"  //i2c 21或22接腳
#include "U8g2lib.h" //請下載u8g2程式庫
#include <SimpleDHT.h>

//OLED 螢幕解析度為128*64
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

int pinDHT11 = 4;
SimpleDHT11 dht11(pinDHT11);

void setup()
{
  u8g2.begin();//初始化
  u8g2.enableUTF8Print();//啟用 UTF8字集
  u8g2.setFont(u8g2_font_unifont_t_chinese1);//設定使用中文字形
  u8g2.setDrawColor(1);//設定顏色,我們是單色只有1
  u8g2.setFontPosTop();//座標從上開始
  u8g2.setFontDirection(0);//0不旋轉、1->90、2->180、3->270

  Serial.begin(115200);
}
//long i = 0;  //用來顯示目前更新的次數
void loop()
{
  // read without samples.
  byte temperature = 0; //宣告為byte,範圍為0-255
  byte humidity = 0;
  int err = SimpleDHTErrSuccess;

  if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    Serial.print("Read DHT11 failed, err="); Serial.print(SimpleDHTErrCode(err));
    Serial.print(","); Serial.println(SimpleDHTErrDuration(err)); delay(1000);
    return;
  }

  //i = i + 1;
  u8g2.clear();//顯示前清除螢幕
  u8g2.setCursor(0, 20);//移動游標
  u8g2.print(String("溫度:").c_str());   //寫入文字
  u8g2.print(String((int)temperature).c_str()); //c_str將String字串轉為OLED可以使用的character字元
  u8g2.print(String("C").c_str());

  u8g2.setCursor(0, 40);//移動游標
  /*這一段是用來顯示更新的次數
    u8g2.print(String("目前數字:").c_str());//寫入文字
    u8g2.print(String(i).c_str());//寫入文字
  */

  u8g2.print(String("溼度:").c_str());   //寫入文字
  u8g2.print(String((int)humidity).c_str()); //c_str將String字串轉為OLED可以使用的character字元
  u8g2.print(String("%").c_str());

  u8g2.drawLine(0, 11, 90, 11);//劃線從0,11->90,60
  u8g2.drawLine(0, 60, 90, 60);//劃線從0,60->90,60

  u8g2.sendBuffer();//送到螢幕顯示

  Serial.print("溫度:"); Serial.print((int)temperature); Serial.print("C,"); //(int)強制轉型為int整數
  Serial.print("溼度:"); Serial.print((int)humidity); Serial.println("%。"); //(int)強制轉型為int整數
  Serial.println("==========================");

  delay(1000);
}

範例結果

Untitled

下一節