#23 - Basic Stepper Motor Control
Who says Blynk can’t control Stepper motors… well, OK, I have said it may require fancy non-blocking timing… so here it is (disclaimer, not all that fancy after all )
Yes, it is using the old and decrepit Stepper.h library… only because I was too lazy to learn simple accelStepper commands at this moment
I am also controlling a 4.29v 1.8deg NEMA 17 stepper with an equally old L298D motor controller… Hey, I works with what I gots
UPDATE - Chose the commented out commands for ESP8266 (default) or ESP32, both with OTA (no I haven’t mastered #ifndef
yet )
Uses a Slider Widget for speed - Slider V0 set with 0-100 and Send On Release ON (But if you really want it OFF, preferably at around 300-500ms, so you don’t flood the connection unnecessarily).
And a Button Widget for direction - Button V1 set as Switch with 0-1
#define BLYNK_PRINT Serial // This prints to Serial Monitor
//#define BLYNK_DEBUG // Optional, this enables more detailed prints
//// Pick one Blynk Device Library group or other
////----------
// #include <WiFi.h> // for ESP32
// #include <WiFiClient.h> // for ESP32
// #include <BlynkSimpleEsp32.h> // for ESP32
////----------
#include <ESP8266WiFi.h> // for ESP8266
#include <BlynkSimpleEsp8266.h> // for ESP8266
////----------
//// Pick one OTA Library or other
////----------
// #include <ESPmDNS.h> // For OTA w/ ESP32
////----------
#include <ESP8266mDNS.h> // For OTA w/ ESP8266
////----------
#include <WiFiUdp.h> // For OTA
#include <ArduinoOTA.h> // For OTA
char auth[] = "xxxxxxxxxx";
char ssid[] = "xxxxx";
char pass[] = "xxxxx";
//char server[] = "xxx.xxx.xxx.xxx"; // IP for your Local Server
char server[] = "blynk-cloud.com"; // URL for Blynk Cloud Server
int port = 8080;
BlynkTimer timer;
#include <Stepper.h>
const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution for your motor
// ESP8266 use GPIO pin designation, not silk-screened labeling
Stepper myStepper(stepsPerRevolution, 5, 4, 0, 2); // ESP8266 - initialize the stepper library for IN1, IN2, IN3, IN4
// ESP32 GPIO/Silk-screened pin designation
//Stepper myStepper(stepsPerRevolution, 15,2,0,4); // ESP32 - initialize the stepper library for IN1, IN2, IN3, IN4
int motorSpeed;
int motorDirection;
void setup() {
Serial.begin(9600);
timer.setInterval(10, stepperControl); // This here is all the fancy timing part... it just updates the stepper control every 5ms
WiFi.begin(ssid, pass);
Blynk.config(auth, server, port);
Blynk.connect();
ArduinoOTA.setHostname("ESP Blynk Stepper"); // For OTA - Use your own device identifying name
ArduinoOTA.begin(); // For OTA
}
void loop() {
Blynk.run();
timer.run();
ArduinoOTA.handle(); // For OTA
}
BLYNK_CONNECTED() {
Blynk.syncVirtual(V0, V1);
}
BLYNK_WRITE(V0) { // Motor Speed - Slider set with 0-100 and Send On Relese OFF
motorSpeed = param.asInt();
myStepper.setSpeed(motorSpeed);
}
BLYNK_WRITE(V1) { // Motor Direction - Button set as Switch with 0-1
motorDirection = param.asInt();
}
void stepperControl() {
if (motorSpeed > 0) {
if (motorDirection == 0) { // Rotate Clockwise
myStepper.step(stepsPerRevolution / 100);
} else { // Rotate CounterClockwise
myStepper.step(-stepsPerRevolution / 100);
}
}
}