ESP32 中断连接到 MCP23017 的问题

问题描述

我遇到了一个问题,我已经好几个月没能解决了。我正在尝试管理灯光,我想用 8 个按钮控制 8 个继电器,系统工作但使用中断我无法稳定程序。

所以,如果我反复按下按钮,草图就会停止,也许问题是我使用 IRAM 的方式错误,配置如下:ESP32 与 I2C 和 MCP23017 连接,在草图下,有人能告诉我我在做什么吗错了吗?

#include <Wire.h>
#include "Adafruit_MCP23017.h"
#include <SPI.h>

byte IntPin = 23; // collegare entrata interrupt mcp A------------------------
volatile boolean awakenByInterrupt = false;
static uint16_t ledState = 0;
boolean led_state[8];
byte pinLed[] = {7,6,5,4,3,2,1,0};
byte buttons[] = {8,9,10,11,12,13,14,15};
int i;
  
void IRAM_ATTR intCallBack() {
  awakenByInterrupt = true;
}
    
Adafruit_MCP23017 mcp;
    
void setup() {
  Serial.begin(115200);
  mcp.begin();
  pinMode(IntPin,INPUT);
  for (i = 0; i < (8); i++) {
    mcp.pinMode(buttons[i],INPUT);
    mcp.pinMode(pinLed[i],OUTPUT);
    mcp.pullUp(buttons[i],HIGH); //------------------- da valutare
    mcp.digitalWrite(pinLed[i],LOW);
    led_state[i] = false;
    mcp.setupInterruptPin(buttons[i],RISING);
  }
  mcp.readGPIOAB();
  mcp.setupInterrupts(true,false,LOW);
  attachInterrupt(digitalPinToInterrupt(IntPin),intCallBack,FALLING);
}
    
void handleInterrupt() { // gestione pulsanti da interrupt************************************************************************************
  uint8_t pin = mcp.getLastInterruptPin();
  //uint8_t val = mcp.getLastInterruptPinValue();
  led_state[pin - 8] = ! led_state[pin - 8];
  if (led_state[pin - 8]) 
    mcp.digitalWrite(pinLed[pin - 8],HIGH);
  else 
    mcp.digitalWrite(pinLed[pin - 8],LOW);

  while (!(!mcp.digitalRead(buttons[0]) && ! mcp.digitalRead(buttons[1]) &&  !mcp.digitalRead(buttons[2]) && !mcp.digitalRead(buttons[3]) && !mcp.digitalRead(buttons[4]) && !mcp.digitalRead(buttons[5]) && !mcp.digitalRead(buttons[6]) && !mcp.digitalRead(buttons[7])));
  mcp.readGPIOAB();
  awakenByInterrupt = false;
}
   
void loop() {
  if (awakenByInterrupt)
    handleInterrupt();
}

解决方法

试试这个:

改变: while (!(!mcp.digitalRead(buttons[0]) && ! mcp.digitalRead(buttons[1]) && !mcp.digitalRead(buttons[2]) && !mcp.digitalRead(buttons[3]) && !mcp.digitalRead(buttons[4]) && !mcp.digitalRead(buttons[5]) && !mcp.digitalRead(buttons[6]) && !mcp.digitalRead(buttons[7]))); mcp.readGPIOAB();

与: while (!(mcp.digitalRead(buttons[0]) && mcp.digitalRead(buttons[1]) && mcp.digitalRead(buttons[2]) && mcp.digitalRead(buttons[3]) && mcp.digitalRead(buttons[4]) && mcp.digitalRead(buttons[5]) && mcp.digitalRead(buttons[6]) && mcp.digitalRead(buttons[7])));