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);
}
}
ディスカッション
コメント一覧
まだ、コメントがありません