// Pill dispenser // Inspired by article "Blink Without Delay" // https://docs.arduino.cc/built-in-examples/digital/BlinkWithoutDelay // Inspired by basic usage documentation of GEM library // https://github.com/Spirik/GEM #include #include const int longpress_duration = 2000; // time in milliseconds // use built-in buttons and LEDs when possible #if defined(ESP32) // dirty hack: assume that any ESP32 board is a Lilygo T5 V2.2 #define LILYGO_T5_V22 #include "boards.h" // source: https://github.com/lewisxhe/GxEPD/blob/master/src/boards.h const byte BUTTON_PIN_MOVE = BUTTON_1; const byte BUTTON_PIN_SELECT = BUTTON_2; BlinkControl led(LED_PIN); #else const byte BUTTON_PIN_MOVE = 2; const byte BUTTON_PIN_SELECT = 3; BlinkControl led(LED_BUILTIN); // pin 13 is built-in LED on many Arduino boards #endif // serial port speed #define BAUDRATE 115200 EasyButton button_move(BUTTON_PIN_MOVE); EasyButton button_select(BUTTON_PIN_SELECT); void setup() { Serial.begin(BAUDRATE); while (!Serial) { ; } Serial.println(); button_move.begin(); button_select.begin(); button_move.onPressed(onButtonMovePressed); button_move.onPressedFor(longpress_duration, onButtonMoveLongpressed); button_select.onPressed(onButtonSelectPressed); led.begin(); led.breathe(2000); } void loop() { led.loop(); button_move.read(); button_select.read(); } #if (ESP32) IRAM_ATTR // avoid crash e.g. when other code reads SD card #endif void onButtonMovePressed() { Serial.println("button MOVE clicked"); led.blink2(); } #if (ESP32) IRAM_ATTR // avoid crash e.g. when other code reads SD card #endif void onButtonMoveLongpressed() { Serial.println("button MOVE long-clicked"); led.off(); } #if (ESP32) IRAM_ATTR // avoid crash e.g. when other code reads SD card #endif void onButtonSelectPressed() { Serial.println("button SELECT clicked"); led.on(); }