OLED 1.3英寸重复设置ESP8266

问题描述 投票:0回答:1

我有一个问题。我想用 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 部分,有人可以帮助我吗?

arduino esp8266 rpm
1个回答
0
投票

您使用的是ESP8266,请进行以下更改

  1. ICACHE_RAM_ATTR
    说明符添加到
    IRinterrupt()
    函数,以便它在 RAM 中运行。
  2. attachInterrupt(digitalPinToInterrupt(ir_pin),IRinterrupt,RISING);
    中添加
    setup()
  3. 将loop()中的
    detachInterrupt(digitalPinToInterrupt(ir_pin));
    替换为
    noInterrupts();
    ,并将loop()中的
    attachInterrupt(digitalPinToInterrupt(ir_pin),IRinterrupt,RISING);
    替换为
    interrupts()
© www.soinside.com 2019 - 2024. All rights reserved.