Проблемы с модулем джостика в ESP32
Сейчас разрабатываю скрипт для esp32 с управлением его с помощью джостика но тут вознкила проблема в том что по чему то при управление джостика верх вниз в право в лево ничего не происходит не могу понять почему. Но интересно что кнопка работает - а изменение по осям нет
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Arduino.h>
#include <stdbool.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define VRX_PIN 18 // ESP32 pin GPIO39 (ADC3) connected to VRX pin
#define VRY_PIN 17 // ESP32 pin GPIO36 (ADC0) connected to VRY pin
const int BUTTON_PIN = 16;
#define LEFT_THRESHOLD 1000
#define RIGHT_THRESHOLD 1000
#define UP_THRESHOLD 1000
#define DOWN_THRESHOLD 1000
#define COMMAND_NO 0x00
#define COMMAND_LEFT 0x01
#define COMMAND_RIGHT 0x02
#define COMMAND_UP 0x04
#define COMMAND_DOWN 0x08
int valueX = 0 ; // to store the X-axis value
int valueY = 0 ; // to store the Y-axis value
int command = COMMAND_NO;
int previousValueX = 0;
int previousValueY = 0;
const char* options[] = {
"Conection DEV",
"File",
"Games"
};
const int numOption = sizeof(options) / sizeof(options[0]);
int opshens = 2; //Что бы изменить выбор нужно изменить даную строку
String derector = "Menu";
// Создаем экземпляр дисплея
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setupDisplay(int size) {
display.clearDisplay(); // Очистка перед отображением новых данных
display.setTextSize(size); // Установка размера текста
display.setTextColor(SSD1306_WHITE); // Установка цвета текста
}
void setup() {
Serial.begin(9600);
analogSetAttenuation(ADC_11db);
// Инициализация дисплея с адресом I2C
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Используйте 0x3C как адрес I2C
display.clearDisplay();
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
bool WiFiAt = false;
void loop() {
Jostik();
if (!WiFiAt){
printOptions();
}
delay(200);
if (WiFiAt){
display.clearDisplay();
setupDisplay(2);
display.setCursor(10, 0);
display.println("Wifi Atak");
display.display();
if (digitalRead(BUTTON_PIN) == LOW) { // Кнопка нажата
WiFiAt = false;
delay(200);
}
}
}
//Управление джостиком
void Jostik(){
// read X and Y analog values
valueX = analogRead(VRX_PIN);
valueY = analogRead(VRY_PIN);
Serial.print("valueX: ");
Serial.print(valueX);
Serial.print(" valueY: ");
Serial.println(valueY);
// reset commands
command = COMMAND_NO;
// check left/right commands
if (valueX < LEFT_THRESHOLD)
command |= COMMAND_LEFT;
else if (valueX > RIGHT_THRESHOLD)
command |= COMMAND_RIGHT;
// check up/down commands
if (valueY < UP_THRESHOLD)
command |= COMMAND_UP;
else if (valueY > DOWN_THRESHOLD)
command |= COMMAND_DOWN;
// NOTE: AT A TIME, THERE MAY BE NO COMMAND, ONE COMMAND OR TWO COMMANDS
if (digitalRead(BUTTON_PIN) == LOW) { // Кнопка нажата
if (!WiFiAt){
WiFiAt = true;
}
}
// print command to serial and process command
if (command & COMMAND_LEFT) {
Serial.println("COMMAND LEFT");
// TODO: add your task here
}
if (command & COMMAND_RIGHT) {
Serial.println("COMMAND RIGHT");
// TODO: add your task here
}
if (command & COMMAND_UP) {
if (previousValueY >= UP_THRESHOLD) { // Проверяем, было ли предыдущее значение выше порога
opshens = max(0, opshens - 1); // Уменьшаем opshens, но не ниже 0
Serial.println("UP command processed");
printOptions();
}
}
if (command & COMMAND_DOWN) {
if (opshens != numOption){
opshens++;
}
else{
}
// TODO: add your task here
}
previousValueY = valueY;
}
//МЕНЮ
void printOptions() {
display.clearDisplay(); // Очистка перед отображением новых данных
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
for (int i = 0; i < numOption; i++) {
display.setCursor(0, i * 16); // Установка курсора на новую строку
if (i == opshens) {
display.print("> "); // Указатель на текущую опцию
} else {
display.print(" ");
}
display.println(options[i]);
}
display.display(); // Обновление дисплея после добавления всех элементов
}`