首页 文章

为什么按下一个按钮触发处理程序

提问于
浏览
6

我在Raspberry Pi上运行Android Things 0.4 . 我正在遵循这个教程的信:

https://developer.android.com/things/training/first-device/peripherals.html

一旦我按下第一个按钮,我就决定在继续学习教程的led部分之前添加第二个按钮 . 我知道硬件设置对于第一个按钮是正确的,所以我在第二个按钮上复制了它,但由于某种原因我无法理解按钮的行为不符合预期 . 第一个按钮触发两个按钮的事件侦听器 . 第二个按钮将触发一个方向,并且在按下第二个按钮后按下第一个按钮之前不会再次触发 .

我是一位经验丰富的Android开发人员,但对IoT和Things来说却是新手 . 这是我的代码:

public class MainActivity extends Activity {
private static final String TAG = "ButtonActivity";
private static final String INC_BUTTON_PIN_NAME = "BCM4"; // GPIO port wired to the button
private static final String DEC_BUTTON_PIN_NAME = "BCM17"; // GPIO port wired to the button

private Gpio mIncButtonGpio;
private Gpio mDecButtonGpio;

Handler mHandler = new Handler(Looper.getMainLooper());

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    PeripheralManagerService service = new PeripheralManagerService();
    try {
        // Step 1. Create GPIO connection.
        mIncButtonGpio = service.openGpio(INC_BUTTON_PIN_NAME);
        mDecButtonGpio = service.openGpio(DEC_BUTTON_PIN_NAME);
        // Step 2. Configure as an input.
        mIncButtonGpio.setDirection(Gpio.DIRECTION_IN);
        mDecButtonGpio.setDirection(Gpio.DIRECTION_IN);
        // Step 3. Enable edge trigger events.
        mIncButtonGpio.setEdgeTriggerType(Gpio.EDGE_FALLING);
        mDecButtonGpio.setEdgeTriggerType(Gpio.EDGE_FALLING);
        // Step 4. Register an event callback.
        mIncButtonGpio.registerGpioCallback(mIncCallback);
        mDecButtonGpio.registerGpioCallback(mDecCallback);
    } catch (IOException e) {
        Log.e(TAG, "Error on PeripheralIO API", e);
    }
}

// Step 4. Register an event callback.
private GpioCallback mIncCallback = new GpioCallback() {
    @Override
    public boolean onGpioEdge(Gpio gpio) {
        Log.i(TAG, "GPIO changed, INC button pressed");

        // Step 5. Return true to keep callback active.
        return true;
    }
};

private GpioCallback mDecCallback = new GpioCallback() {
    @Override
    public boolean onGpioEdge(Gpio gpio) {
        Log.i(TAG, "GPIO changed, DEC button pressed");

        // Step 5. Return true to keep callback active.
        return true;
    }
};

@Override
protected void onDestroy() {
    super.onDestroy();

    // Step 6. Close the resource
    if (mIncButtonGpio != null) {
        mIncButtonGpio.unregisterGpioCallback(mIncCallback);
        try {
            mIncButtonGpio.close();
        } catch (IOException e) {
            Log.e(TAG, "Error on PeripheralIO API", e);
        }
    }
    if (mDecButtonGpio != null) {
        mDecButtonGpio.unregisterGpioCallback(mDecCallback);
        try {
            mDecButtonGpio.close();
        } catch (IOException e) {
            Log.e(TAG, "Error on PeripheralIO API", e);
        }
    }
}
}

Hardware Config
按下第一个按钮1次后,这是我的logcat:

06-09 14:33:21.717 1393-1393/com.maddesa.iottest I/ButtonActivity: GPIO changed, INC button pressed
06-09 14:33:21.718 1393-1393/com.maddesa.iottest I/ButtonActivity: GPIO changed, DEC button pressed

这是在第一个按下第二个按钮之后:

06-09 14:33:21.717 1393-1393/com.maddesa.iottest I/ButtonActivity: GPIO changed, INC button pressed
06-09 14:33:21.718 1393-1393/com.maddesa.iottest I/ButtonActivity: GPIO changed, DEC button pressed
06-09 14:33:58.047 1393-1393/com.maddesa.iottest I/ButtonActivity: GPIO changed, DEC button pressed

如果我按下第一个按钮,然后按第二个按钮,然后再次按第一个按钮,它就是这样的样子:

06-09 14:39:06.804 1393-1393/com.maddesa.iottest I/ButtonActivity: GPIO changed, INC button pressed
06-09 14:39:06.804 1393-1393/com.maddesa.iottest I/ButtonActivity: GPIO changed, DEC button pressed
06-09 14:39:08.846 1393-1393/com.maddesa.iottest I/ButtonActivity: GPIO changed, DEC button pressed
06-09 14:39:11.377 1393-1393/com.maddesa.iottest I/ButtonActivity: GPIO changed, INC button pressed
06-09 14:39:11.377 1393-1393/com.maddesa.iottest I/ButtonActivity: GPIO changed, DEC button pressed
06-09 14:39:11.510 1393-1393/com.maddesa.iottest I/ButtonActivity: GPIO changed, INC button pressed
06-09 14:39:11.510 1393-1393/com.maddesa.iottest I/ButtonActivity: GPIO changed, DEC button pressed

就像我说的我对物联网和物联网的新手一样,但我只想拥有两个独立的按钮,这些按钮始终触发单独的处理程序 .

谢谢 .

3 回答

  • 1

    尝试为每个引脚启用上拉或添加物理上拉电阻 . 说在引脚和3.3V电源之间连接1K欧姆电阻 .

  • 0

    你需要在电线上放一些二极管,以防止信号向后传播 . 当您按下其中一个按钮时,地面会短按另一个按钮 .

    See this diagram

    按下顶部按钮时,电流将从地线(红线)向下到达向下按钮的白线 . 从白色通过电阻,然后通过橙色线回到你的gpio 7 .

  • 0

    这可能是因为RPi输入接收到代码拾取的噪声高/低 . 似乎你需要去抖动电路(至少RC像this来自Official Documentationtutorial) . 或者尝试将按钮连接到单独的直流电源(一个用于3.3V,另一个用于5V) . 另请参阅this讨论 . 可能需要调整上拉电阻值 . 并尝试使用下拉(不是上拉)的原理图,如here .

相关问题