【Raspberry pi ど初心者】タクトスイッチを押したタイミングで温湿度を取得 | churob

churob

ちゅろぶ

図書館で借りてきた本にタクトスイッチの説明やLEDとの配線の仕方が載っていたので、

センサ取得情報をtweetさせるのはいったんあきらめて、スイッチで動作させることにした。

 

タクトスイッチの基本的な仕組みを理解するため、最初にLEDの点灯をスイッチで操作するところからはじめた。

 

 1)LEDライトに接続し、スイッチが入ったタイミングで点灯させる
 2)タクトスイッチをプログラムによりトグル動作させLEDの点灯、消灯を繰り返す
 3)温度・湿度・気圧を、タクトスイッチが押されたタイミングで取得する

 

※参考書籍「Raspberry Piで学ぶ電子工作 超小型コンピュータで電子回路を制御する」

※温度・湿度・気圧 取得センサ BME280

 

 

  

 

写真にあるブレッドボードの「+」を3.3Vのピンへ

「-」をGROUNDのピンへ。

 

あとLED側の線とスイッチ側の線は任意のピンへ

今回は

 LED側 → ピン 25

 スイッチ側 → ピン 7

 

1)LEDライトに接続し、スイッチが入ったタイミングで点灯させる

 

 

import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)
GPIO.setup(25, GPIO.OUT)
GPIO.setup(7, GPIO.IN)

try:
    while True:
        if GPIO.input(7) == GPIO.HIGH:
            GPIO.output(25, GPIO.HIGH)
        else:
            GPIO.output(25, GPIO.LOW)
        sleep(0.01)

except KeyboardInterrupt:
    pass

GPIO.cleanup()

 

 

意外とすんなりできた。

 

2)タクトスイッチをプログラムによりトグル動作させLEDの点灯、消灯を繰り返す

 

1)は押している間中点灯し、離すと消えた。

これだと連続点灯させたい時ずっと押してないといけない。

次は1回押したら点灯し、次に押したら消灯するように変更した。

 

 

import RPi.GPIO as GPIO
from time import sleep

def my_callback(channel):
    global ledState
    if channel == 7:
        ledState = not ledState
        if ledState == GPIO.HIGH:
            GPIO.output(25, GPIO.HIGH)
        else:
            GPIO.output(25, GPIO.LOW)

GPIO.setmode(GPIO.BCM)
GPIO.setup(25, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(7, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.add_event_detect(7, GPIO.RISING, callback=my_callback, bouncetime=200)

ledState = GPIO.LOW

try:
    while True:
        sleep(0.01)
except KeyboardInterrupt:
    pass

GPIO.cleanup()

 

 

これも無事完成。

 

3)温度・湿度・気圧を、タクトスイッチが押されたタイミングで取得する 

 

最後に本命の、センサを動作させるプログラム。

センサとスイッチの回路をなにか連結させるのかと思っていたけれど、

スイッチが押される信号がラズパイにきたら、ラズパイからセンサを動作させる、

という流れになるため、センサから出る配線をブレッドボードにつないだりせず

センサの配線は以前のまま、スイッチの配線も1)2)のまま使えた。

 

考え方としては、センサ用のコードの最後の5行を、2)のコードと合体させて

スイッチが押されたらセンサが動くようにする。

 

if __name__ == '__main__':
    try:
        readData()
    except KeyboardInterrupt:
        pass

 

 

#coding: utf-8

~~~省略~~~

(センサを動作させるプログラム。公式サイトからそのまま。

 上に書いた最後の5行は★に変形させて後で使うのでここからは削除。)

~~~ここからスイッチ用のコード。2)をアレンジ~~~

import RPi.GPIO as GPIO
from time import sleep

def my_callback(channel):
    if channel == 7:
        readData()           ←★センサ用のコード

GPIO.setmode(GPIO.BCM)
GPIO.setup(7, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.add_event_detect(7, GPIO.RISING, callback=my_callback, bouncetime=200)

GPIO.setmode(GPIO.BCM)
GPIO.setup(7, GPIO.IN)

if __name__ == '__main__':     ←★センサ用のコード
    try:
        while True:
            sleep(0.01)

    except KeyboardInterrupt:
        pass

GPIO.cleanup()

 

 

これで、タクトスイッチを押したタイミングで温湿度が取得されました。やった~。

 

【失敗談】

はじめ1)ができた時点でよし!と思いセンサにつないだら、

タクトスイッチを押している間中継続してデータ取得してしまった。

(一回「カチッ」と押しただけのつもりなのにデータが20個くらいずらっとでてくる)

スイッチ押下をイベントとして捉えるためのコードが必要だとわかった。

 

※あくまでもきちんとした知識のない個人の記録です。

 色々変なところがあると思いますので薄目で見てください。