俺は、「女子に」うける、サウンドメーターを作る(3)とりま1から8チャンネル任意値バー表示


仕様
----

- 過去ログを見て?

- L1からL8まで任意の値をセットして表示させる
- L(ライン)1(番目)の事
- 0の時は、0番目の長さ8ビットラインを表示
- 指定された回数ループ、あとは、黒ループ
- L1からL8までダイレクトこーでんぐ
- コンパイルが速いのでArduino UNO rev3を使用
- L1は、グローバルでint。(約7倍程度かかるがしゃない)
- 再表示関数で再表示
- 初期化は、魔法のコマンドを使用
- 9割がた出来たので酒のつまみ状態
- メインの処理

```c++



  //L1の回数分、ループする
  for (int i = 0; i < (L1 + 1); i++) {
    write_s(databytes_ON, 2); //0xFFの事
  }//for i
  for (int i = 0; i < ((128 - 1) - L1); i++) {
    write_s(databytes_OFF, 2); //0x00の事
  }//for i


```


結果
----

![image_original (64).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/617d59be-0627-4eb5-96e5-41352c1492ca.jpeg)



プログラム
----




```c++



//秋月のOLEDとアイテンドウのOLEDのアドレスは3C
//ssd1306_8ch_SoundLevelMeter_1_uno_1


//ヘッダー
#include <Arduino.h>
//#include <avr/pgmspace.h>
#include <Wire.h>


//定義
#define MAX_PAGE                   (7)
#define MAX_COL                    (127)

#define COMMAND_MODE               0x80 // continuation bit is set!
#define DATA_MODE                  0x40

#define SET_COLUMN_ADDRESS         0x21 // takes two bytes, start address and end address of display data RAM
#define SET_PAGE_ADDRESS           0x22 // takes two bytes, start address and end address of display data RAM

#define SET_MEMORY_ADDRESSING_MODE 0x20 // takes one byte as given above
#define HORIZONTAL_ADDRESSING_MODE 0x00


//I2Cに配列を転送する
void write_s(uint8_t *str1, uint8_t len1) {

  Wire.beginTransmission(  0x3c  );

  for (int ii = 0; ii < len1; ii++) {

    //一文字出力
    Wire.write(*str1 ++);

  }//for

  Wire.endTransmission();

}//write_s


//セットページアドレス
void setPageAddress(uint8_t start, uint8_t end)
{
  uint8_t databytes[6] = {COMMAND_MODE, SET_PAGE_ADDRESS, COMMAND_MODE, start, COMMAND_MODE, end};
  write_s(databytes, 6);
}//setPageAddress


//セットカラムアクセス
void setColumnAddress(uint8_t start, uint8_t end)
{
  uint8_t databytes[6] = {COMMAND_MODE, SET_COLUMN_ADDRESS, COMMAND_MODE, start, COMMAND_MODE, end};
  write_s(databytes, 6);
}//setColumnAddress


//セットメモリーアドレシングモード
void setMemoryAddressingMode()
{
  uint8_t databytes[4] = {COMMAND_MODE, SET_MEMORY_ADDRESSING_MODE, COMMAND_MODE, HORIZONTAL_ADDRESSING_MODE};
  write_s(databytes, 4);
}//setMemoryAddressingMode


int L1 = 0;
int L2 = 0;
int L3 = 0;
int L4 = 0;

int L5 = 0;
int L6 = 0;
int L7 = 0;
int L8 = 0;

//再表示
void display(void) {

  //範囲の設定 (OLED内部のx,yカウンターを初期化してホームポジション0,0に)
  setPageAddress(0, MAX_PAGE);  // all pages
  setColumnAddress(0, MAX_COL); // all columns

  static uint8_t databytes_ON[2] = {DATA_MODE, 0xFF};
  static uint8_t databytes_OFF[2] = {DATA_MODE, 0x00};

  //L1の回数分、ループする
  for (int i = 0; i < (L1 + 1); i++) {
    write_s(databytes_ON, 2); //0xFFの事
  }//for i
  for (int i = 0; i < ((128 - 1) - L1); i++) {
    write_s(databytes_OFF, 2); //0x00の事
  }//for i

  //L2の回数分、ループする
  for (int i = 0; i < (L2 + 1); i++) {
    write_s(databytes_ON, 2); //0xFFの事
  }//for i
  for (int i = 0; i < ((128 - 1) - L2); i++) {
    write_s(databytes_OFF, 2); //0x00の事
  }//for i

  //L3の回数分、ループする
  for (int i = 0; i < (L3 + 1); i++) {
    write_s(databytes_ON, 2); //0xFFの事
  }//for i
  for (int i = 0; i < ((128 - 1) - L3); i++) {
    write_s(databytes_OFF, 2); //0x00の事
  }//for i

  //L4の回数分、ループする
  for (int i = 0; i < (L4 + 1); i++) {
    write_s(databytes_ON, 2); //0xFFの事
  }//for i
  for (int i = 0; i < ((128 - 1) - L4); i++) {
    write_s(databytes_OFF, 2); //0x00の事
  }//for i


  //L5の回数分、ループする
  for (int i = 0; i < (L5 + 1); i++) {
    write_s(databytes_ON, 2); //0xFFの事
  }//for i
  for (int i = 0; i < ((128 - 1) - L5); i++) {
    write_s(databytes_OFF, 2); //0x00の事
  }//for i

  //L6の回数分、ループする
  for (int i = 0; i < (L6 + 1); i++) {
    write_s(databytes_ON, 2); //0xFFの事
  }//for i
  for (int i = 0; i < ((128 - 1) - L6); i++) {
    write_s(databytes_OFF, 2); //0x00の事
  }//for i

  //L7の回数分、ループする
  for (int i = 0; i < (L7 + 1); i++) {
    write_s(databytes_ON, 2); //0xFFの事
  }//for i
  for (int i = 0; i < ((128 - 1) - L7); i++) {
    write_s(databytes_OFF, 2); //0x00の事
  }//for i

  //L8の回数分、ループする
  for (int i = 0; i < (L8 + 1); i++) {
    write_s(databytes_ON, 2); //0xFFの事
  }//for i
  for (int i = 0; i < ((128 - 1) - L8); i++) {
    write_s(databytes_OFF, 2); //0x00の事
  }//for i

}//display


//SSD1306の初期化
void display_begin(void) {

  //I2Cの初期化
  //Wire.setSDA(A5); //SDA I2Cのポートの変更
  //Wire.setSCL(A4); //SCL I2Cのポートの変更
  Wire.begin(); //Arduino UNO Rev3
  delay(200);

  //SSD1306の初期化スペル(魔法)
  //0x80,0x8D,0x80,0x14,0x80,0xAF
  write_s( (uint8_t*) "\200\215\200\024\200\257", 6);
  delay(100);

  //セットメモリーアドレシングモード (画面の終端に来たら画面の先頭に)
  setMemoryAddressingMode();

}//display_begin


//初期化
void setup() {

  //SSD1306の初期化
  display_begin();

  //再表示
  //display();

}//setup


//メインループ
void loop() {

  L1 = 64;
  L2 = 64 + 8;
  L3 = 64 + 8 + 8;
  L4 = 64 + 8 + 8 + 8;

  L5 = 64;
  L6 = 64 - 8;
  L7 = 64 - 8 - 8;
  L8 = 64 - 8 - 8 - 8;

  //再表示
  display();

  delay(1000); //1秒待つ

}//loop

```