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?
You are using ESP8266, do the following changes
ICACHE_RAM_ATTRspecifier to theIRinterrupt()function so that it run in the RAM.attachInterrupt(digitalPinToInterrupt(ir_pin),IRinterrupt,RISING);in thesetup().detachInterrupt(digitalPinToInterrupt(ir_pin));in the loop() withnoInterrupts();, and replaceattachInterrupt(digitalPinToInterrupt(ir_pin),IRinterrupt,RISING);in the loop() withinterrupts().