ArduinoとカラーOLEDでグラフを表示する

ArduinoでAnalogReadしたデータをグラフ化して表示してみました。

使用するもの

Arduino - ELEGOO Arduino用 Nanoボード V3.0 CH340/ATmega328P、Nano V3.0互換 
OLEDディスプレイ - HiLetgo 0.96" SPI シリアル 128×64 OLED LCDディスプレイSSD1306液晶 
ジャンプワイヤ - HiLetgo® 5個セット 5*40PCS デュポン ワイヤー ジャンパー
ブレッドボード - HiLetgo® 5個セット 400穴 ミニブレッドボード 実験用ボード 8.5*5.5 CM

前準備

接続方法や必要なライブラリなどは以下の記事に記載しています。

プログラム

A0の入力を画面上にグラフで表示します。

入力された値の範囲によってグラフの幅を自動的に調整します。

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1331.h>
#include <SPI.h>

#define sclk 13
#define mosi 11
#define cs   10
#define rst  9
#define dc   8

#define	BLACK           0x0000
#define	GREEN           0x07E0
#define WHITE           0xFFFF

Adafruit_SSD1331 display = Adafruit_SSD1331(&SPI, cs, dc, rst);

int buf[70]; // データ保持用

void setup(void) {
  display.begin();
  display.fillScreen(BLACK);

  // 初期値の設定
  for(int i = 0;i < 70;i++){
    buf[i] = -999;
  }
  display.drawRect(25, 9, 71, 50, WHITE);
  display.setTextSize(1);
  display.setTextColor(WHITE,BLACK);
  display.setCursor(0,0);
  display.print("AnalogRead");
}

// 0詰め
String strPad(int num,int zeroCount){
  char tmp[256];
  char param[5] = {'%','0',(char)(zeroCount+48),'d','\0'};
  sprintf(tmp,param,num);
  return tmp;
}

void loop() {
  // 96x64
  // グラフの初期化
  display.drawRect(25, 9, 71, 51, WHITE);
  display.fillRect(26, 10, 69, 49, BLACK);
  
  // 最小値と最大値を検索
  int max = 0;
  int min = 1023;
  for(int i = 0;i < 69;i++){
    buf[i] = buf[i+1];
    if(buf[i+1] != -999){
      if(min > buf[i]){
        min = buf[i];
      }
      if(max < buf[i]){
        max = buf[i];
      }
    }
  }
  buf[69] = analogRead(A0);
  if(min > buf[69]){
    min = buf[69];
  }
  if(max < buf[69]){
    max = buf[69];
  }

  display.setCursor(0,13);
  display.print(strPad(max,4));
  display.setCursor(0,33);
  display.print(strPad((max + min) / 2,4));
  display.setCursor(0,53);
  display.print(strPad(min,4));

  display.setCursor(65,0);
  //display.print(String((double)buf[69]/1023.0*5.0) + "V");
  display.print(strPad(buf[69],4));

  // グラフ表示
  for (int i = 0; i < 69; i++) {
    if(buf[i] == -999) continue;
    // グラフのy座標を決定する
    int y = ((double)buf[i] - min) / (max - min) * 48.0;
    int y_next = ((double)buf[i+1] - min) / (max - min) * 48.0;

    display.drawLine(26+i, 58-y, 27+i, 58-y_next, GREEN);
    //display.drawPixel(26+i, 58-y, GREEN);
  }
}