Add button press handle, added print time calc

This commit is contained in:
Tomislav Kopić 2024-11-01 20:08:12 +01:00
parent d3d74938d3
commit 3299c3d66a
4 changed files with 142 additions and 46 deletions

View File

@ -4,6 +4,9 @@
#include <Adafruit_SSD1306.h>
#include <ESP8266WiFi.h>
void playTune(int tuneNumber);
void beep();
unsigned long middle_long_press_started = 0;
unsigned long right_long_press_started = 0;
bool is_display_off = false;
@ -38,10 +41,9 @@ void initSystems() {
// Connect to WiFi
void connectToWifi() {
Serial.println("Connecting to WiFi...");
display.clearDisplay();
display.setCursor(0, 0);
display.print("Connecting to WiFi...");
display.println("Connecting to WiFi");
display.display();
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
@ -49,7 +51,6 @@ void connectToWifi() {
int attemptCount = 0;
while (WiFi.status() != WL_CONNECTED && attemptCount < 20) { // Timeout after 20 attempts
delay(500);
Serial.print(".");
display.print(".");
display.display();
attemptCount++;
@ -69,6 +70,7 @@ void connectToWifi() {
display.print("IP: ");
display.print(WiFi.localIP());
display.display();
playTune(2);
} else {
Serial.println("\nFailed to connect to WiFi.");
display.clearDisplay();
@ -82,32 +84,96 @@ void connectToWifi() {
}
void commonButtonHandler() {
unsigned long currentMillis = millis();
bool middleLeftPressed = (digitalRead(PIN_BTN_M) == HIGH) && (digitalRead(PIN_BTN_L) == HIGH);
static unsigned long leftPressStart = 0;
static unsigned long middlePressStart = 0;
static unsigned long rightPressStart = 0;
static bool leftBeeped = false;
static bool middleBeeped = false;
static bool rightBeeped = false;
bool leftPressed = (digitalRead(PIN_BTN_L) == HIGH);
bool middlePressed = (digitalRead(PIN_BTN_M) == HIGH);
bool rightPressed = (digitalRead(PIN_BTN_R) == HIGH);
// Handle middle + left button long press for reset
if (middleLeftPressed) {
if ((currentMillis - middle_long_press_started) > 2000) {
ESP.restart(); // Restart if the buttons are pressed for more than 2 seconds
// Short press detection
if (leftPressed) {
if ((currentMillis - leftPressStart > 50)) { // Debounce delay
if (!leftBeeped) {
beep(); // Play beep sound
leftBeeped = true; // Set beeped state
// Handle left short press action here
}
}
} else {
middle_long_press_started = currentMillis; // Reset timer if the buttons are not pressed
leftPressStart = currentMillis; // Reset the timer if button is not pressed
leftBeeped = false; // Reset beeped state
}
if (rightPressed) {
if ((currentMillis - right_long_press_started) > 2000) {
if (!is_display_off) {
display.ssd1306_command(SSD1306_DISPLAYOFF); // Turn off display
is_display_off = true;
}
} else if (is_display_off) {
display.ssd1306_command(SSD1306_DISPLAYON); // Turn on display
is_display_off = false;
if (middlePressed) {
if ((currentMillis - middlePressStart > 50)) { // Debounce delay
if (!middleBeeped) {
beep(); // Play beep sound
middleBeeped = true; // Set beeped state
// Handle middle short press action here
}
}
} else {
middlePressStart = currentMillis; // Reset the timer if button is not pressed
middleBeeped = false; // Reset beeped state
}
if (rightPressed) {
if ((currentMillis - rightPressStart > 50)) { // Debounce delay
if (!rightBeeped) {
beep(); // Play beep sound
rightBeeped = true; // Set beeped state
if (is_display_off) {
display.ssd1306_command(SSD1306_DISPLAYON); // Turn on display
is_display_off = false;
beep();
}
}
}
} else {
rightPressStart = currentMillis; // Reset the timer if button is not pressed
rightBeeped = false; // Reset beeped state
}
// Long press detection
if (leftPressed && (currentMillis - leftPressStart > 2000)) {
if (!leftBeeped) {
beep(); // Play beep sound
leftBeeped = true; // Set beeped state
// Handle left long press action here
}
}
if (middlePressed && (currentMillis - middlePressStart > 2000)) {
if (!middleBeeped) {
beep(); // Play beep sound
middleBeeped = true; // Set beeped state
// Handle middle long press action here
}
}
if (rightPressed && (currentMillis - rightPressStart > 2000)) {
if (!is_display_off) {
display.ssd1306_command(SSD1306_DISPLAYOFF); // Turn off display
is_display_off = true;
playTune(3); // Play beep sound
}
}
// Combination of Left and Middle long press
if (leftPressed && middlePressed &&
(currentMillis - leftPressStart > 2000) &&
(currentMillis - middlePressStart > 2000)) {
if (!leftBeeped && !middleBeeped) {
beep(); // Play beep sound
ESP.restart();
// Handle left and middle long press action here
}
}
} else {
right_long_press_started = currentMillis;
}
}

View File

@ -12,9 +12,10 @@ void setup() {
playTune(1);
connectToWifi();
displayOctoPrintVersion(display);
}
void loop() {
commonButtonHandler();
fetchPrintingStatus(display);
}

View File

@ -4,22 +4,14 @@
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "tunes.h"
#include "tunes.h"
void playTune(int tuneNumber);
WiFiClient client;
String printerOperational;
String printerPaused;
String printerPrinting;
String printerReady;
String printerText;
String printerHotend;
String printerTarget;
String payload;
OctoprintApi api(client, OCTOPRINT_HOST, OCTOPRINT_PORT, OCTOPRINT_API_KEY);
unsigned long api_mtbs = OCTOPRINT_API_REFRESH_INTERVAL;
unsigned long api_lasttime = 0;
bool displayOctoPrintVersion(Adafruit_SSD1306& display) {
display.clearDisplay();
@ -27,23 +19,20 @@ bool displayOctoPrintVersion(Adafruit_SSD1306& display) {
display.setTextSize(1);
display.setTextColor(WHITE);
display.print("Fetching OctoPrint Version...");
display.display(); // Show loading message
display.display();
// Attempt to fetch the OctoPrint version
if (api.getOctoprintVersion()) {
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
display.setTextColor(WHITE);
display.print("OctoPrint Version:");
display.setCursor(0, 10);
display.setTextSize(2); // Larger text for version
display.setTextSize(2);
display.print(api.octoprintVer.octoprintServer);
display.display(); // Update the display
display.display();
playTune(2);
return true; // Indicate success
return true;
} else {
display.clearDisplay();
display.setCursor(0, 0);
@ -53,10 +42,44 @@ bool displayOctoPrintVersion(Adafruit_SSD1306& display) {
display.setCursor(0, 10);
display.print("OctoPrint version.");
display.display();
// Optionally, add a short delay to show the error
playTune(3);
return false; // Indicate failure
return false;
}
delay(1000);
}
}
bool fetchPrintingStatus(Adafruit_SSD1306& display) {
if (millis() - api_lasttime > api_mtbs || api_lasttime == 0) {
if (api.getPrinterStatistics()) {
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
display.setTextColor(WHITE);
display.println(api.printerStats.printerState);
display.print("Nozzle: ");
display.println(api.printerStats.printerTool0TempActual);
display.print("Bed: ");
display.println(api.printerStats.printerBedTempActual);
//Print time left (if printing) in human readable time HH:MM:SS
int runHours= api.printJob.progressPrintTimeLeft/3600;
int secsRemaining=api.printJob.progressPrintTimeLeft%3600;
int runMinutes=secsRemaining/60;
int runSeconds=secsRemaining%60;
char buf[31];
sprintf(buf,"Print time left:\t%02d:%02d:%02d",runHours,runMinutes,runSeconds);
display.println(buf);
const float temp_percent = floor(api.printJob.progressCompletion*100)/100;
display.print(temp_percent);
display.println("%");
display.display();
api_lasttime = millis(); // Update the last fetch time
return true;
} else {
Serial.println("Failed to fetch printer statistics.");
return false;
}
}
return false; // No fetch was done (within the time interval)
}

View File

@ -43,4 +43,10 @@ void playTune(int tuneIndex) {
delay(noteDuration[i] + 20);
noTone(PIN_BUZZER); // Stop the tone
}
}
void beep() {
tone(PIN_BUZZER, 1000, 100);
delay(100);
noTone(PIN_BUZZER);
}