Created
December 18, 2019 09:28
-
-
Save IdrisCytron/f2eedb877f885cf6e281cb1b2e4edc7d to your computer and use it in GitHub Desktop.
Control Stepper Motor With Blynk App Using ESP32
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Tutorial: Control Stepper Motor With Blynk App Using ESP32 | |
Board: | |
- TTGO T-Display ESP32 | |
Output: | |
- 12V 28BYJ-48 Stepper Motor | |
https://my.cytron.io/c-motor-and-motor-driver/c-dc-motor/c-stepper-motor/p-12v-28byj-48-stepper-motor-plus-uln2003-driver-board | |
Library Manager: | |
- TFT_eSPI by Bodmer Version 1.4.20 | |
- Blynk by Volodymyr Shymanskyy Version 0.6.1 | |
*/ | |
/* Comment this out to disable prints and save space */ | |
#define BLYNK_PRINT Serial | |
#include <WiFi.h> | |
#include <WiFiClient.h> | |
const char ssid[] = "Your WiFi SSID"; // WiFi name | |
const char password[] = "Your WiFi Password"; // WiFi password | |
#include <BlynkSimpleEsp32.h> | |
char auth[] = "Your Blynk Auth Token"; // Blynk Authentication Token | |
WiFiServer server(80); | |
#include <SPI.h> | |
#include <TFT_eSPI.h> | |
TFT_eSPI tft = TFT_eSPI(); // Resolution 135 x 240 | |
#define FF17 &FreeSans9pt7b | |
#define FF21 &FreeSansBold9pt7b | |
#define ROW1 0,16 | |
#define ROW2 0,38 | |
#define ROW3 0,60 | |
#define ROW4 0,82 | |
#define ROW5 0,104 | |
#define ROW6 0,126 | |
#define BUTTON1 35 | |
#define BUTTON2 0 | |
#define STEPPER_IN1 27 | |
#define STEPPER_IN2 26 | |
#define STEPPER_IN3 25 | |
#define STEPPER_IN4 33 | |
#define REVOLUTION_STEP 2048 // 1 revolution | |
boolean stepperDirection = false; | |
int stepperStep = 0; | |
int stepperStepCount = 0; | |
boolean stepperMove = false; | |
long prevMillisStepper = 0; | |
int intervalStepper = 4; // Minimum is 2 | |
boolean button1Pressed = false; | |
boolean button2Pressed = false; | |
BLYNK_WRITE(V0) // Button Widget is writing to pin V0 | |
{ | |
stepperDirection = param.asInt(); | |
tft.fillRect(120, 65, 120, 25, TFT_BLACK); | |
tft.setCursor(120, 82); | |
if (stepperDirection) { | |
tft.print("CCW"); | |
} | |
else { | |
tft.print("CW"); | |
} | |
} | |
BLYNK_WRITE(V1) // Button Widget is writing to pin V1 | |
{ | |
int stepperSpeed = param.asInt(); | |
tft.fillRect(120, 87, 120, 25, TFT_BLACK); | |
tft.setCursor(120, 104); | |
if (stepperSpeed == 1) { | |
intervalStepper = 4; | |
tft.print("Low"); | |
} | |
else if (stepperSpeed == 2) { | |
intervalStepper = 3; | |
tft.print("Medium"); | |
} | |
else if (stepperSpeed == 3) { | |
intervalStepper = 2; | |
tft.print("High"); | |
} | |
} | |
BLYNK_WRITE(V2) // Button Widget is writing to pin V2 | |
{ | |
stepperMove = true; | |
stepperStepCount = 0; | |
stepperStep = 1; | |
tft.fillRect(120, 109, 120, 25, TFT_BLACK); | |
tft.setCursor(120, 126); | |
tft.print("Run"); | |
} | |
void setup() | |
{ | |
pinMode(BUTTON1, INPUT_PULLUP); | |
pinMode(BUTTON2, INPUT_PULLUP); | |
pinMode(STEPPER_IN1, OUTPUT); | |
pinMode(STEPPER_IN2, OUTPUT); | |
pinMode(STEPPER_IN3, OUTPUT); | |
pinMode(STEPPER_IN4, OUTPUT); | |
Serial.begin(115200); | |
Serial.print("Initialize Blynk."); | |
tft.init(); | |
tft.setRotation(3); | |
tft.fillScreen(TFT_BLACK); | |
tft.setFreeFont(FF21); | |
tft.setTextColor(TFT_BLUE); | |
tft.setCursor(ROW1); | |
tft.print("Blynk Status:"); | |
tft.setFreeFont(FF17); | |
tft.setTextColor(TFT_WHITE); | |
tft.setCursor(120, 16); | |
tft.print("Initialize..."); | |
WiFi.begin(ssid, password); | |
while (WiFi.status() != WL_CONNECTED) { | |
delay(500); | |
Serial.print("."); | |
} | |
Serial.println(""); | |
Serial.println("WiFi connected."); | |
Serial.println("IP address: "); | |
Serial.println(WiFi.localIP()); | |
Blynk.begin(auth, ssid, password); | |
tft.fillRect(120, 0, 120, 35, TFT_BLACK); | |
tft.setCursor(120, 16); | |
tft.print("Ready!"); | |
tft.setFreeFont(FF21); | |
tft.setTextColor(TFT_RED); | |
tft.setCursor(ROW3); | |
tft.print("STEPPER"); | |
tft.setTextColor(TFT_GREEN); | |
tft.setCursor(ROW4); | |
tft.print("Direction:"); | |
tft.setCursor(ROW5); | |
tft.print("Speed:"); | |
tft.setCursor(ROW6); | |
tft.print("Status:"); | |
tft.setFreeFont(FF17); | |
tft.setTextColor(TFT_YELLOW); | |
tft.setCursor(120, 82); | |
tft.print("CW"); | |
tft.setCursor(120, 104); | |
tft.print("Low"); | |
tft.setCursor(120, 126); | |
tft.print("Stop"); | |
Blynk.virtualWrite(0, 0); | |
Blynk.virtualWrite(1, 1); | |
Blynk.virtualWrite(2, 0); | |
} | |
void loop() | |
{ | |
Blynk.run(); | |
if (digitalRead(BUTTON1) == LOW && | |
button1Pressed == false) { | |
button1Pressed = true; | |
stepperDirection = false; | |
stepperMove = true; | |
stepperStepCount = 0; | |
stepperStep = 1; | |
} | |
else if (digitalRead(BUTTON1) == HIGH && | |
button1Pressed == true) { | |
button1Pressed = false; | |
} | |
if (digitalRead(BUTTON2) == LOW) { | |
stepperDirection = true; | |
stepperMove = true; | |
stepperStepCount = 0; | |
stepperStep = 1; | |
} | |
else if (digitalRead(BUTTON2) == HIGH && | |
button2Pressed == true) { | |
button2Pressed = false; | |
} | |
if (millis() - prevMillisStepper > intervalStepper) { | |
if (stepperMove == true) { | |
if (stepperDirection) { | |
if (stepperStep++ >= 3) { | |
stepperStep = 0; | |
} | |
} | |
else { | |
if (stepperStep-- == 0) { | |
stepperStep = 3; | |
} | |
} | |
if (stepperStepCount++ == REVOLUTION_STEP) { | |
stepperMove = false; | |
stepperStep = 4; | |
Blynk.virtualWrite(2, 0); | |
tft.fillRect(120, 109, 120, 25, TFT_BLACK); | |
tft.setCursor(120, 126); | |
tft.print("Stop"); | |
} | |
switch (stepperStep) { | |
case 0: | |
digitalWrite(STEPPER_IN1, HIGH); | |
digitalWrite(STEPPER_IN2, LOW); | |
digitalWrite(STEPPER_IN3, LOW); | |
digitalWrite(STEPPER_IN4, LOW); | |
break; | |
case 1: | |
digitalWrite(STEPPER_IN1, LOW); | |
digitalWrite(STEPPER_IN2, HIGH); | |
digitalWrite(STEPPER_IN3, LOW); | |
digitalWrite(STEPPER_IN4, LOW); | |
break; | |
case 2: | |
digitalWrite(STEPPER_IN1, LOW); | |
digitalWrite(STEPPER_IN2, LOW); | |
digitalWrite(STEPPER_IN3, HIGH); | |
digitalWrite(STEPPER_IN4, LOW); | |
break; | |
case 3: | |
digitalWrite(STEPPER_IN1, LOW); | |
digitalWrite(STEPPER_IN2, LOW); | |
digitalWrite(STEPPER_IN3, LOW); | |
digitalWrite(STEPPER_IN4, HIGH); | |
break; | |
default: | |
digitalWrite(STEPPER_IN1, LOW); | |
digitalWrite(STEPPER_IN2, LOW); | |
digitalWrite(STEPPER_IN3, LOW); | |
digitalWrite(STEPPER_IN4, LOW); | |
break; | |
} | |
} | |
prevMillisStepper = millis(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
привет хотел бы повторить прозкт , но я не программист , какие библиотеки использовали дайте сылки