#include <Arduino_GFX_Library.h>
#include <lvgl.h>
#include <lv_arduino.h> // LVGL Arduino Hardware Interface
#include <Wire.h>
void btn_cw_cb(lv_obj_t *btn, lv_event_t event);
void btn_ccw_cb(lv_obj_t *btn, lv_event_t event);
void slider_event_cb(lv_obj_t *slider, lv_event_t event);
void btn_start_cb(lv_obj_t *btn, lv_event_t event);
void btn_stop_cb(lv_obj_t *btn, lv_event_t event);
void updateNumericDisplay(lv_obj_t *slider, lv_obj_t *num_display);
void adjustMotorSpeed(lv_obj_t *slider);
lv_obj_t *num_display;
LVGL_Arduino lvgl_arduino;
#define TFT_SCK 18
#define TFT_MOSI 23
#define TFT_MISO 19
#define TFT_CS 22
#define TFT_DC 21
#define TFT_RESET 17
// Motor control pins
#define motorPinPUL 39 // PIN PUL+
#define motorPinDIR 34 // PIN DIR+
#define motorPinEN 36 // PIN ENA+
int SPR = 200; // 200 steps per revolution (Assuming, adjust as needed)
// Global variables
int motorSpeedDelay = 500; // default delay
bool motorEnabled = false;
bool motorTurning = false;
int motorDirection = 0; // 0 for CW, 1 for CCW
void updateNumericDisplay(lv_obj_t *slider, lv_obj_t *num_display) {
int value = lv_slider_get_value(slider);
char buffer[10];
sprintf(buffer, "%d", value);
lv_label_set_text(num_display, buffer);
}
void setup() {
// Initialize the ILI9341 display
Arduino_ESP32SPI bus = Arduino_ESP32SPI(TFT_DC, TFT_CS, TFT_SCK, TFT_MOSI, TFT_MISO);
Arduino_ILI9341 tft = Arduino_ILI9341(&bus, TFT_RESET);
tft.begin();
tft.fillScreen(ILI9341_WHITE);
tft.setRotation(ILI9341_ROTATION); // Set the display rotation as needed
// Initialize LVGL using the Arduino hardware interface
lvgl_arduino.begin(&tft);
// Setup motor control pins
pinMode(motorPinPUL, OUTPUT);
pinMode(motorPinDIR, OUTPUT);
pinMode(motorPinEN, OUTPUT);
setupGUI();
}
unsigned long lastMotorPulseTime = 0;
bool pulseState = LOW;
void loop() {
// Handle LVGL tasks
lvgl_arduino.loop();
if (motorEnabled && motorTurning) {
unsigned long currentMillis = millis();
if (currentMillis - lastMotorPulseTime >= motorSpeedDelay) {
pulseState = !pulseState;
digitalWrite(motorPinPUL, pulseState);
if (motorDirection == 0) { // CW
digitalWrite(motorPinDIR, HIGH);
} else { // CCW
digitalWrite(motorPinDIR, LOW);
}
lastMotorPulseTime = currentMillis;
}
}
}
void setupGUI() {
// Title
lv_obj_t *label_title = lv_label_create(lv_scr_act(), NULL);
lv_label_set_text(label_title, "NEMA 34 Controller");
lv_obj_align(label_title, NULL, LV_ALIGN_IN_TOP_MID, 0, 10);
// Direction Buttons (CW and CCW)
lv_obj_t *btn_cw = lv_btn_create(lv_scr_act(), NULL);
lv_obj_set_event_cb(btn_cw, btn_cw_cb);
lv_label_set_text(lv_label_create(btn_cw, NULL), "CW");
lv_obj_align(btn_cw, label_title, LV_ALIGN_OUT_BOTTOM_LEFT, -50, 20);
lv_obj_t *btn_ccw = lv_btn_create(lv_scr_act(), NULL);
lv_obj_set_event_cb(btn_ccw, btn_ccw_cb);
lv_label_set_text(lv_label_create(btn_ccw, NULL), "CCW");
lv_obj_align(btn_ccw, label_title, LV_ALIGN_OUT_BOTTOM_RIGHT, 50, 20);
// Slider for Speed Control
lv_obj_t *slider = lv_slider_create(lv_scr_act(), NULL);
lv_obj_set_width(slider, 200);
lv_obj_set_event_cb(slider, slider_event_cb);
lv_obj_align(slider, NULL, LV_ALIGN_CENTER, 0, 0);
// Numeric Display for Current Speed
num_display = lv_label_create(lv_scr_act(), NULL);
lv_label_set_text(num_display, "0");
lv_obj_align(num_display, slider, LV_ALIGN_OUT_BOTTOM_MID, 0, 20);
// Progress Bar
lv_obj_t *bar = lv_bar_create(lv_scr_act(), NULL);
lv_obj_set_size(bar, 200, 20);
lv_bar_set_range(bar, 0, 100);
lv_obj_align(bar, num_display, LV_ALIGN_OUT_BOTTOM_MID, 0, 20);
// Start and Stop Buttons
lv_obj_t *btn_start = lv_btn_create(lv_scr_act(), NULL);
lv_obj_set_event_cb(btn_start, btn_start_cb);
lv_label_set_text(lv_label_create(btn_start, NULL), "ON");
lv_obj_align(btn_start, bar, LV_ALIGN_OUT_BOTTOM_LEFT, -50, 20);
lv_obj_t *btn_stop = lv_btn_create(lv_scr_act(), NULL);
lv_obj_set_event_cb(btn_stop, btn_stop_cb);
lv_label_set_text(lv_label_create(btn_stop, NULL), "OFF");
lv_obj_align(btn_stop, bar, LV_ALIGN_OUT_BOTTOM_RIGHT, 50, 20);
}
void slider_event_cb(lv_obj_t *slider, lv_event_t event) {
if (event == LV_EVENT_VALUE_CHANGED) {
int value = lv_slider_get_value(slider);
motorSpeedDelay = map(value, 0, 100, 1000, 100);
updateNumericDisplay(slider, num_display);
}
}
void btn_cw_cb(lv_obj_t *btn, lv_event_t event) {
if (event == LV_EVENT_CLICKED) {
motorDirection = 0;
motorTurning = true;
}
}
void btn_ccw_cb(lv_obj_t *btn, lv_event_t event) {
if (event == LV_EVENT_CLICKED) {
motorDirection = 1;
motorTurning = true;
}
}
void btn_start_cb(lv_obj_t *btn, lv_event_t event) {
if (event == LV_EVENT_CLICKED) {
motorEnabled = true;
}
}
void btn_stop_cb(lv_obj_t *btn, lv_event_t event) {
if (event == LV_EVENT_CLICKED) {
motorEnabled = false;
motorTurning = false;
}
}