見出し画像

Raspberry Pi Pico WでTWSNMPシリーズのセンサーを作る練習:アナログの調整と マルチタスクの回避

今朝も5時から開発開始です。
昨日失敗した音声センサー

に再チャレンジです。
昨日の押しボタンスイッチのかわりに、このセンサーのデジタル出力の値を読み取るようにしてみました。

i = 0
while True:
    led.toggle()
    utime.sleep(1)
    if ado.value() == 1:
        print("H")
    else:
        print("L")

最初は、ずっとHが出力されていました。配線を変えればLも出力されるのでプログラムの問題ではないようです。
そこでこのセンサーを使った先人の知恵を探してみました。ありました。

どうやら

赤い矢印のボリュームも回して調整する必要があることがわかりました。
ここで、助手の猫が天から一言
「アナログな調整はデジタル庁にはできないぞ!」
とのことです。よくわかりませんが、本当に大丈夫かと思うぐらい沢山反時計回りに回すと店頭していたLED2が消えて、読み取る値もLになりました。
微妙な調整をすると音を出した時にLED2が点滅するようになりました。

しかし、ここで問題を発見しました。微妙に音声を検知する状態だと昨日のプログラムでは検知できません。Lのままです。
なぜかと思ってソースコードを読むと1秒に1回しかセンサーの値を読んでいないからでした。もっと短い間隔で値を読まないといけません。
GO言語での開発に慣れていると並列処理で解決することが思い浮かびました。MicroPythonに並列処理があるか、調べて見るとありました。

でも、実験段階です。他に方法がないか調べると

というのがありました。どちらも難しそうです。
ここで、助手の猫が一言、
難しい方法よりも簡単な方法で解決できたほうが幸せになれる。
とのことです。そう思います。
そこで、1秒のSleepを分解して1/1000秒のSleepと音声センサーの処理1000回にしてみました。
今朝のコードは、

import machine
import utime
import socket
import network
import ntptime
import config

# get LED port
led = machine.Pin("LED", machine.Pin.OUT)
# Audio Sensor DO
ado = machine.Pin("GP0", machine.Pin.IN,machine.Pin.PULL_DOWN)
# Audio Sensor AO
aao = machine.ADC(28)
#connect wifi
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(config.ssid,config.password)

# wait wifi connect
while wlan.status() != 3:
    led.toggle()
    utime.sleep_ms(200)

# setup clock by ntp
ntptime.settime()

#make syslog socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sensor_temp = machine.ADC(4)
conversion_factor = 3.3 / (65535)

i = 0
adoSum = 0
aaoSum = 0.0
count = 0
while True:
    led.toggle()
    for j in range(1000):
        if ado.value() == 1:
            adoSum+=1
            print("adoSum=%d" % (adoSum))
        aaoSum += aao.read_u16() * conversion_factor
        utime.sleep_ms(1)
    count+=1
    if i % (60 * config.interval) == 0:
        reading = sensor_temp.read_u16() * conversion_factor
        temp = 27 - (reading - 0.706)/0.001721
        now =utime.gmtime()
        ts = "%d-%02d-%02dT%02d:%02d:%02d+00:00" %(now[0],now[1],now[2],now[3],now[4],now[5])
        status = wlan.ifconfig()
        syslog = b"<%d>%s %s twRPPico: temp=%.2f,ado=%d,aao=%.2f" % (21*8+6,ts,status[0],temp,adoSum,aaoSum/(1000*count))
        print(syslog)
        for dst in config.syslog_dst:
            s.sendto(syslog,(dst,514))
        adoSum =0
        aaoSum =0.0
        count = 0
    i+=1

    

です。1秒間に1000回、センサーの値を読んでHの値をカウントしています。
アナログのデータも

を参考にして処理できるようにしました。
早朝で、かみさんが寝ているので、大きな音を出してテストできませんが、
コヒーカップを置いた時などは、センサーが反応しています。

TWSNMP FCからも確認できます。

アナログのデータが正しいのか、ちょっと心配ですが、時間切れです。

明日に続く

開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。