#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Stepper.h>
#define SCREEN_WIDTH 128 // OLED width, in pixels
#define SCREEN_HEIGHT 64 // OLED height, in pixels
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
#define ENCODER_CLK 32
#define ENCODER_DT 33
int encoder_value = 0;
int encoder_value_last = -1;
#define STEP 200
Stepper myStepper(STEP, 5, 17, 16, 4);
void read_encoder_value() {
int dtValue = digitalRead(ENCODER_DT);
if (dtValue == HIGH && encoder_value != 100) encoder_value += 5;
else if (dtValue == LOW && encoder_value != 0) encoder_value -= 5;
Serial.print("encoder_value -> ");
Serial.println(encoder_value);
}
void draw_encoder_value() {
// https://adafruit.github.io/Adafruit-GFX-Library/html/class_adafruit___g_f_x.html#a6f6f1abccf677eac244fa17d105133ea
oled.clearDisplay();
oled.setCursor(14, 1);
oled.println("0");
oled.setCursor(49, 1);
oled.println("speed");
oled.setCursor(97, 1);
oled.println("100");
oled.drawRect(14, 10, 100, 18, SSD1306_WHITE);
oled.fillRect(16, 12, (int) (96 * (encoder_value / 100.0)), 14, SSD1306_WHITE);
oled.display();
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Hello, ESP32!");
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("failed to start SSD1306 OLED"));
while (1);
}
oled.setTextSize(1);
oled.setTextColor(WHITE);
pinMode(ENCODER_CLK, INPUT);
pinMode(ENCODER_DT, INPUT);
attachInterrupt(digitalPinToInterrupt(ENCODER_CLK), read_encoder_value, FALLING);
}
void loop() {
// put your main code here, to run repeatedly:
if (encoder_value != encoder_value_last) {
draw_encoder_value();
encoder_value_last = encoder_value;
}
if (encoder_value != 0) {
myStepper.setSpeed((int) (encoder_value * 1.5));
myStepper.step(STEP/10);
}
delay(5); // this speeds up the simulation
}