连接到MCP23017的ESP32中断问题



我有一个问题,我已经几个月没能摆脱它了。我试图管理灯,我想用8个按钮控制8个继电器,系统工作,但使用中断我不能稳定程序。

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

#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])));

最新更新