-->
Page 1 of 1

Exception using interrupt...

PostPosted: Mon Aug 24, 2020 6:46 am
by Miklux
Hi all, I'm new to the ESP8266 and maybe I have some problem with it...
I'm trying to use a sketch that permits the counting of liters of water and show the informations via an HTTP protocol.

I founded this example in internet but for me it doesn't work:
Code: Select all/*Below I show the code relative to the first example, commented in order to understand the purpose of each part.

Note: When I refer to “rise ups”, I mean that when the pulse from the flowmeter goes from LOW to HIGH, each “rise up” it's accounted and stored in a variable.

There is some libraries not so common that I describe below:
→ EEPROM.h allows the use of read/write functions of the EEPROM in the NodeMcu.
→ ESP8266Wifi.h gives the possibility of using the wifi functionality (from the ESP8266 module that comes embebbed in the NodeMcu). With this library it's possible to connect through wifi to the local network, it's very usefull in a project where the main objectiv is to have a sensor connected to the network, and remotely accessing it.
→ ESP8266HTTPCLIENT.H  open the door for the possibility of making requests to the HTTP servers.*/

#include <Arduino.h>
#include <EEPROM.h>
#define USE_SERIAL Serial
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

  // Variable init
  const int  buttonPin = D2; // variable for D2 pin
  int contagem = 0;   // variable to store the “rise ups” from the flowmeter pulses
  int litros = 0;
  char thingspeak_string[200]; //string used to send info to the server ThingSpeak
  char litros_string[10]="0";
  int addr = 0; //endereço eeprom

  //SSID and PASSWORD for the AP (swap the XXXXX for real ssid and password )
  const char* ssid = "HereIam";
  const char* password = "MyAP1971";

  //HTTP client init
  HTTPClient http;
 
  //Webserver init
  WiFiServer server(80);

  //Interrupt function, so that the counting of pulse “rise ups” dont interfere with the rest of the code  (attachInterrupt)
  void pin_ISR()
  {   
      contagem++;
  }

void setup() {
   // Serial Comunication init
   Serial.begin(115200);
   delay(10);

   // EEPROM access init
   EEPROM.begin(1);
   litros=EEPROM.read(addr);


   // Initialization of the variable “buttonPin” as INPUT (D2 pin)
   pinMode(buttonPin, INPUT);
   
   // Wifi connection init
   Serial.println();
   Serial.print("A iniciar ligação...");
   Serial.println();
   WiFi.begin(ssid, password);

  //Waiting for the connection to be established
   Serial.print("Waiting for the connection...");
   while (WiFi.status() != WL_CONNECTED)
    {
      delay(2000);
      Serial.print(".");

      if(WiFi.status() == WL_CONNECTED)
      {
        Serial.println();
        Serial.printf("Connect to the SSID: %s",ssid);
      }
    }

    /***********************/
    // Starting Webserver
    server.begin();
    Serial.println();
    Serial.println();
    Serial.println("Server started");
   
    // Print the IP address
    Serial.print("Use this URL to connect: ");
    Serial.print("http://");
    Serial.print(WiFi.localIP());
    Serial.println("/");
    Serial.println();
    Serial.print("A iniciar contagem dos litros...");
   
  // Attach an interrupt to the ISR vector
  attachInterrupt(digitalPinToInterrupt(buttonPin), pin_ISR, RISING);

  Serial.println();
  Serial.print("Waiting for client....");
  Serial.println();
}


