本文介绍了使用Android Things通过DHT11读取温度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Raspberry pi3和DHT11传感器进行温度监控项目.我有以下销钉位置

I am using Raspberry pi3 and DHT11 sensor for temperature monitoring project.I have following pin positions

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

VCC to pin no : 2Ground to pin no : 6Output to GPIO : BCM22 i.e pin no 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);
    }
}

上面的代码给我什么也没做"作为输出.

Above code is giving me "Nothing is working" as output.

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

Any suggestion where I might be doing wrong?

推荐答案

您无法从 DHT11 ,因为DHT11响应脉冲的持续时间从26-28 us到70 us,但是带有AT GPIO的RP3的最大频率大约为3kHz,这意味着大约300 us脉冲期间.看看这个问题的答案.

You can't read data from DHT11 using Raspberry Pi 3 with Android Things because duration of DHT11 response pulses is from 26-28 us to 70 us, but max frequency of RP3 with AT GPIO is around 3kHz, which means around 300 us pulse duration. Take a look at answers to this question.

这篇关于使用Android Things通过DHT11读取温度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-01 18:06