micro:bit / mbed / 温湿度センサーAM2302 (DHT22) / データパルスの長さを測る

長いパルスか短いパルスかが判別できればよいだけなので、ビジーウェイトを利用して、パルスがHの状態にあるときのループ回数を数えるだけにする。正確なパルス幅は測らない。

#include "MicroBit.h"
MicroBit uBit;

//MicroBitPin P0 = uBit.io.pin[0];
MicroBitPin P0 = uBit.io.P0;

int main(void){
    uBit.init();
    
    // スタートシーケンスを開始する。 
    P0.setDigitalValue(1);// P0を一旦Hにしてから、
    P0.setDigitalValue(0);// P0をLにして、
    uBit.sleep(1);        // Lの状態を0.8~20ミリ秒間保ってから、
    P0.getDigitalValue(); // P0のIOをINに(Hi-Zに)切り替える。バスはプルアップされているのでHになる。
    
    while(P0.getDigitalValue() == 1){} // バスがLになるのを待って、
    
    // スタートビットも含めて全部で41ビットのHパルスの持続時間(ループ回数)を取得する。
    int buf[41];
    for(int j=0; j<41; j++){
        while(P0.getDigitalValue()==0){} // バスがHになるのを待って、
        
        int i;
        for(i=1; i<256; i++){
            if(P0.getDigitalValue()==0){break;}
        }
        buf[j] = i; // Hの持続時間(ループ回数)を配列に格納する。
    }
    
    for(int j=0;j<41;j++){
        printf("%d: %d\n", j, buf[j]); // 確認する。
    }
    
}

短いパルスが大体5~7、長いパルスが大体18~19であった。
f:id:ti-nspire:20181112131459p:plain