void loop() {
 
  // Verify if a clients is connected to the server
  WiFiClient client = server.available();
       
  // Reply from the local http server, and constrution of the page “on the fly”
      client.println("HTTP/1.1 200 OK");
      client.println("Content-Type: text/html");
      client.println("Connection: keep-alive");
      client.println(""); //  do not forget this one
      client.println("<!DOCTYPE HTML>");
      client.println("<html>");
      client.println("<head><meta http-equiv=\"refresh\" content=\"10\" >");
      client.println("<script type='text/javascript'>");
      client.println("function loadDoc() {");
      client.println("var xhttp = new XMLHttpRequest();");
      client.println("xhttp.onreadystatechange = function() {");
      client.println("if (xhttp.readyState == 4 && xhttp.status == 200) {");
      client.printf("document.getElementById('id_litros').innerHTML = %d",litros);
      client.println("}");
      client.println("};");
      client.println("xhttp.open('GET', '', true);");
      client.println("xhttp.send();");
      client.println("}");
      client.println("</script></head>");
      client.println("<body onload='setInterval(loadDoc, 5000);'>");
      client.println("<br/><br/>");
      client.printf("<div id='id_litros'>Est&atilde;o contados %d litros!</div>",litros);
      client.println("<iframe width=\"450\" height=\"260\" style=\"border: 1px solid #cccccc;\" src=\"https://thingspeak.com/channels/120470/charts/1?bgcolor=%23ffffff&color=%23d62020&dynamic=true&results=60&title=Contagem+de+Litros&type=line\"></iframe>");
      client.println("</body>");
      client.println("</html>");
      client.stop();
     
      delay(1);

  // If the counting of transitions (Low to High, “rise ups”) it's higher than 440, count one litre more. Then do the rest of the functions (update to EEPROM variable, loca  webserver and ThingSpeak)
  //pulse per litre +/- 450 "www.hobbytronics.co.uk/yf-s201-water-flow-meter"

  if(contagem > 440 )
  {
      litros++;
      Serial.println();
      Serial.print("Litros: ");
      Serial.print(litros);

      //Write the new litres value to the EEPROM and put “contagem” variable to zero
      EEPROM.write(addr, litros);
      EEPROM.commit();
      contagem = 0;

     //The value of litres is sent to the ThingSpeak server. It is needed to have an account in ThingSpeak server before using this funcionality. You will have to copy the link given (something like this:  https://api.thingspeak.com/update.json?api_key=XXX&field1=XXX), example below.
     dtostrf(litros, 4, 2, litros_string);
      sprintf(thingspeak_string,"https://api.thingspeak.com/update.json?api_key=UI9DXIOZPFW2NCST&field1=%s", litros_string);
      //String sent to ThingSpeak server.
      http.begin(thingspeak_string);

     //Send HTTP Header
      int httpCode = http.GET();

      // httpCode_code will be a negative number if there is an error
      if(httpCode > 0) {
          // file found at server
          if(httpCode == HTTP_CODE_OK) {
              String payload = http.getString();
              Serial.print(" ");
              Serial.println(payload);
          }
      } else {
          Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
      }
      http.end();
     
  }//stop counting

  delay(500);
}


The errors are here:
Code: Select allConnect to the SSID: HereIam

Server started
Use this URL to connect: http://192.168.5.152/

A iniciar contagem dos litros...ISR not in IRAM!

User exception (panic/abort/assert)
--------------- CUT HERE FOR EXCEPTION DECODER ---------------

Abort called

>>>stack>>>

ctx: cont
sp: 3ffffee0 end: 3fffffc0 offset: 0000
3ffffee0:  2e547800 fe2e9351 3ffee798 40218880 
3ffffef0:  000000fe 00000000 00000000 00000000 
3fffff00:  00000000 00000000 00000000 00ff0000 
3fffff10:  5ffffe00 5ffffe00 0a0d0304 00000000 
3fffff20:  00000001 00000004 3ffee970 402062d2 
3fffff30:  40100476 00000003 0000000a 402062e4 
3fffff40:  4020438c 3ffee970 3ffee970 402067f1 
3fffff50:  00000000 3ffee970 3ffe869a 40204398 
3fffff60:  4020438c 3ffee970 3ffe869a 3ffeeaa0 
3fffff70:  3ffee92c 3ffe84d0 3ffee970 402068a0 
3fffff80:  3ffee92c 3ffe84d0 3ffee970 40201172 
3fffff90:  40208210 9805a8c0 feefeffe feefeffe 
3fffffa0:  3fffdad0 00000000 3ffeea60 40205c58 
3fffffb0:  feefeffe feefeffe 3ffe84f4 40100d71 
<<<stack<<<

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

 ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 3584, room 16
tail 0
chksum 0xb0
csum 0xb0
v2843a5ac
~ld

A iniciar ligação...
Waiting for the connection....
Connect to the SSID: HereIam

Server started
Use this URL to connect: http://192.168.5.152/

A iniciar contagem dos litros...ISR not in IRAM!

User exception (panic/abort/assert)
--------------- CUT HERE FOR EXCEPTION DECODER ---------------


Someone could help me?
Some time ago i create something similar but it was working fine, but now it's not... the same error...
I'm using the Arduino IDE 1.8.12

Thanks in advance
Mik