カラーコードチェッカーを作ってみた。

f:id:manpukukoji:20200716074653j:plain
Wio Terminalは、LCDスクリーンがついていて、何かと表示させるのに便利なのに加えて、LovyanGFXというグラフィックのライブラリも提供してくれている方もいたりして、表示に関しては、至れり尽くせりの感がありますね。 あとは、こちらの技量とデザインセンスが問題なのですが…。
で、カラーを選択するときに、カラーのコードがわからないので、Wioに色とコードを表示する、コードチェッカーを作ってみました。
8ビット、16ビット、24ビットが選択でき、RGBそれぞれのビットを増減させると、それに応じた色とコードが表示されるというものです。
一応、表示できてるみたいですが、これで、合ってるのかな? いまいち、自信なさげなのでした…。

デフォルトは、16ビットで、十字ボタンのDOWNを押すと、24ビット、8ビットに切り替わります。
Cボタンを押した状態で十字ボタンの左を押すと、R(赤)のビットが増加します。同様に右ボタンで減少、Bボタンの同時押しでG(緑)のビット、Cボタンの同時押しでB(青)のビットが増減します。 その時表示されている色の下に該当するコードが表示されます。
ひとつづつ表示するより、テーブル表示の方が、便利だったかな…?

#include <LovyanGFX.hpp>

static LGFX lcd;                 
static LGFX_Sprite sprite(&lcd); 

int p_colr8 = 0, colr8 = 0x0, colr8_r=0XE0, colr8_g=0x1C, colr8_b=0x03;
int p_colr16 = 0, colr16 = 0x0, colr16_r=0X001F, colr16_g=0x003F, colr16_b=0x001F;
int p_colr24 = 0, colr24 = 0x0, colr24_r=0XFF0000, colr24_g=0x00FF00, colr24_b=0x0000FF;
int c_mode = 16, p_mode = 8;
  
void setup() {
    //Serial.begin(115200);
    pinMode(WIO_KEY_A, INPUT_PULLUP);
    pinMode(WIO_KEY_B, INPUT_PULLUP);
    pinMode(WIO_KEY_C, INPUT_PULLUP);
    pinMode(WIO_5S_UP, INPUT_PULLUP);
    pinMode(WIO_5S_DOWN, INPUT_PULLUP);
    pinMode(WIO_5S_LEFT, INPUT_PULLUP);
    pinMode(WIO_5S_RIGHT, INPUT_PULLUP);
    pinMode(WIO_5S_PRESS, INPUT_PULLUP);

    lcd.init();
    lcd.setRotation(1);
    lcd.setBrightness(128);
    lcd.setColorDepth(16);
    lcd.setTextSize(2);
    lcd.clear();

    lcd.drawString(String(c_mode)+" bit mode",110,50);
    lcd.drawRect(110,80,100,80,0xFFFF);
    lcd.drawString("0x" + String(colr16,HEX),110,200);

}


