
ディスプレイはi2cアダプターを介して接続されています。 十分な連絡先がありませんでした。 標準ライブラリでは、追加のキャラクターを接続することは少し異なりますが、意味は明確でなければなりません。
圧力センサーもプロジェクトの理由で選択されていますが、任意のプロセスのグラフを作成することもできます。 グラフの場合、1行に16文字があり、それらすべてを使用できます(写真のように)が、グラフをわかりやすくするために、最初の文字を署名に使用し、13文字にします。 2時間ごとに測定値を表示します。
残りはコード内のコメントです。
#include <Wire.h> #include <SPI.h> #include <LiquidCrystal_I2C.h> // LCD i2c LiquidCrystal_I2C lcd(0x3F,16,2); // i2c // #if defined(ARDUINO) && ARDUINO >= 100 #define printByte(args) write(args); #else #define printByte(args) print(args,BYTE); #endif // , . uint8_t graf0[8] = {0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F}; uint8_t graf1[8] = {B00000, B11111, B11111, B11111, B11111, B11111, B11111}; uint8_t graf2[8] = {B00000, B00000, B11111, B11111, B11111, B11111, B11111}; uint8_t graf3[8] = {B00000, B00000, B00000, B11111, B11111, B11111, B11111}; uint8_t graf4[8] = {B00000, B00000, B00000, B00000, B11111, B11111, B11111}; uint8_t graf5[8] = {B00000, B00000, B00000, B00000, B00000, B11111, B11111}; uint8_t graf6[8] = {B00000, B00000, B00000, B00000, B00000, B00000, B11111}; uint8_t graf7[8] = {B00000, B00000, B00000, B00000, B00000, B00000, B00000}; // int stat[2][25]; // 2 , ( ) //int stat[0]; // //int stat[1]; // #include <BMP085.h> BMP085 dps = BMP085(); // long Pressure = 0; void setup(void) { lcd.init(); lcd.backlight(); // lcd.createChar(0, graf0);// . lcd.createChar(1, graf1); lcd.createChar(2, graf2); lcd.createChar(3, graf3); lcd.createChar(4, graf4); lcd.createChar(5, graf5); lcd.createChar(6, graf6); lcd.createChar(7, graf7); }
1時間に1回、圧力センサーの値と時間を読み取り、配列を埋めます。 グラフプロット関数を呼び出します。 例が煩雑にならないように、コードの表示の最初の行の現在の値を削除しました。
void loop(void) { if (((millis()/3600000)-stat[1][23]) >= 1.0) // 1 (3600000) { // , int i=0; for (i = 0; i < 24; i++) stat[0][i] = stat[0][i+1]; for (i = 0; i < 24; i++) stat[1][i] = stat[1][i+1]; dps.getPressure(&Pressure); // stat[0][23] = Pressure/13.33; stat[1][23] = millis()/3600000; grafik(0, 2, 0); // , , , , . (0), (2) (0) }
相対グラフを作成して、値が収まる間隔を計算します。 1つの表示セルの8行しか使用できないため、間隔を8つの間隔に分割します。
int interval(int x) { int maxy = -5000; int inty = 0; int minx = minimum(x); for (int k = 0; k <= 24; k++) { if (stat[1][k] != 0) { // if (stat[x][k] > maxy) maxy = stat[x][k]; // }} if (maxy == -5000) maxy = 0; // inty = maxy - minx; intx = inty/8; return intx; }
間隔を計算するとき、配列の最小値が必要です。
int minimum(int d) { minx = 32767; for (int i = 0; i <= 24; i++) { if (stat[1][i] != 0) { // if (stat[d][i] < minx) minx = stat[d][i];// }} if (minx == 50000) minx = 0; return minx; }
グラフ自体を作成します。時間配列に値がない場合は、ダッシュを出力します。 関数呼び出しは、配列から異なるグラフを作成するために複雑です。 最初の数字は配列の番号、次にデータサンプリングの頻度、配列の初期値です。 最初の配列(0)を取得し、2番目ごとの値(2)を取得し、先頭から開始します(0):
void grafik(int x, int y, int z) { lcd.setCursor(0, 1); lcd.print("Dav"); // intx = interval(x); // int minx = minimum(x); // for (int i=z; i <= 24; i= i + y){ if (stat[x][i] == 0){ // lcd.print("-"); // , } else if (stat[x][i] > (minx + intx*7)) { lcd.printByte(0); } else if (stat[x][i] > (minx + intx*6)) { lcd.printByte(1); }else if (stat[x][i] > (minx + intx*5)) { lcd.printByte(2); }else if (stat[x][i] > (minx + intx*4)) { lcd.printByte(3); }else if (stat[x][i] > (minx + intx*3)) { lcd.printByte(4); }else if (stat[x][i] > (minx + intx*2)) { lcd.printByte(5); }else if (stat[x][i] > (minx + intx)) { lcd.printByte(6); } else { lcd.printByte(7); } } }