STM32C011でI2Cスレーブから温度を読み取って遊ぶ。(STM32C011J4M7) (ターゲットリセット)


x PA13を使います。
x 自己責任の意味がわかる人がお読みください。
x 間違った操作を行うと二度と書き込めなくなります。
x ターゲットリセットを接続してください。
x 非常用として「3秒ルール」があり、起動後、3秒以内に接続してください。
x Arduinoのタブの使い方がわかる人


目的
I2Cスレーブで遊ぶ
普通にI2C温度センサーを買った方が安い(例題の為の例題)
(202403091948完成)

いろいろ
処理を隠していじらせない様にするのが流行りなのでまねる。
クローズ系のシステムだと正しい(箱庭)(モジュール化、ユニット化)
親御さんに売るための商品としては、絶対正義。
スケッチと言うGUI系のノンコードは、徹底的に箱庭化されている。
次作は、超音波距離センサーのI2C化にしよう。余裕があったらOLED化

例

```

  //温度の表示 温度センサー0
  Serial.println( Temperature_S0() ); // 小数点以上

  //温度の表示 温度センサー1
  Serial.println( Temperature_S1() ); // 小数点以上


```

結果

![o_cop986.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/4bf3cd0a-a0aa-f569-b6bf-4d94bb096a12.jpeg)

![o_cop987.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/44326d67-5152-d66c-5bca-03408b8d9189.jpeg)

![o_cop988.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/fbadb97e-f9bd-f5b0-b4b2-769e7fc1bce7.jpeg)


受信(スレーブ)


```c++


//I2C_Slave_Temperature_MCP9701_C011_1


//インクルド
#include <Arduino.h>
#include <Wire.h>


//定義
#define ADD_Temperature_S0 ((0x80)>>1)
#define ADD_Temperature_S1 ((0x82)>>1)
#define ADD_Temperature_S2 ((0x84)>>1)
#define ADD_Temperature_S3 ((0x86)>>1)
#define ADD_Temperature_S4 ((0x88)>>1)
#define ADD_Temperature_S5 ((0x90)>>1)
#define ADD_Temperature_S6 ((0x92)>>1)
#define ADD_Temperature_S7 ((0x94)>>1)
#define ADD_Temperature_S8 ((0x96)>>1)
#define ADD_Temperature_S9 ((0x98)>>1)

#define Sensor_Sx ADD_Temperature_S0

char ss[] = {
 -19,-19,-19,-18,-17,-17,-16,-15,-15,-14,-13,-13,
 -12,-11,-11,-10, -9, -9, -8, -7, -7, -6, -5, -5,
  -4, -3, -3, -2, -2, -1, -1,  0,  1,  1,  2,  2,
   3,  4,  4,  5,  6,  6,  7,  8,  8,  9, 10, 10,
  11, 12, 12, 13, 14, 14, 15, 16, 16, 17, 18, 18,
  19, 20, 20, 21, 22, 22, 23, 24, 24, 25, 26, 26,
  27, 28, 28, 29, 30, 30, 31, 32, 32, 33, 34, 34,
  35, 36, 36, 37, 38, 38, 39, 40, 40, 41, 42, 42,
  43, 44, 44, 45, 45, 46, 47, 47, 48, 49, 49, 50,
  50, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
  99, 99, 99, 99, 99, 99, 99, 99
};


//初期化処理
void setup() {

  delay(3000); //not Delete (絶対消すな)(消しちゃィゃーん)

  //I2Cの初期化
  Wire.setSDA(19);   //PA10
  Wire.setSCL(18);   //PA9
  Wire.begin( Sensor_Sx ); // Slave ID #xx
  Wire.onRequest(requestEvent);

  //ピンの初期化 PA13
  pinMode(PA13, INPUT);

}//setup


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


int b = 0; //温度

//I2Cの読み取り関数
void requestEvent() {

  //値の送信 1つ前の値
  //b=46;//debug
  Wire.write( b );

  //アナログ値の読み込み
  int s = analogRead(PA13); //7PIN センサーの読み取り値

  //温度の変換
  b = ss[(s >> 2) & 0x7f]; // 小数点以上

}//requestEvent


```

----------------------------------------------
別マイコン

送信(マスター) ヘッダー

Temperature_MCP9701_I2C.h

```c++:Temperature_MCP9701_I2C.h

//Temperature_MCP9701_I2C.h


//インクルド
#include <Arduino.h>
#include <Wire.h>


//定義
#define ADD_Temperature_S0 ((0x80)>>1)
#define ADD_Temperature_S1 ((0x82)>>1)
#define ADD_Temperature_S2 ((0x84)>>1)
#define ADD_Temperature_S3 ((0x86)>>1)
#define ADD_Temperature_S4 ((0x88)>>1)
#define ADD_Temperature_S5 ((0x90)>>1)
#define ADD_Temperature_S6 ((0x92)>>1)
#define ADD_Temperature_S7 ((0x94)>>1)
#define ADD_Temperature_S8 ((0x96)>>1)
#define ADD_Temperature_S9 ((0x98)>>1)

#define Temperature_S0() Temperature_Sx(ADD_Temperature_S0)
#define Temperature_S1() Temperature_Sx(ADD_Temperature_S1)
#define Temperature_S2() Temperature_Sx(ADD_Temperature_S2)
#define Temperature_S3() Temperature_Sx(ADD_Temperature_S3)
#define Temperature_S4() Temperature_Sx(ADD_Temperature_S4)
#define Temperature_S5() Temperature_Sx(ADD_Temperature_S5)
#define Temperature_S6() Temperature_Sx(ADD_Temperature_S6)
#define Temperature_S7() Temperature_Sx(ADD_Temperature_S7)
#define Temperature_S8() Temperature_Sx(ADD_Temperature_S8)
#define Temperature_S9() Temperature_Sx(ADD_Temperature_S9)

//I2Cの初期化
void INT_Temperature_I2C_MCP9700() {

  //I2Cの初期化
  Wire.setSDA(19);   //PA10
  Wire.setSCL(18);   //PA9
  Wire.begin();  //I2Cの初期化

}//INT_Temperature_I2C_MCP9700


//温度の読み込み関数
int Temperature_Sx(int add_1 ){

  //読み込み
  Wire.requestFrom( add_1 , 1);

  int b = 99; //読み込み値 バイナリーの「b」
  while (Wire.available())  {   // 要求より短いデータが来る可能性あり
    b = Wire.read();            // 1バイトを受信
  }//while

  return( b ); //データの戻り値

} //Temperature_Sx


```

送信(マスター)

```c++


//I2C_Master_Temperature_MCP9701_C011_1


//インクルド
#include "Temperature_MCP9701_I2C.h"


//初期化
void setup() {

  delay(3000); //not delete

  //00:PB7
  //01:PC14
  //1x:Reserved
  SYSCFG->CFGR3 = SYSCFG->CFGR3 | 0b01;

  Serial.setTx(PC14);
  Serial.setHalfDuplex();
  Serial.begin(9600);

  Serial.print("\r\nSTART\r\n"); //スタートと表示

  INT_Temperature_I2C_MCP9700(); //温度センサーの初期化(I2C)

}//setup


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

  //温度の表示 温度センサー0
  Serial.println( Temperature_S0() ); // 小数点以上

  delay(1000); //1秒待つ

}//loop



```