diff --git a/src/main.cpp b/src/main.cpp index 3c3c7e9..a0f2401 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,5 @@ #include #include -#include "Button2.h" #define BUZZER_PIN 5 #define BUZZER_CHANNEL 0 @@ -10,6 +9,7 @@ const uint8_t DotDataPin = 14; #define colorSaturation 128 #define MAX_ITER 2000000 +#define IMPULS 400 //400 ms impuls minimal // for software bit bang NeoPixelBus strip(PixelCount, DotDataPin); // for hardware SPI (best performance but must use hardware pins) @@ -58,19 +58,17 @@ static RgbColor LEDoffColor; RgbColor rgbArray[] = {red, blue, green, white}; -#define BELL_PIN 12 // Pin 12 as default -#define MINIMAL_GAP 30*1000 // 30 seconds between rings -#define IMPULS 500 // minimal press of button - const byte interruptPin = 17; +volatile int interruptCounter = 0; +int numberOfInterrupts = 0; -unsigned long last_low = 0; // time of uptime -unsigned long last_high = 0; -unsigned long last_sended = 0; +unsigned long one,zero; bool run; TaskHandle_t Task1; -Button2 buttonBELL = Button2(17,INPUT_PULLDOWN,false,100U); + + +portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED; void LCD_snake() { @@ -103,6 +101,7 @@ void LCD_blink_color() } void beep(void * pvParameters) { + Serial.println("Piezo core 2..."); for (;;) { if (run) { tone(BUZZER_PIN, NOTE_C4, 500, BUZZER_CHANNEL); @@ -124,32 +123,16 @@ void beep(void * pvParameters) { delay(100); } } + +void IRAM_ATTR handleInterrupt() { -void change(Button2& btn) { - Serial.println("CHANGE"); - if (btn.isPressed()) { - unsigned long pressed = millis() - last_high; + portENTER_CRITICAL_ISR(&mux); - if (last_high == 0) return; - - Serial.print("released: "); - Serial.println(pressed); - - if (pressed < IMPULS) { - Serial.println("Interval too low"); - return; - } - - if (millis() - last_sended < MINIMAL_GAP) { - Serial.println("Minimal gap not meeted"); - return; - } - - run = true; - last_sended = millis(); - } else { - last_high = millis(); - } + if (digitalRead(interruptPin) == HIGH) zero = millis(); + if (digitalRead(interruptPin) == LOW) one = millis(); + + interruptCounter++; + portEXIT_CRITICAL_ISR(&mux); } void setup() { @@ -161,8 +144,11 @@ void setup() { strip.ClearTo(black); strip.Show(); - Serial.println("Monitoring:"); - buttonBELL.setChangedHandler(change); + one = zero = millis(); + + Serial.println("Monitoring interrupts: "); + pinMode(interruptPin, INPUT_PULLUP); + attachInterrupt(digitalPinToInterrupt(interruptPin), handleInterrupt, CHANGE); xTaskCreatePinnedToCore( beep, /* Task function. */ @@ -177,7 +163,24 @@ void setup() { void loop() { - buttonBELL.loop(); + if(interruptCounter>0){ + + portENTER_CRITICAL(&mux); + interruptCounter--; + portEXIT_CRITICAL(&mux); + + numberOfInterrupts++; + Serial.print("An interrupt has occurred. Total: "); + Serial.println(numberOfInterrupts); - if (run) LCD_snake(); + if (zero > one && zero - one > IMPULS) { + run = true; + zero = one = 0; + } + else run = false; + + if (run) LCD_snake(); + + } + delay(100); } \ No newline at end of file