ArduinoUNOを使い1から4096を文字列に変換 例intの1234を文字列の「1234」


目的　ライブラリを使わず数値を文字列に変換する
一部ストリングも利用

3桁、4桁ぐらいだと「ライブラリ」を使わなくても
整数を文字列に変換出来てお得

x 正の数、整数(小数点以下は、含まない)

![o_con225.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e13811b0-1306-9d71-d3c8-0e63d7ba6846.jpeg)



![o_con226.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/23f68dce-4061-3ceb-e040-1fbf7dba0d9a.jpeg)


![o_con227.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/aeef8a79-970d-6eca-1eed-290c2daa8076.jpeg)



ArduinoUnoで16進変換して遊ぶ


https://qiita.com/caa45040/items/f0e8b4e6b4a5223987d7





まず　0から1

```c++


void setup() {
  Serial.begin(9600);

  int x = 1;
  char data[5];  

  Serial.println("START");
  Serial.println("X=1");

  data[0] = '0' + x;
  data[1] = 0;

  Serial.println(data);
}

void loop() {
}



```

0から10

```c++



void setup() {
  Serial.begin(9600);

  int x = 12;
  char data[5]; 
  int n1,n10;

  Serial.println("START");
  Serial.println("X=12");


  n10 = x / 10;
  n1  = x - (n10*10);

  data[0] = '0' + n10;
  data[1] = '0' + n1;
  data[2] = 0;

  Serial.println(data);
}

void loop() {
}




```

0から100


```c++



void setup() {
  Serial.begin(9600);

  int x = 123;
  char data[5]; 
  int n1,n10,n100;

  Serial.println("START");
  Serial.println("X=123");

  n10 =  x / 10;
  n1  =  x - (n10*10);
  n100 =  n10 / 10;
  n10  = n10 - (n100*10);

  data[0] = '0' + n100;
  data[1] = '0' + n10;
  data[2] = '0' + n1;
  data[3] = 0;

  Serial.println(data);
}

void loop() {
}




```

0から1000

```c++



void setup() {
  Serial.begin(9600);

  int x = 1234;
  char data[5]; 
  int n1,n10,n100,n1000;

  Serial.println("START");
  Serial.println("X=1234");

  n10 =  x / 10;             // 123 <- 1234 / 10
  n1  =  x - (n10*10);       // 4   <- 1234 - 1230
  n100 = n10 / 10;           // 12  <- 123 / 10
  n10  = n10 - (n100*10);    // 3   <- 123 - 120
  n1000 = n100/10;           // 1   <- 12 / 10
  n100  = n100 - (n1000*10); // 2   <- 12 - 10

  data[0] = '0' + n1000;
  data[1] = '0' + n100;
  data[2] = '0' + n10;
  data[3] = '0' + n1;
  data[4] = 0;

  Serial.println(data);
}

void loop() {
}



```

ストリング文

```c++



void setup() {
  Serial.begin(9600);

  int x = 1234;

  Serial.println("START");
  Serial.println("X=1234");

  String thisString = String(x);

  Serial.println(thisString);
}

void loop() {
}



```


シフトを使った10の割り算
a = (123 * 10)/100
aは、12になる

a = (123 * 204.8)/2048
aは、12になる

a= (123 * 205 ) / 2048
aは、12になるが　値が大きくなると.2のずれが蓄積する


```c++


//10の割り算 0から1028までは、正しい。主に0から999
#define DVI10(n) ((n*205)>>11)

```

その2 10ビットを5ビットごとに分割して演算

```c++

//10の割り算 0から1028までは、正しい。主に0から999
#define DIV10(X) ((((X>>5)*205)+(((X&0x1f)*205)>>5))>>6)



```


0から2048の例


```c++

if     ( ii >= 2000 ) { ii = ii - 2000; /*printf("2.\n\r");*/   i2c.write(ADDR_LCD,"@2.",3); }
else if( ii >= 1000 ) { ii = ii - 1000; /*printf("1.\n\r");*/   i2c.write(ADDR_LCD,"@1.",3); }
else                  {                 /*printf("0.\n\r");*/   i2c.write(ADDR_LCD,"@0.",3); }


```


0から4096の例

```c++

if     ( x >= 4000 ) { x = x - 4000; printf("4.\n\r");    }
else if( x >= 3000 ) { x = x - 3000; printf("3.\n\r");    }
else if( x >= 2000 ) { x = x - 2000; printf("2.\n\r");    }
else if( x >= 1000 ) { x = x - 1000; printf("1.\n\r");    }
else                 {               printf("0.\n\r");    }



```

0-4096

```c++

  x_bk = x;

    x     =  x             / 10;           // 123 <- 1234 / 10
  data[3] = '0' +  (  x_bk - (x*10)  );    // 4   <- 1234 - 1230
    x_bk  =  x;

    x     =  x             / 10;           // 12  <- 123 / 10
  data[2] = '0' +   ( x_bk - (x*10) );     // 3   <- 123 - 120
    x_bk  =  x;

    x    = x              / 10;            // 1   <- 12 / 10

  data[0] = '0' + x;

  data[1] = '0' +    ( x_bk - (x*10) );    // 2   <- 12 - 10

  data[4] = 0;





```

さらにどうだ!!


```c++


int x = 1234;
int x_bk;
char data[15];


 data[4] = 0;

if     ( x >= 4000 ) { x = x - 4000;   data[0] = '4';    }
else if( x >= 3000 ) { x = x - 3000;   data[0] = '3';    }
else if( x >= 2000 ) { x = x - 2000;   data[0] = '2';    }
else if( x >= 1000 ) { x = x - 1000;   data[0] = '1';    }
else                 {                 data[0] = '0';    }
 
  x_bk = x;

    x     =  x             / 10;           // 12 <- 123 / 10
  data[3] = '0' +  (  x_bk - (x*10)  );    // 3  <- 120 - 123
    x_bk  =  x;

    x     =  x             / 10;           // 1  <- 12 / 10
  data[2] = '0' +   ( x_bk - (x*10) );     // 2  <- 12 - 10

  data[1] = '0' + x;


```

さらに

```c++


//10の割り算 0から1028までは、正しい。主に0から999
#define DIV10(X) ((((X>>5)*205)+(((X&0x1f)*205)>>5))>>6)

void setup() {

  Serial.begin(9600);

  Serial.println("START");

}

void loop() {

int x = 1234;
int x_bk;
char data[15];

 data[4] = 0;

if     ( x >= 4000 ) { x = x - 4000;   data[0] = '4';    }
else if( x >= 3000 ) { x = x - 3000;   data[0] = '3';    }
else if( x >= 2000 ) { x = x - 2000;   data[0] = '2';    }
else if( x >= 1000 ) { x = x - 1000;   data[0] = '1';    }
else                 {                 data[0] = '0';    }

  x_bk = x;

    x     =  DIV10(x);                     // 12 <- 123 / 10
  data[3] = '0' +  (  x_bk - (x*10)  );    // 3  <- 120 - 123
    x_bk  =  x;

    x     =  DIV10(x);                     // 1  <- 12 / 10
  data[2] = '0' +   ( x_bk - (x*10) );     // 2  <- 12 - 10

  data[1] = '0' + x;

  Serial.println(data);
  delay(1000);

}





```