M5Stack MicroPython API調査記録 ボタン編

※ [M5Cloud README.md](https://github.com/m5stack/M5Cloud/blob/master/README.md)などからのM5Stack MicroPython 固有のAPI調査記録 ボタン編(2018年3月2日現在)

# **ボタン**

M5Stackには３つのボタンがついている。

ボタンを使うには *m5stack* モジュールにある以下の *Button* オブジェクトをインポートします。

| ボタン | Buttonオブジェクト |
| :-- | :-- |
| A (左) | ~~BtnA~~ buttonA |
| B (中央) | ~~BtnB~~ buttonB |
| C (右) | ~~BtnC~~ buttonC |

※ ファームウェア 0.3.4 からボタンオブジェクトの名前が変更

#### ESP32とボタンの配線

ボタンの一端はそれぞれ以下に配線されている（もう一端はGND）:

| ESP32ピン | ボタン |
| :-- | :-- |
| GPIO39 | A (左)　|
| GPIO38 | B (中央) |
| GPIO37 | C (右) |

---
## **Button**のメソッド

### ~~Button.press()~~ Button.isPressed()

※ ファームウェア 0.3.4 からメソッド名が変更

ボタンが押されているかをチェックする。ボタンが押されていれば *True* を返す。

例：

```python3
import m5stack as m5

while True:
    if m5.buttonA.isPressed():  # ボタンAが押されているか
        m5.lcd.println('Button A is Pressed')
    time.sleep_ms(10)
```

### Button.isReleased()

※ ファームウェア 0.3.4 から追加

ボタンが押されていないかをチェックする。ボタンが押されていなければ *True* を返す。

例：

```python3
import m5stack as m5

while True:
    if m5.buttonA.isReleased():  # ボタンAが押されていないか
        m5.lcd.println('Button A is Released')
    time.sleep_ms(10)
```

### Button.pressedFor(timeout)

※ ファームウェア 0.3.4 から追加

ボタンを *timeout* 秒押し続けて放した場合に *True* を返す。

例：

```python3
import m5stack as m5

while True:
    if m5.buttonA.pressedFor(1.5):  # ボタンAが 1.5 秒以上押された
        m5.lcd.println('Button A pressed for 1.5s')
    time.sleep_ms(10)
```

### ~~Button.set_callback(press_cb)~~ Button.wasPressed(callback=None)

※ ファームウェア 0.3.4 からメソッド名が変更になり、機能も一部変更

コールバック関数 *callback* を指定していれば、ボタンが押されたときにコールバック関数が呼び出される。コールバック関数を指定していなければ、このメソッドが呼び出される前ににボタンを押すアクションがあったのであれば *True* を返す。

~~コールバック関数はパラメータを１つ持たなければならない。コールバック時にはパラメータに押されたボタンに該当する Pin オブジェクトが渡ってくる。~~

コールバック関数指定の例：

```python3
import m5stack as m5

def on_wasPressed():  # コールバック関数
    m5.lcd.println('Button A was Pressed.')

m5.buttonA.wasPressed(on_wasPressed)
```

コールバック関数指定なしの例：

```python3
import m5stack as m5

while True:    
    if m5.buttonA.wasPressed():  # ボタンAが押されたか
        m5.lcd.println('Button A was Pressed')
    time.sleep_ms(10)
```

### Button.wasReleased(callback=None)

※ ファームウェア 0.3.4 から追加

コールバック関数 *callback* を指定していれば、ボタンを押した状態から放したときにコールバック関数が呼び出される。コールバック関数を指定していなければ、このメソッドが呼び出される前に直前にボタンを放すアクションがあったのであれば *True* を返す。

コールバック関数指定の例：

```python3
import m5stack as m5

def on_wasReleased():  # コールバック関数
    m5.lcd.println('Button A was Released.')

m5.buttonA.wasReleased(on_wasReleased)
```

コールバック関数指定なしの例：

```python3
import m5stack as m5

while True:    
    if m5.buttonA.wasReleased():  # ボタンAが押されたか
        m5.lcd.println('Button A was Released')
    time.sleep_ms(10)
```

### Button.releasedFor(timeout, callback=None)

※ ファームウェア 0.3.4 から追加

コールバック関数 *callback* を指定していれば、ボタンを *timeout* 秒押した状態から放したときにコールバック関数が呼び出される。コールバック関数を指定していなければ、このメソッドが呼び出される前にボタンを *timeout* 秒押した状態から放すアクションがあったのであれば *True* を返す。

コールバック関数指定の例：

```python3
import m5stack as m5

def on_releasedFor():  # コールバック関数
    m5.lcd.println('Button A released for 2s press hold.')

m5.buttonA.releasedFor(2, on_releasedFor)
```

コールバック関数指定なしの例：

```python3
import m5stack as m5

while True:
    if m5.buttonA.releasedFor(2):  # ボタンAを 2 秒以上押して放したか
        m5.lcd.println('Button A released for 2s press hold.')
    time.sleep_ms(10)
```