キャラクターディスプレイ1602 Arduinoでグラフを作成する

Arduino UNO、1602ディスプレイ(およびi2cアダプター)、BMP180圧力センサーが必要です。 写真の品質には申し訳ありませんが、それは何ですか。







ディスプレイは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);             }          }        }
      
      






All Articles