Arduino筆記(63):1.77" TFT LCD顯示INA219電流傳感器電壓值

在拍賣網站無意中知道有一個感測器,標題寫著「INA219 I2C 介面零漂移 雙向電流 電源監控感測器模組感測器」,想瞭解一下,這個監控電源的作法是如何達成的,看一下價格還算便宜,就買一個來實作如何紀錄電流。如果檢測僅用串列埠的視窗來看,有點麻煩,於是找了一個1.77吋的TFT LCD來顯示電流值,順便練習一下,如何使用Adafruit-GFX這個函式庫。


[INA219 電源監控感測器模組]

  • 使用 I2C 介面
  • 工作電壓 +3.0 至 +5.5V 之間
  • 溫度範圍(可實現 1% 的最大誤差精度) -40C 至 +85C
  • 分辨率 12 位元
  • 電壓範圍為 0 V 至 +26 V
  • 以安培為單位讀取電流,並以瓦特為單位讀取電源
  • 對多達 128 個採樣求平均值
INA219 具備業界最高的精確度以及最小型的尺寸,不僅能監控分流電阻器上的壓降,感測分流供電電壓,同時還可計算電源。該器件採用 SOT23 封裝,可為伺服器、筆記型電腦、電源、電池管理以及車載與電信設備的數位電流感測提供小型、低成本解決方案。

[安裝Adafruit_GFX Library]

Adafruit_GFX程式庫提供顯示的文字及圖形顯示所需的功能。
在 Arduino 選單, [Sketch 草稿碼] →下拉選擇 [Include Library 匯入程式庫] → [Manage Libraries 管理程式庫] 。在搜尋的地方輸入 Adafruit_GFX,選擇以下最上方的 Library,按下右方的 [Install],出現 [Installed] 表示安裝完成。

同樣的方法再安裝以下兩個 Library:
  • Adafruit_ST7735
  • Adafruit_INA219

[材料]

  • Arduino Uno x 1
  • 電流傳感器電壓表 INA219 x 1
  • ST7735 1.77" TFT LCD x 1
  • 麵包板 x 1
  • 麵包板電源 x 1
  • 9V 電池(含接線) x 1
  • LED x 1
  • 220歐姆電阻 x 1
  • 連接線 x n條

[接線與電路圖]

Arduino UnoLCD PinINA219
3.3V8 LEDA-
D107 CS-
D9 6 RS-
D85 RES-
D114 SDA-
D133 SCK-
5V2 VCCVCC
GND1 GNDGND
A4(SDA)-SDA
A5(SCL)-SCL




[程式]

程式內有一個 Color565() 的函式,是將紅色R、綠色G及藍色B三原色轉換成十六進位值色碼。
#define TFT_CS 10
#define TFT_DC 9
#define TFT_RST 8
#define TFT_SCLK 13   
#define TFT_MOSI 11   

#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <Adafruit_INA219.h>
#include <Wire.h>
#include <SPI.h>
#include <stdio.h>

Adafruit_INA219 ina219;

#if defined(__SAM3X8E__)
#undef __FlashStringHelper::F(string_literal)
#define F(string_literal) string_literal
#endif

//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);

//Black theme
#define COLOR1 ST7735_WHITE
#define COLOR2 ST7735_BLACK

//White theme
//#define COLOR1 ST7735_BLACK
//#define COLOR2 ST7735_WHITE

int text_color_humidex;
float humidity, temperature, humidex;
String message;

void setup(void)
{
    Serial.begin(9600);
    uint32_t currentFrequency;
    
    Serial.println("Hello!");
      
    // 設備初始化
    Wire.begin();
    ina219.begin();
    Serial.println("Measuring voltage and current with INA219 ...");
    
    tft.initR(INITR_BLACKTAB); // initialize a ST7735S chip, black tab
    tft.fillScreen(COLOR2);
}

void loop()
{
    float shuntvoltage = 0;
    float busvoltage = 0;
    float current_mA = 0;
    float loadvoltage = 0;
    float power_mW = 0;

    shuntvoltage = ina219.getShuntVoltage_mV();
    busvoltage = ina219.getBusVoltage_V();
    current_mA = ina219.getCurrent_mA();
    power_mW = ina219.getPower_mW();
    loadvoltage = busvoltage + (shuntvoltage / 1000);

    Serial.print("Bus Voltage:   "); Serial.print(busvoltage); Serial.println(" V");
    Serial.print("Shunt Voltage: "); Serial.print(shuntvoltage); Serial.println(" mV");
    Serial.print("Load Voltage:  "); Serial.print(loadvoltage); Serial.println(" V");
    Serial.print("Current:       "); Serial.print(current_mA); Serial.println(" mA");
    Serial.print("Power:         "); Serial.print(power_mW); Serial.println(" mW");
    Serial.println("");
  
    // 輸出資料
    tft.setCursor(0,1);
    tft.setTextSize(1);
    tft.setTextColor(COLOR1, COLOR2);        
    tft.println("Bus Voltage:   "); 
    tft.setTextSize(2);
    tft.setTextColor(Color565(200, 0, 0), COLOR2); // 紅色 
    tft.print(busvoltage); tft.println(" V");
        
    tft.setTextSize(1);
    tft.setTextColor(COLOR1, COLOR2);    
    tft.println("");    
    tft.println("Shunt Voltage: "); 
    tft.setTextSize(2);
    tft.setTextColor(Color565(0, 255, 0), COLOR2); // 綠色
    tft.print(shuntvoltage); tft.println(" mV");
        
    tft.setTextSize(1);
    tft.setTextColor(COLOR1, COLOR2);
    tft.println("");
    tft.println("Load Voltage:  "); 
    tft.setTextSize(2);
    tft.setTextColor(Color565(0, 0, 255), COLOR2); // 藍色    
    tft.print(loadvoltage); tft.println(" V");
    
    tft.setTextSize(1);
    tft.setTextColor(COLOR1, COLOR2);
    tft.println("");
    tft.println("Current:       "); 
    tft.setTextSize(2);
    tft.setTextColor(Color565(70, 200, 70), COLOR2); // 暗綠色
    tft.print(current_mA); tft.println(" mA");
        
    tft.setTextSize(1);
    tft.setTextColor(COLOR1, COLOR2);
    tft.println("");
    tft.println("Power:         "); 
    tft.setTextSize(2);
    tft.setTextColor(Color565(255, 56, 76), COLOR2); // 亮紅色
    tft.print(power_mW); tft.println(" mW");
    tft.println("");
    
    delay(2000);
    tft.fillScreen(COLOR2);
}

// Pass 8-bit (each) R,G,B, get back 16-bit packed color
uint16_t Color565(uint8_t r, uint8_t g, uint8_t b)
{
    return ((b & 0xF8) << 8) | ((g & 0xFC) << 3) | (r >> 3);
}

[實作結果]




[參考資料]


Post a Comment

較新的 較舊