Buttons+gps+interrupts problem
-
Hello I have a problem while using gps module(M003) interrupts and buttons on Core 2
When i didn't use buttons everything was working but when i started to use buttons device is restarting with Guru Meditation Error: Core 1 panic'ed (Coprocessor exception)
For interrupt i use hall sensor connected to pin 21
There is also a problem when it finally didn't get Coprocessor exception click buton make interrupt stops working and i need to attach it again(as on button A). When i'm using M5.update() device resets after geting few falling signals from hall sensors and button click . I tried to use task pinned to core and move there button check but it didn't helped at all.
Here is my code :#include <M5Core2.h> #include <TinyGPS++.h> #define PIN 21 const int buttonPin = 2; float start, finished; float elapsed; float circMetric=2.093; // wheel circumference (in meters) float circImperial; // using 1 kilometer = 0.621371192 miles float speedk, speedm; // holds calculated speed vales in metric and imperial unsigned long currentMillis; const unsigned long period = 5000; //milliseconds unsigned long startMillis; // The TinyGPS++ object TinyGPSPlus gps; static void smartDelay(unsigned long ms) { unsigned long start = millis(); do { while (Serial2.available() > 0) gps.encode(Serial2.read()); } while (millis() - start < ms); M5.Lcd.clear(); } void displayInfo() { M5.Lcd.setCursor(0, 40, 4); M5.Lcd.print(F("Latitude: ")); if (gps.location.isValid()) { M5.Lcd.print(gps.location.lat(), 6); } else { M5.Lcd.print(F("INVALID")); } M5.Lcd.println(); M5.Lcd.print(F("Longitude: ")); if (gps.location.isValid()) { M5.Lcd.print(gps.location.lng(), 6); } else { M5.Lcd.print(F("INVALID")); } M5.Lcd.println(); M5.Lcd.print(F("Altitude: ")); if (gps.altitude.isValid()) { M5.Lcd.print(gps.altitude.meters()); } else { M5.Lcd.print(F("INVALID")); } M5.Lcd.println(); M5.Lcd.print(F("Satellites: ")); if (gps.satellites.isValid()) { M5.Lcd.print(gps.satellites.value()); } else { M5.Lcd.print(F("INVALID")); } M5.Lcd.println(); M5.Lcd.print(F("Speed h: ")); M5.Lcd.print(int(speedk)); M5.Lcd.println(); M5.Lcd.print(F("Speed: ")); if (gps.speed.isValid()) { M5.Lcd.print(gps.speed.kmph()); } else { M5.Lcd.print(F("INVALID")); } } void speedCalc() { //Function called by the interrupt if((millis()-start)>100) // 100 millisec debounce { //calculate elapsed elapsed=millis()-start; //reset start start=millis(); //calculate speed in km/h speedk=(3600*circMetric)/elapsed; //calculate speed in mph // speedm=(3600*circImperial)/elapsed; } } void setup() { pinMode(PIN, INPUT); M5.begin(true, true, true, false, kMBusModeInput); Serial2.begin(9600, SERIAL_8N1, 13, 14); M5.Lcd.setTextColor(GREEN, BLACK); attachInterrupt(digitalPinToInterrupt(PIN), speedCalc, FALLING); start=millis(); } void loop() { M5.Touch.update(); M5.Buttons.update(); displayInfo(); gps.encode(Serial2.read()); if(M5.BtnB.wasPressed()) { M5.Lcd.print(F("Change")); delay(100); } if(M5.BtnC.wasPressed()) { } if(M5.BtnA.wasPressed()) { M5.Lcd.print(("aaaa")); delay(1000); attachInterrupt(digitalPinToInterrupt(PIN), speedCalc, FALLING); } M5.Lcd.clear(); }