TouchGFXを使おう8～ADC編～

TouchGFXを使おう7～ハードウェアボタン編～の続きです。

https://qiita.com/usashirou/items/191a1b29ec31b55c21fe

今回はTouchGFXでADCを使ってみましょう。
# TouchGFX覚書
@airpocketさんのまとめが参考になります。

https://protopedia.net/prototype/5202
# 画面の作成
__新規プロジェクト__ を作成し画面上に __textArea__ を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/1cc4ea40-ecec-e2c5-4714-13c893989b6b.png)
__Transtation__ を __ADC Value__ とし __＋__ を __クリック__ します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/eb6695a8-120d-4673-6b01-950805fbf9e9.png)
# wildcardの設定
__Wildcard1__ を __クリック__ します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/214aaa25-0656-00a7-c474-97f8453dbf2f.png)
__＋__ を __クリック__ します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f5a9c012-2036-301d-56d4-1d627d5ffcfe.png)
__Initial Value__ を __00000__ とします。
__0000__ だと、桁が見切れてしまうので要注意です。
__Use wildcard buffer__ のチェックを入れます。
__Buffer size__ は __airpocketさん__ を参考に __16__ にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/2cc59c90-70bc-55be-6188-6564b01e15b8.png)
左の __Texts__ を __クリック__ し、文字設定を行います。
__Typographies__ を選択し、__Defalult__ の __Wildcard Ranges__ を __0-9__ にします。
これをしないと0以外の文字は？と表示されます。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/ac50d773-61af-5cf4-d251-e321f8784ae0.png)
__コード生成__ します。
![スクリーンショット 2025-02-02 143136.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/2352fe41-954f-251b-408c-9077124fe875.png)
# pin設定
コード生成後、__STM32CubeIDE__ で __プロジェクト__ を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/b185f309-8c80-3baa-f3fd-0061d5196fd7.png)
ADCとしてアナログ入力を行うためのピンを決めます。
__PC0,PH2,PA0,PA1,PC2_C,PC3_C__ が使えるようです。
今回は、__PC0__ を __使用__ します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a3c44a30-7aac-2ade-9285-0116bf77e9b0.png)
__PC0__ を __クリック__ して __ADC1_INP10__ を __クリック__ します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/53e3ef51-2037-8c95-2a4f-44cce6c6ee8f.png)
__ADC1__ を __クリック__ し、 __IN10__ をプルダウンから __IN10 Single-ended__ を __選択__ します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/72338523-e380-199a-394c-1dfa05d736d6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/0f1b956e-c8db-b92b-90ba-2c15864d8769.png)
__Parameter Settings__ の __Resolution__ を今回は、__10bit__ にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/1c221994-4078-5632-b2da-cf318537473f.png)
__NVIC Interrupt Table__ の __チェック__ を入れて __コード生成__ します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/deb15652-a099-a7c9-85d4-58eb9201f863.png)
クロック等でエラーが多発しますが、このまま __Yes__ で進めることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a097cc32-d5cd-eaa3-5030-60ea4305a7bb.png)
# クロック修正をする
クロックの修正をする場合は PLL2PをPLL3R等にして回避します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/353c284c-adae-6b54-3841-5050f512b178.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/35750938-b0e1-1856-05b5-77c38cf67f05.png)
コード生成してYesで進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/03784131-954d-4a21-e9f9-93d44283648a.png)
# プログラム
## Screen1View.cpp
Screen1View.cppに使用するプログラムを追加します。
最初にシミュレータエラーを吐かない為のコード

    #ifndef SIMULATOR
    #include "main.h"
を追加します。

adcValueを宣言し、cntr20回毎にreadADCを行います。

__TouchGFX\gui\src\screen1_screen\Screen1View.cpp__
```
#ifndef SIMULATOR
#include "stm32h7xx_hal.h"
#include "main.h"
#endif
Screen1View::Screen1View()
{
	adcValue = 0;
}
```
```
void Screen1View::handleTickEvent()
{
	cntr++;
	if(cntr >= 20)
	{
		readADC();
		cntr = 0;
	}
}
void Screen1View::readADC()
{
	#ifndef SIMULATOR
	HAL_ADC_Start(&hadc1);
	HAL_ADC_PollForConversion(&hadc1, 100);
	HAL_ADC_Stop(&hadc1);
	adcValue=HAL_ADC_GetValue(&hadc1);
	#endif

	Unicode::snprintf(textArea1Buffer, TEXTAREA1_SIZE, "%5d", adcValue);
	textArea1.invalidate();
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/cbfd1d9f-b286-e417-5ef3-e5c0edaa285b.png)
## Screen1View.hpp
Screen1View.hppに関数の宣言と初期値を設定します。
__TouchGFX\gui\src\screen1_screen\Screen1View.hpp__
```
public:
    Screen1View();
    virtual ~Screen1View() {}
    virtual void setupScreen();
    virtual void tearDownScreen();
    virtual void handleTickEvent();
    void readADC();

protected:
    uint16_t cntr = 0;
    uint16_t adcValue;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/1c5121cd-c178-67b8-7acb-c61606d6181e.png)
## main.h
main.hにextern文を追記します。

```
/* USER CODE BEGIN Includes */
extern ADC_HandleTypeDef hadc1;
/* USER CODE END Includes */
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/69d3fc6c-94a2-ef6c-9b88-364df69199b6.png)
以上でコンパイル＆書込みすることでPC0に電圧を入力すると0~1023の間の値が表示されます。