STM32CubeIDEを使ってみよう　How To STM32CubeIDE 日本語版　(4) スイッチを使ってみよう

STM32CubeIDEを使ってみよう　How To STM32CubeIDE 日本語版　(3)の続きです。
今度は、スイッチを使ってみましょう。

スイッチは、B1して登録されています。
まずは、「.ioc」ファイルをあけて確認してみましょう。
![50-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/2aa60bcf-6df6-78f2-b13d-03d37eb816b2.jpeg)

スイッチにつなるPC13がB1となっていることを確認できましたね。
では、これを押したら、LEDが点灯するプログラムを書いてみましょう。

もし、Aしたら、Bをする
そうではない時はCをする

もし、B1のスイッチを押したら、LEDを点灯する。
そうではないときは、LEDは消灯する。

これをC言語にします。
ifはもし
elseはそうではないとき

if(条件）｛
やること｝else{
やること｝

条件：B1のスイッチが押されたとき
B1の内容を読むのはreaPinと書きます。
if(HAL_GPIO_ReadPin　とします。
![50-1-0-0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/9395f5c7-88ab-0a11-d959-677bf0c0a418.jpeg)
![50-1-0-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/c6d1adb0-1280-6edb-3d82-05166e12fafe.jpeg)

B1ピンを設定します。
if(HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin))
さらに、これが押されたときを入れましょう。
今回の場合、0の場合が押されたときになります。
if(HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin)==0)
とします。
＝０ではなく＝＝０です。
＝０だと動きません。

次に、やることを記述します。
今回は、LEDを点灯させます。
LEDは1にすると点灯します。
ここで、１や０って何？ということですが、１はHi,０はLoといい、基準電圧の上限下限にあることを指します。
STM32は3.3Vが基本なので、3.3VをHiとし、０VをLoとなります。
（正確には使うマイコンの仕様によって1.xV以下をLoと認識するようになっていたりします）
今回は、LEDにつながるピンを１つまり、3.3Vにすると、LEDに電気が流れてLEDが点きます。
これをするには、writePinで設定します。
![50-1-0-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/5c46dff2-a3f6-9b1d-7767-617f01b917d4.jpeg)
![50-1-0-4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/26142973-6cf3-eea5-25d2-b2bc82fc7b7b.jpeg)

PinStateには1を入れてあげることで3.3Vが出力されます。
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, 1);
となります。
これで、B1が押されたらLEDが点灯する内容が記述できましたが、これではC言語として文法が成り立っていません。
試しにビルドしてみましょう。
エラーになります。

![50-1-0-5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/74c36ee8-6352-188b-8390-317d1ae1e58e.jpeg)


それでは、C言語のif文のフォーマットにして入力してみましょう
if(条件）｛
やること｝else{
やること｝

単純に｛｝で囲うだけです。

```
    /* USER CODE BEGIN 3 */
	  if(HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin)==0){
	  HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, 1);
	  }else{
		  HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, 0);
	  }
	  LED_State = HAL_GPIO_ReadPin(LD2_GPIO_Port, LD2_Pin);
	  B1_State = HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin);
  }
  /* USER CODE END 3 */
```

今回、else(そうではないときは）にLEDを消灯するプログラムを加えています。
そうではない時は、条件がないば場合はなくても良いです
では消してみましょう。

すると、ボタンを１度押すとLEDが光るが、再度押しても消えないと思います。
なぜでしょうか？

もし、B1のスイッチを押したら、LEDを点灯する。
そうではないときは、LEDは消灯する。
の消灯するが無いためです。

LEDが点灯していたら、消す、消灯していたら点灯すると記述すると面倒ですよね？
ここで、Lチカの時に入れたTogglePinを使います。
TogglePinとは反転させるという意味で、この点灯の場合は、消灯に、消灯の場合は、点灯にしてくれます

```
    /* USER CODE BEGIN 3 */
	  if(HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin)==0){
	  HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
	  }
	  LED_State = HAL_GPIO_ReadPin(LD2_GPIO_Port, LD2_Pin);
	  B1_State = HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin);
  }
  /* USER CODE END 3 */
```

ここまでで実は、しれっとLED_StateとB1_Stateとを入れています。
https://qiita.com/usashirou/items/e1cb59a508dac64b8a3c
でやったように、
int LED_State = 0;
int B1_State = 0;
を私は49行目辺りに追加しています。
ViewにもB1_Stateを追加しています。
これで動くはずですが、うごきましたか？

![50-1-1-6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/186d313e-0fbe-a3dc-eb1a-a36732de8dfa.jpeg)

ここで問題が発生します。
ボタンを押してもLEDが消えないのです、またはつかないのです。
B1_Stateも変わらないです。
これは、チャタリングという現象によるものです。
チャタリングの解消には、いくつかの手法があるのですが、今回は、ここまではやりません。

（編注：なお、本来Nucleoのボードには抵抗とコンデンサが入っており、チャタリングは起きないはずなのですが、私はかなり顕著に起きてしまいました。
この辺については、どこかで触れるかもしれません。）