ArduinoUNOとI2Cを使い0x40(8ビット表記0x80)に「hello...」と出力する。(Arduino)(ライブラリー化)


目的
I2Cのテスト
I2C->USART9600bps->USBのテスト
STM32-I2C-USART


![o_con311.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/3ebaa1ea-8d08-e57e-8004-98a864cf3731.jpeg)


![o_con312.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/704927f0-38b7-c6c7-eee2-a23cccb8c8b2.jpeg)



STM32G031 I2Cシリアル変換　


STM32G031とVSCode+STM32CubeでI2Cスレーブの受信文字をシリアル出力(受信)(STM32-I2C-USART)(CH340N)


https://qiita.com/caa45040/items/5032e6905c9425f41495



メインプログラム




```c++


//I2C_OUT_0X80_MAIN_UNO_1

#include <Arduino.h>
#include <Wire.h>

#include "I2C_OUT_0X80_UNO_1.h"

//初期化
void setup()
{

  //i2cの初期化
  pc.beginNS(9600);

} //setup


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

  //データの表示
  pc.printNS("HELLO WORLD\r\n");

  //4桁の値の表示
  pc.printNS(1234);
  //リターン
  pc.printNS("\r\n");

  //1秒の待ち
  delay(1000);

} //loop





```


のプログラム




```c++


#ifndef TEST_H
#define TEST_H

//I2C_OUT_0X80_UNO_1


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


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


char ch_hex_a_b[16];
char *ch_hex_a(int x)
{

  ch_hex_a_b[4] = 0;

  if       ( x >= 9000 ) {x = x - 9000; ch_hex_a_b[0] = '9';
  } else if( x >= 8000 ) {x = x - 8000; ch_hex_a_b[0] = '8';
  } else if( x >= 7000 ) {x = x - 7000; ch_hex_a_b[0] = '7';
  } else if( x >= 6000 ) {x = x - 6000; ch_hex_a_b[0] = '6';
  } else if( x >= 5000 ) {x = x - 5000; ch_hex_a_b[0] = '5';
  } else if( x >= 4000 ) {x = x - 4000; ch_hex_a_b[0] = '4';
  } else if( x >= 3000 ) {x = x - 3000; ch_hex_a_b[0] = '3';
  } else if( x >= 2000 ) {x = x - 2000; ch_hex_a_b[0] = '2';
  } else if( x >= 1000 ) {x = x - 1000; ch_hex_a_b[0] = '1';
  } else                 {              ch_hex_a_b[0] = '0';
  }//if
    
  ch_hex_a_b[3] = '0' + (  x - (DIV10(x) * 10)  );  // 3  <- 120 - 123
  x = DIV10(x);                                     // 12 <= 123 / 10
  ch_hex_a_b[2] = '0' + (  x - (DIV10(x) * 10)  );  // 2  <- 12 - 10
  ch_hex_a_b[1] = '0' +  DIV10(x);                  // 1  <- 12 / 10

  return (ch_hex_a_b);

} //ch_hex_a


//クラスの定義
struct _pc
{
  void beginNS(int sp);      //メソッドの宣言
  int  putcNS(char ch);      //メソッドの宣言
  int  printNS(char *str1);  //メソッドの宣言
  int  printNS(int num);     //メソッドの宣言 オーバーロード
};


#define ADDR1  0x40

//031
//STM32G031J6M6 i2cピンの定義
//#define sdaPin PA12    // ArduinoA4
//#define sclPin PA11    // ArduinoA5


//ポートをhiにする 初期化
//メソッドの定義
void _pc::beginNS(int sp)
{
  //031
  //i2cの初期化
  //Wire.begin(sdaPin, sclPin); //STM32G031J6M6

  //i2cの初期化
  Wire.begin(); //UNO
}


//仮想シリアルへの一文字出力 9600bps
//メソッドの定義
int _pc::putcNS(char ch)
{
  //I2Cに送信
  Wire.beginTransmission(ADDR1);
  Wire.write( ch );
  Wire.endTransmission();

  delay(1);//連続送信防止の為に1ms待つ

  //戻り値
  return (0);
}


//文字列の表示
//メソッドの定義
int _pc::printNS(char *str1)
{
  //文字の中身がゼロか
  while (*str1) {

    //一文字出力
    putcNS(*str1 ++);

  } //while

  //戻り値
  return (0);
}


//文字列の表示 オーバーロード 4桁
//メソッドの定義
int _pc::printNS(int num)
{
  if (num < 0) {
    putcNS('-');
    num = 0 - num;
  }

  char *str1 = ch_hex_a(num);

  //文字の中身がゼロか
  while (*str1) {

    //一文字出力
    putcNS(*str1 ++);

  } //while

  //戻り値
  return (0);
}


//実体の作成
_pc pc;


#endif






```