Exception using interrupt...
Posted: Mon Aug 24, 2020 6:46 am
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:
The errors are here:
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
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ã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 all
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 ---------------
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