void loop() {
  if (digitalRead(WIO_5S_DOWN) == LOW) {
      if (c_mode == 16) {
        c_mode = 24;
        lcd.setColorDepth(24);
        lcd.clear();
        lcd.drawString("0x" + String(colr24,HEX),110,200);

      }
      else if (c_mode == 24) {
        c_mode = 8;
        lcd.setColorDepth(8);
        lcd.clear();
        lcd.drawString("0x" + String(colr8,HEX),110,200);
      }
      else {
        c_mode = 16;
        lcd.setColorDepth(16);
        lcd.clear();
        lcd.drawString("0x" + String(colr16,HEX),110,200);
      }
      while(digitalRead(WIO_5S_DOWN) == LOW);

      lcd.drawString(String(c_mode)+" bit mode",110,50);
      lcd.drawRect(110,80,100,80,(uint8_t)0xFF);

  }
  if(c_mode != p_mode) {
    colr8 = 0; colr8_r =0; colr8_g =0; colr8_b =0;
    colr16 = 0; colr16_r =0; colr16_g =0; colr16_b =0;
    colr24 = 0; colr24_r =0; colr24_g =0; colr24_b =0;
  }
    
    if( (digitalRead(WIO_KEY_A) == LOW) and (digitalRead(WIO_5S_RIGHT) == LOW) ) {
      switch(c_mode){
        case 8:
          colr8_b++;
          if (colr8_b > 0x3) colr8_b = 0x3;
          //while(digitalRead(WIO_5S_RIGHT) == LOW);
          delay(100);
          break;
        case 16:
          colr16_b++;
          if (colr16_b > 0x1F) colr16_b = 0x1F;
          //while(digitalRead(WIO_5S_RIGHT) == LOW);
          delay(100);
          break;
        case 24:
          colr24_b++;
          if (colr24_b > 0xFF) colr24_b = 0xFF;
          //while(digitalRead(WIO_5S_RIGHT) == LOW);
          delay(100);
      } //  end of switch
    }
    if( (digitalRead(WIO_KEY_A) == LOW) and (digitalRead(WIO_5S_LEFT) == LOW) ) {
      switch(c_mode){
        case 8:
          colr8_b--;
          if (colr8_b < 0x0) colr8_b = 0;
          //while(digitalRead(WIO_5S_LEFT) == LOW);
          delay(100);
          break;
        case 16:
          colr16_b--;
          if (colr16_b < 0x00) colr16_b = 0;
          //while(digitalRead(WIO_5S_LEFT) == LOW);
          delay(100);
          break;
        case 24:
          colr24_b--;
          if (colr24_b < 0x0) colr24_b = 0;
          //while(digitalRead(WIO_5S_LEFT) == LOW);
          delay(100);
      } //  end of switch
    }
    if( (digitalRead(WIO_KEY_B) == LOW) and (digitalRead(WIO_5S_RIGHT) == LOW) ) {
      switch(c_mode){
        case 8:
          colr8_g++;
          if (colr8_g > 0x7) colr8_g = 0x7;
          //while(digitalRead(WIO_5S_RIGHT) == LOW);
          delay(100);
          break;
        case 16:
          colr16_g++;
          if (colr16_g > 0x3F) colr16_g = 0x3F;
          //while(digitalRead(WIO_5S_RIGHT) == LOW);
          delay(100);
          break;
        case 24:
          colr24_g++;
          if (colr24_g > 0xFF) colr24_g = 0xFF;
          //while(digitalRead(WIO_5S_RIGHT) == LOW);
          delay(100);
      } //  end of switch
    }
    if( (digitalRead(WIO_KEY_B) == LOW) and (digitalRead(WIO_5S_LEFT) == LOW) ) {
      switch(c_mode){
        case 8:
          colr8_g--;
          if (colr8_g < 0x0) colr8_g = 0;
          //while(digitalRead(WIO_5S_LEFT) == LOW);
          delay(100);
          break;
        case 16:
          colr16_g--;
          if (colr16_g < 0x00) colr16_g = 0;
          //while(digitalRead(WIO_5S_LEFT) == LOW);
          delay(100);
          break;
        case 24:
          colr24_g--;
          if (colr24_g < 0x0) colr24_g = 0;
          //while(digitalRead(WIO_5S_LEFT) == LOW);
          delay(100);
      } //  end of switch
    }
    if( (digitalRead(WIO_KEY_C) == LOW) and (digitalRead(WIO_5S_RIGHT) == LOW) ) {
      switch(c_mode){
        case 8:
          colr8_r++;
          if (colr8_r > 0x7) colr8_r = 0x7;
          //while(digitalRead(WIO_5S_RIGHT) == LOW);
          delay(100);
          break;
        case 16:
          colr16_r++;
          if (colr16_r > 0x1F) colr16_r = 0x1F;
          //while(digitalRead(WIO_5S_RIGHT) == LOW);
          delay(100);
          break;
        case 24:
          colr24_r++;
          if (colr24_r > 0xFF) colr24_r = 0xFF;
          //while(digitalRead(WIO_5S_RIGHT) == LOW);
          delay(100);
      } //  end of switch
    }
    if( (digitalRead(WIO_KEY_C) == LOW) and (digitalRead(WIO_5S_LEFT) == LOW) ) {
      switch(c_mode){
        case 8:
          colr8_r--;
          if (colr8_r < 0x0) colr8_r = 0;
          //while(digitalRead(WIO_5S_LEFT) == LOW);
          delay(100);
          break;
        case 16:
          colr16_r--;
          if (colr16_r < 0x00) colr16_r = 0;
         // while(digitalRead(WIO_5S_LEFT) == LOW);
          delay(100);
          break;
        case 24:
          colr24_r--;
          if (colr24_r < 0x0) colr24_r = 0;
          //while(digitalRead(WIO_5S_LEFT) == LOW);
          delay(100);
      } //  end of switch
    }

    switch(c_mode){
      case 8:
        colr8 = (colr8_r<<5)+(colr8_g<<2)+colr8_b;
        if (colr8 != p_colr8) {
          lcd.clear();
          lcd.drawString(String(c_mode)+" bit mode",110,50);
          lcd.fillRect(110,80,100,80,(uint8_t)colr8);
          lcd.drawRect(110,80,100,80,(uint8_t)0xFF);
          lcd.drawString("0x" + String(colr8,HEX),110,200); 
        }
        p_colr8 = colr8;
          break;
      case 16:
        colr16 = (colr16_r<<11)+(colr16_g<<5)+colr16_b;
        if (colr16 != p_colr16) {
          lcd.clear();
          lcd.drawString(String(c_mode)+" bit mode",110,50);
          lcd.fillRect(110,80,100,80,(uint16_t)colr16);
          lcd.drawRect(110,80,100,80,0xFFFF);
          lcd.drawString("0x" + String(colr16,HEX),110,200); 
        }
        p_colr16 = colr16;
          break;
       case 24:
        colr24 = (colr24_r<<16)+(colr24_g<<8)+colr24_b;
        if (colr24 != p_colr24) {
          lcd.clear();
          lcd.drawString(String(c_mode)+" bit mode",110,50);
          lcd.fillRect(110,80,100,80,(uint32_t)colr24);
          lcd.drawRect(110,80,100,80,0xFFFFFF);
          lcd.drawString("0x" + String(colr24,HEX),110,200); 
        }
        p_colr24 = colr24;
    } //end of switch
      p_mode = c_mode;
}   //  end of loop