android - 使用 Android Things 通过 DHT11 读取温度

标签 android sensors raspberry-pi3 android-things

我正在使用 Raspberry pi3 和 DHT11 传感器进行温度监测项目。 我有以下引脚位置

VCC 到引脚号:2 接地引脚号:6 输出到 GPIO:BCM22 即引脚 15

我用过的代码:

public class WeatherStationActivity extends Activity {

    private Handler mHandler = new Handler();
    private TextView mTxtStatus;

    private PeripheralManagerService service = new PeripheralManagerService();

    private Gpio tempGpio;

    private int i = 0;
    int[] dht11_dat = {0, 0, 0, 0, 0};


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("Weather station", "Started Weather Station");
        setContentView(R.layout.activity_main);
        mTxtStatus = (TextView) findViewById(R.id.txtStatus);
        try {
            tempGpio = service.openGpio("BCM22");
            Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    if (i == 10) {
                        handler.removeCallbacks(this);
                    } else {
                        getTemp();
                        handler.postDelayed(this, 5000);
                    }
                    i++;
                }
            }, 5000);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }


    private void getTemp() {
        boolean laststate = false;
        try {
            laststate = tempGpio.getValue();
        } catch (IOException e) {
            e.printStackTrace();
        }
        int j = 0;
        final int MAXTIMINGS = 85;

        dht11_dat[0] = dht11_dat[1] = dht11_dat[2] = dht11_dat[3] = dht11_dat[4] = 0;


        try {

            tempGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
//            tempGpio.setActiveType(Gpio.ACTIVE_LOW);
            tempGpio.setValue(false);
//            Thread.sleep(18);
            TimeUnit.MILLISECONDS.sleep(18);
//            tempGpio.setActiveType(Gpio.ACTIVE_HIGH);
//            tempGpio.setActiveType(Gpio.ACTIVE_HIGH);
            tempGpio.setValue(true);
            TimeUnit.MICROSECONDS.sleep(40);
            tempGpio.setDirection(Gpio.DIRECTION_IN);


           /* tempGpio.setActiveType(Gpio.ACTIVE_HIGH);
            tempGpio.setValue(true);*/
//            tempGpio.setValue(true);
            StringBuilder value = new StringBuilder();

            for (int i = 0; i < MAXTIMINGS; i++) {
                int counter = 0;
                while (tempGpio.getValue() == laststate) {
                    counter++;
                    TimeUnit.MICROSECONDS.sleep(1);
                    if (counter == 255) {
                        break;
                    }
                }
                laststate = tempGpio.getValue();
                mTxtStatus.append("\nLast State of Sensor " + laststate);
                if (counter == 255) {
                    break;
                }
                //* ignore first 3 transitions *//*
                if ((i >= 4) && (i % 2 == 0)) {
                    //* shove each bit into the storage bytes *//*
                    dht11_dat[j / 8] <<= 1;
                    if (counter > 16) {
                        dht11_dat[j / 8] |= 1;
                    }
                    j++;
                }
            }
            // check we read 40 bits (8bit x 5 ) + verify checksum in the last
            // byte
            if ((j >= 40) && checkParity()) {
                value.append(dht11_dat[2]).append(".").append(dht11_dat[3]);
                Log.i("Logger", "temperature value readed: " + value.toString());
                mTxtStatus.append("\nTemp " + value.toString());
            } else {
                mTxtStatus.append("\nNothing is working ");
                Log.i("Logger", "Nothing is working ");
            }

        } catch (IOException e) {

            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    private boolean checkParity() {
        return dht11_dat[4] == (dht11_dat[0] + dht11_dat[1] + dht11_dat[2] + dht11_dat[3] & 0xFF);
    }
}

上面的代码输出的是“Nothing is working”。

有什么我可能做错的建议吗?

最佳答案

您无法从 DHT11 中读取数据将 Raspberry Pi 3 与 Android Things 结合使用,因为 DHT11 响应脉冲的持续时间为 26-28 us 至 70 us,但带有 AT GPIO 的 RP3 的最大频率约为 3kHz,这意味着约 300 us 的脉冲持续时间。查看 this 的答案问题。

关于android - 使用 Android Things 通过 DHT11 读取温度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44778869/

相关文章:

Android:FragmentPagerAdapter:第一次调用两次 getItem 方法

android - 如何在 Android Studio 上创建 Renderscript 脚本并运行?

ios - 如何使用 iPhone 传感器数据计算 GPS DoP(精度因子)?

python-3.x - 使用命令 "ls -t | tail -n +4 | xargs rm --"删除另一个位置的文件

opencv - ROS Melodic & OpenCV - CompressedImage 不发布

android - 现代Android中的后台处理

java - 创建文件并将其写入 SD 卡...出现文件未找到异常

android - 如何知道我的 SensorManager 是否有已注册的传感器

c - 请向我描述以下代码如何读取传感器的输出

c# - 为什么我的异步方法不等待 "serialPort = await SerialDevice.FromIdAsync()"?