问题描述
我遇到了一个问题,我已经好几个月没能解决了。我正在尝试管理灯光,我想用 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])));