#include <Stepper.h>
#include <WiFi.h>
#include <ArduinoWebsockets.h>
using namespace websockets;
// Змінні для регулювання мотором
bool leftPressed = false;
bool rightPressed = false;
bool selPressed = false;
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* websocketURL = "ws://free.blr2.piesocket.com/v3/1?api_key=icpKxL7aiFwlrqdfSeyRw48mi0KWgwE1Br4T1EKi¬ify_self=1";
const int vertPin = 34;
const int horzPin = 35;
const int selPin = 32;
// Ініціалізація лічильника кроків
int stepCount1 = 0;
int stepCount2 = 0;
String message;
// Ініціалізація об'єктів для WIFI клієнту і Websocket клієнту
WiFiClient espClient;
WebsocketsClient socket;
// Ініціалізація крокового двигуна
// Підключення до пінів 17, 5, 18, 19 на Ардуіно
Stepper stepper1(200, 17, 5, 18, 19);
Stepper stepper2(200, 2, 0, 4, 16);
void setup() {
Serial.begin(115200);
Serial.println("Hello, ESP32!");
analogReadResolution(10);
pinMode(vertPin, INPUT);
pinMode(horzPin, INPUT);
pinMode(selPin, INPUT_PULLUP);
stepper1.setSpeed(20);
stepper2.setSpeed(20);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Connecting to WiFi...");
}
Serial.println("WiFi connected");
socket.onMessage(onMessageReceived);
connectToWebSocket();
}
void connectToWebSocket() {
bool isConnected = socket.connect(websocketURL);
Serial.println("Connecting to WebSocket...");
while (!socket.available()) {
delay(1000);
Serial.print(".");
}
Serial.println("Connected to WebSocket");
}
// Функція, яка викликається при отриманні повідомлень WebSocket
// та встановлення значень для регулювання мотором
void onMessageReceived(WebsocketsMessage message) {
Serial.print("Received message: ");
Serial.println(message.data());
String joystickcommand = message.data();
if (joystickcommand == "Sel") {
selPressed = true;
}
else if (joystickcommand == "SelFalse") {
selPressed = false;
}
else if (joystickcommand == "Left") {
leftPressed = true;
}
else if (joystickcommand == "LeftFalse") {
leftPressed = false;
}
else if (joystickcommand == "Right") {
rightPressed = true;
}
else if (joystickcommand == "RightFalse") {
rightPressed = false;
}
}
void loop() {
// Чекає на вхідні повідомлення і обробляє їх
socket.poll();
// Зчитуємо дані з пінів до яких під'єднано джойстик та запийсуємо в змінні його положення
int y = analogRead(vertPin);
int x = analogRead(horzPin);
bool selPressed1 = digitalRead(selPin) == LOW;
// Якщо затиснута кнопка SEL, працює двигун 2
if(selPressed1 or selPressed ){
// Якщо джойстик має крайне ліве положення, крутимо двигун 2 проти годинникової стрілки
//або з WebSocket отримуємо команду "Left", крутимо мотор проти годинникової стрілки
if(((leftPressed and !rightPressed) or (x > 515)) and stepCount1>-200){
// Крутимо мотор 2 проти годинникової стрілки
stepper1.step(-1);
delay(100);
// Зменшується лічильник на 1 крок
stepCount1 = stepCount1 - 1;
message = "Положення двигуна 2: " + String(stepCount1);
// Перевірка отримання кількості символів, доступних для читання
if (socket.available()) {
// Відправка повідомлення до серверу
socket.send(message);
Serial.println(message);
} else {
Serial.println("Немає доступних клієнтів");
}
}
// Якщо джойстик має крайне праве положення, крутимо двигун 2 за годинниковою стрілкою
// або з WebSocket отримуємо команду "Right", крутимо мотор за годинниковою стрілкою
if(((!leftPressed and rightPressed) or (x < 510)) and stepCount1<200){
// Крутимо мотор 2 за годинниковою стрілкою
stepper1.step(1);
delay(100);
// Збільшуємо лічильник на 1 крок
stepCount1 = stepCount1 + 1;
String message = "Положення двигуна 2: " + String(stepCount1);
if (socket.available()) {
socket.send(message);
Serial.println(message);
} else {
Serial.println("Немає доступних клієнтів");
}
}
}
else{
if(((leftPressed and !rightPressed) or (x > 515)) and stepCount2>-200){
// Крутимо мотор 1 проти годинникової стрілки
stepper2.step(-1);
delay(100);
// Зменшується лічильник на 1 крок
stepCount2 = stepCount2 - 1;
String message = "Положення двигуна 1: " + String(stepCount2);
// Перевіряє, чи доступний клієнт
if (socket.available()) {
// Надсилання клієнту повідомлення
socket.send(message);
Serial.println(message);
} else {
Serial.println("Немає доступних клієнтів");
}
}
if(((!leftPressed and rightPressed) or (x < 510)) and stepCount2<200){
// Крутимо мотор 1 за годинниковою стрілкою
stepper2.step(1);
delay(100);
// Збільшуємо лічильник на 1 крок
stepCount2 = stepCount2 + 1;
String message = "Положення двигуна 1: " + String(stepCount2);
if (socket.available()) {
socket.send(message);
Serial.println(message);
} else {
Serial.println("Немає доступних клієнтів");
}
}
}
delay(500);
}