Page 1 of 1

analogRead(pin) as part of an Interrupt Service Routine

Posted: Fri Dec 03, 2021 4:01 am
by alex94364832
Hello, I have a question about if it is possible to trigger an interrupt and subsequently do an analogRead on that pin?
I have 6 buttons attached with a number of resistors to analog pin 36 of the ESP32 so that I can attach multiple buttons on the same analog pin. (Like in this example: https://www.youtube.com/watch?v=Y23vMfynUJ0)

The output is nothing, except for the button that has no resistor value (the first one) in the array. However, it only prints two 1s in the serial output.

I think the problem is that "attachInterrupt(digitalPinToInterrupt(BTNS), isrbuttons, CHANGE" is expecting a change. Going from fully High to fully Low or the other way around. I was hoping it would trigger when there was any change. However, this wouldn't explain why it only prints two values in the serial output.

I would highly appreciate any suggestions on achieving something similar to what I'm trying to do below!
Alex

The code I am running now looks like this:

Code: Select all

#define BTNS 36

volatile bool iButtons = false;

void IRAM_ATTR isrbuttons()
{
    iButtons = true;
}

int8_t FuncButtonAnalogueRead()
{
    iButtons = false;
    int16_t JButRead = analogRead(BTNS);
    if (JButRead > 3500 < 4500)
    {
        return 1;
    }
    if (JButRead > 1600 < 3500)
    {
        return 2;
    }    
    if (JButRead > 1000 < 1600)
    {
        return 3;
    }
    if (JButRead > 700 < 1000)
    {
        return 4;
    }
    if (JButRead > 600 < 700)
    {
        return 5;
    }
    if (JButRead > 450 < 600)
    {
        return 6;
    }
}

void setup()
{
    Serial.begin(115200);
    
    pinMode(BTNS, INPUT);
    attachInterrupt(digitalPinToInterrupt(BTNS), isrbuttons, CHANGE);
}

void loop()
{
    if (iButtons)
    {
        int8_t ENButton = FuncButtonAnalogueRead();
        Serial.println(ENButton);
    }
}

Re: analogRead(pin) as part of an Interrupt Service Routine

Posted: Tue Dec 07, 2021 3:13 am
by rodmcm
Yes you are correct, the button is defined as an input but you are using it as an analog input, it will not change state with the resistor network attached

Why not just sample the input as an analog and then invoke FuncButtonAnalogRead( int16-t AnalogIn)


If you have too much code in the loop ( in you final program) then set up a time trigger to read