我有一个问题。我想用 ESP8266、霍尔传感器和 OLED 构建一个转速计。我使用Arduino IDLE来编程。这段代码的问题是只在循环中运行设置。它只显示 adafruit 的图标和设置中写入的欢迎信息。
// Complete Instructions: https://RandomNerdTutorials.com/esp8266-nodemcu-digital-inputs-outputs-arduino/
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>
#define i2c_Address 0x3c ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
#define SCREEN_WIDTH 128 //OLED WIDTH
#define SCREEN_HEIGHT 64 //OLED HEIGHT
#define OLED_RESET -1 // QT-PY / XIAO
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const int ir_pin = 12;
volatile unsigned int counter = 0;
unsigned long previousMillis = 0;
unsigned int rpm = 0;
void setup() {
pinMode(ir_pin, INPUT_PULLUP);
delay(250);
display.begin(i2c_Address, true);
display.display();
delay(1000);
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
display.setTextColor(SH110X_WHITE);
display.print("WELCOME: ");
display.display();
// Clear the buffer.
display.clearDisplay();
prueba();
}
void loop() {
unsigned long currentMillis = millis();
if(currentMillis - previousMillis >=1000){
detachInterrupt(digitalPinToInterrupt(ir_pin));
rpm = (counter)*60;
counter = 0;
attachInterrupt(digitalPinToInterrupt(ir_pin),IRinterrupt,RISING);
previousMillis = currentMillis;
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SH110X_WHITE);
display.setCursor(0, 10);
display.print("RPM: ");
display.println(rpm);
display.display();
delay(200);
}
}
void IRinterrupt(){
counter++;
}
我尝试使用中断来获取霍尔传感器信号并对其进行计数。但是我将代码加载到 ESP 并只重复 SETUP 部分,有人可以帮助我吗?
您使用的是ESP8266,请进行以下更改
ICACHE_RAM_ATTR
说明符添加到 IRinterrupt()
函数,以便它在 RAM 中运行。attachInterrupt(digitalPinToInterrupt(ir_pin),IRinterrupt,RISING);
中添加setup()
。detachInterrupt(digitalPinToInterrupt(ir_pin));
替换为noInterrupts();
,并将loop()中的attachInterrupt(digitalPinToInterrupt(ir_pin),IRinterrupt,RISING);
替换为interrupts()
。