Брутальный пульт
Скетч для 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);
}
}