OLED 1.3 inch repeat setup ESP8266

67 Views Asked by At

I have a problem. I want to build a RPM meter with ESP8266, hall sensor and OLED. I used Arduino IDLE to program. The problem with this code is that only runs the setup in loop. It only shows adafruit's icon an welcome that was written in setup.

// 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++;

}


I tried to use interruptions to get the hall sensor signal and count it. But I load the code to ESP and only repeat the SETUP part, could someone help me please?

1

There are 1 best solutions below

0
hcheung On

You are using ESP8266, do the following changes

  1. add ICACHE_RAM_ATTR specifier to the IRinterrupt() function so that it run in the RAM.
  2. add attachInterrupt(digitalPinToInterrupt(ir_pin),IRinterrupt,RISING); in the setup().
  3. replace detachInterrupt(digitalPinToInterrupt(ir_pin)); in the loop() with noInterrupts();, and replace attachInterrupt(digitalPinToInterrupt(ir_pin),IRinterrupt,RISING); in the loop() with interrupts().

ICACHE_RAM_ATTR void IRinterrupt(){
  counter++;

}

void setup() {
 // your setup code here
  
 attachInterrupt(digitalPinToInterrupt(ir_pin),IRinterrupt,RISING); 
}

void loop() {

  if(millis() - previousMillis >= 1000){

    noInterrupts();
    rpm = (counter)*60;
    counter = 0;
    interrupts();

    previousMillis = millis();
    //rest of display code

  }
    
}