Брутальный пульт

Брутальный пульт


Скетч для ESP32, реализующий сетевую клавиатуру с 4×3 цифровой матрицей, RGB-индикацией состояния и передачей введённых данных на HTTP-сервер по Wi-Fi.

После запуска контроллер подключается к заданной Wi-Fi-сети. Состояние устройства отображается с помощью RGB-светодиода: синий цвет используется во время подключения, зелёный — при готовности к работе, красный — при отсутствии Wi-Fi или ошибке, оранжевый — во время отправки данных на сервер.

Пользователь вводит с клавиатуры двузначное число. После ввода двух цифр контроллер автоматически формирует HTTP GET-запрос к серверу, добавляя введённое значение в параметр number. Также отправку можно выполнить клавишей #, а клавиша * очищает текущий ввод.

Для ввода предусмотрен таймаут 3 секунды: если после начала ввода в течение этого времени не поступает дальнейших действий, накопленное двузначное значение отправляется на сервер, после чего ввод очищается.

Контроллер проверяет наличие Wi-Fi перед каждой отправкой. При отсутствии соединения выполняется попытка повторного подключения. Если подключиться не удаётся, устройство сообщает об ошибке с помощью красного светодиода.

Таким образом, скетч представляет собой простой Wi-Fi-контроллер на ESP32 с цифровой клавиатурой, который позволяет вводить команды или числовые значения и передавать их на сервер посредством HTTP. RGB-светодиод обеспечивает наглядную индикацию состояния подключения, процесса ввода и результата передачи данных.

#include <WiFi.h>
#include <HTTPClient.h>
#include <Keypad.h>

// Настройки WiFi
const char* ssid = "TP-LINK_3A9E";
const char* password = "****";
const char* serverUrl = "http://192.168.1.207/brutal.php";

// Настройки клавиатуры
const byte ROWS = 4;
const byte COLS = 3;
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};

// Пины клавиатуры
byte rowPins[ROWS] = {13, 12, 14, 27};
byte colPins[COLS] = {26, 25, 33};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

// Пины RGB светодиода (используем свободные пины)
#define RED_PIN     4
#define GREEN_PIN   16
#define BLUE_PIN    17

// Переменные для работы с вводом
String inputString = "";
unsigned long lastKeyPressTime = 0;
const unsigned long inputTimeout = 3000; // 3 секунды на ввод

void setup() {
  Serial.begin(115200);
  
  // Настройка RGB светодиода
  pinMode(RED_PIN, OUTPUT);
  pinMode(GREEN_PIN, OUTPUT);
  pinMode(BLUE_PIN, OUTPUT);
  setColor(0, 0, 255); // Синий - инициализация
  
  // Подключение к WiFi
  WiFi.mode(WIFI_STA);
  connectToWiFi();
  
  setColor(0, 255, 0); // Зеленый - готов к работе
}

void loop() {
  // Обновление индикации состояния
  updateStatusLED();
  
  // Обработка нажатий клавиатуры
  char key = keypad.getKey();
  if (key) {
    handleKeyPress(key);
  }

  // Проверка таймаута ввода
  if (inputString.length() > 0 && millis() - lastKeyPressTime > inputTimeout) {
    if (inputString.length() == 2) {
      sendNumberToServer(inputString);
    }
    inputString = "";
  }
  
  delay(10);
}

// Функции для RGB светодиода
void setColor(int r, int g, int b) {
  analogWrite(RED_PIN, r);
  analogWrite(GREEN_PIN, g);
  analogWrite(BLUE_PIN, b);
}

void updateStatusLED() {
  if (WiFi.status() != WL_CONNECTED) {
    setColor(255, 0, 0); // Красный - нет подключения WiFi
  } 
  else if (inputString.length() > 0) {
    // Мигающий желтый при вводе данных
    static bool ledState = false;
    static unsigned long lastBlink = 0;
    if (millis() - lastBlink > 500) {
      ledState = !ledState;
      lastBlink = millis();
      setColor(ledState ? 255 : 0, ledState ? 255 : 0, 0);
    }
  }
  else {
    setColor(0, 255, 0); // Зеленый - готов к работе
  }
}

// Обработка нажатий клавиш
void handleKeyPress(char key) {
  Serial.print("Pressed: ");
  Serial.println(key);
  
  if (isdigit(key)) {
    inputString += key;
    lastKeyPressTime = millis();
    
    if (inputString.length() == 2) {
      sendNumberToServer(inputString);
      inputString = "";
    }
  }
  else if (key == '*') {
    inputString = "";
    Serial.println("Input cleared");
    setColor(0, 255, 0); // Зеленый - сброс ввода
  }
  else if (key == '#') {
    if (inputString.length() == 2) {
      sendNumberToServer(inputString);
      inputString = "";
    }
  }
}

// Подключение к WiFi
void connectToWiFi() {
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  int attempts = 0;
  while (WiFi.status() != WL_CONNECTED && attempts < 20) {
    setColor(0, 0, 255); // Синий - подключение
    delay(250);
    Serial.print(".");
    setColor(0, 0, 0);
    delay(250);
    attempts++;
  }

  if (WiFi.status() == WL_CONNECTED) {
    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
    setColor(0, 255, 0); // Зеленый - подключено
  } else {
    Serial.println("\nFailed to connect to WiFi");
    setColor(255, 0, 0); // Красный - ошибка
    delay(2000);
    ESP.restart();
  }
}

// Отправка данных на сервер
void sendNumberToServer(String number) {
  setColor(255, 165, 0); // Оранжевый - отправка данных
  
  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("WiFi not connected! Attempting to reconnect...");
    connectToWiFi();
    if (WiFi.status() != WL_CONNECTED) {
      setColor(255, 0, 0); // Красный - ошибка
      return;
    }
  }

  WiFiClient client;
  HTTPClient http;

  String url = String(serverUrl) + "?number=" + number;
  
  Serial.print("Sending: ");
  Serial.println(url);

  if (http.begin(client, url)) {
    int httpCode = http.GET();
    
    if (httpCode > 0) {
      Serial.printf("HTTP response code: %d\n", httpCode);
      if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY || httpCode == HTTP_CODE_FOUND) {
        String payload = http.getString();
        Serial.println("Server response: " + payload);
        setColor(0, 255, 0); // Зеленый - успех
        delay(500);
      }
    } else {
      Serial.printf("GET request failed, error: %s\n", http.errorToString(httpCode).c_str());
      setColor(255, 0, 0); // Красный - ошибка
      delay(1000);
    }
    
    http.end();
  } else {
    Serial.println("Unable to connect to server");
    setColor(255, 0, 0); // Красный - ошибка
    delay(1000);
  }
}
Комментариев пока нет.

Оставить комментарий