LoginSignup

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

ラズパイを用いてLED点灯をタイマーセッティングを行い自動消灯させたい

ラズパイでLEDを点灯させて、指定の時間後に自動消灯を行うプログラムが作りたいです。

考えたプログラムの内容は、

if文をつかい、現在時刻より小さい場合は点灯する。それ以外は消灯する。

script.py
def loop():

    if  time.time.now() > time.time.now() + 2:
        LED点灯 

    else:
        LED消灯

2秒後に停止させるつもりで記述しましたが、消灯しませんでした。

有識者の方、どこが行けないのかご指摘いただけると幸いです

よろしくお願いいたします

0

4Answer

ラズパイを触ったことがありませんが、プログラムの観点からの回答になりますが、

time_that = time.time.now()
def loop():
    if  time.time.now() < time_that + 2:
        LED点灯 
    else:
        LED消灯

これで動くと思います。time_thatに実行時の時刻を入れておき、loop()内を監視して2秒後になったときにif文がFalseとなり、else文が実行されると思います。
実行時の時刻をloop()関数の外で変数を定義しておくと良いと思います。

0

ご回答ありがとうございます!

関数の外で変数を定義することをグローバル関数というやつでしょうか。

関数の外で変数を定義すると、エラーがおこってしまいます。

ラズパイでwebiopiを通して、遠隔でオンオフさせるようにやっているのですが、webiopi特有のなにかがあるのかもしれませんね。

0

そうです。グローバル変数を使って外部で定義してその変数と今の時刻を比較する方法を考えたのですが、ここのサイトに似たような例があったのですがどうでしょうか。
https://deviceplus.jp/hobby/raspberrypi_entry_031/
このサイトの1つ目のコード8、9行目の

HOUR_ON  = 8  # Turn Light ON at 08:00
HOUR_OFF = 18 # Turn Light OFF at 18:00

があり、ここの箇所とif文内を使うフォーマットに合わせて調整するとできるかも知れないです。ただ、このコードもグローバル変数を使っていますね。

0

Comments

  1. @morita05041984

    Questioner
    ご返答ありがとうございます。

    ```
    import webiopi
    import datetime
    import time

    GPIO = webiopi.GPIO

    LIGHT = 17 # GPIO pin using BCM numbering

    HOUR_ON = time.time.now() # Turn Light ON at 08:00
    HOUR_OFF = 18 # Turn Light OFF at 18:00

    # setup function is automatically called at WebIOPi startup
    def setup():
    # set the GPIO used by the light to output
    GPIO.setFunction(LIGHT, GPIO.OUT)

    # retrieve current datetime
    now = datetime.datetime.now()

    # test if we are between ON time and tun the light ON
    if ((now.hour >= HOUR_ON) and (now.hour < HOUR_OFF)):
    GPIO.digitalWrite(LIGHT, GPIO.HIGH)

    # loop function is repeatedly called by WebIOPi
    def loop():
    if time.time.now() < HOUR_ON + 2:
    GPIO.digitalWrite(LIGHT, GPIO.HIGH)
    else:
    GPIO.digitalWrite(LIGHT, GPIO.LOW)


    # gives CPU some time before looping again
    webiopi.sleep(1)

    # destroy function is called at WebIOPi shutdown
    def destroy():
    GPIO.digitalWrite(LIGHT, GPIO.LOW)
    ```
    色々チャレンジしましたが、迷走してます。
    このようなヘンテコなプログラムにいきついてしまいました。

  2. @morita05041984

    Questioner
    グローバル変数に time.time.now()現在時刻を代入すると、どうしてもうまくいかないんですよね。ここがなんかおかしいです
  3. @morita05041984

    Questioner
    ありがとうございます!timeモジュールは、time.time()こちらでした!

    これで一歩全身しましたが、狙っている挙動とは別な動きを見せました。

    def loop():
    if time.time() < time_that + 2:

    こちらなのですが、+2ですと2点滅

    +10にすると8回点滅という、点滅回数にあたり、点灯時間の制御になりました。

    自分でもこれから調べようと思いますが、お知恵がございましたら助けてください!


  4. webiopi.sleep(0.01)
    とすると、loop関数を監視する時間が細かくなります。おそらくwebiopi.sleepで止まっている間は、LEDを切る命令が送られているのでしょう。(ちなみに今は、webiopi.sleep(1)なので、1秒ごとにloop関数を監視することになります。)

グローバル変数を使って外部の定義してその変数と今の時刻を比較する方法は、

HOUR_ON = 8 /*は、8時に、ONにするってこと、*/
HOUr_OFF = 20 /*は、20時に、OFFにするってことです。*/

これらを、追記すると、ON OFFを、、自動的に、されます

0

Comments

  1. @morita05041984

    Questioner
    ご返答ありがとうございます。迷走していますががんばります。
  2. 頑張れー
    応援しています
    ファイト ファイト
  3. @morita05041984

    Questioner
    ありがとうございます!できたらご報告いたします

Your answer might help someone💌