#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <AccelStepper.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define UP_BUTTON 0 // GPIO for Up button
#define DOWN_BUTTON 2 // GPIO for Down button
#define SELECT_BUTTON 1 // GPIO for Select button
#define STEP_PIN 8 // Stepper motor step pin
#define DIR_PIN 9 // Stepper motor direction pin
AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);
int mlOptions[] = {5, 10, 15, 20, 25, 30}; // Different ml options
int selectedIndex = 0;
bool confirmed = false;
void setup() {
pinMode(UP_BUTTON, INPUT_PULLUP);
pinMode(DOWN_BUTTON, INPUT_PULLUP);
pinMode(SELECT_BUTTON, INPUT_PULLUP);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
stepper.setMaxSpeed(1000);
stepper.setAcceleration(500);
}
void loop() {
if (digitalRead(UP_BUTTON) == LOW) {
selectedIndex = (selectedIndex > 0) ? selectedIndex - 1 : selectedIndex;
delay(200); // Debounce delay
}
if (digitalRead(DOWN_BUTTON) == LOW) {
selectedIndex = (selectedIndex < (sizeof(mlOptions) / sizeof(mlOptions[0])) - 1) ? selectedIndex + 1 : selectedIndex;
delay(200);
}
if (digitalRead(SELECT_BUTTON) == LOW) {
confirmed = true;
delay(200);
int steps = mlOptions[selectedIndex] * 100; // Example conversion of ml to steps
stepper.moveTo(steps);
stepper.runToPosition();
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(10, 10);
if (!confirmed) {
display.println("Select Volume:");
for (int i = 0; i < (sizeof(mlOptions) / sizeof(mlOptions[0])); i++) {
display.setCursor(20, 25 + (i * 10));
if (i == selectedIndex) {
display.print("> ");
}
display.print(mlOptions[i]);
display.print(" ml");
}
} else {
display.println("Confirmed: ");
display.print(mlOptions[selectedIndex]);
display.print(" ml");
}
display.display();
}
Loading
xiao-esp32-c3
xiao-esp32-c3