Позабыты хлопоты,Как известно, человеку сложно тягаться с роботом.
Остановлен бег,
Вкалывают роботы,
Счастлив человек
// Резистивная сенсорная панель в качестве USB Macro Keypad
// программируемая клавиатура для горячих клавиш
// Свободно программируемая USB-клавиатура для макросов
// Arduino Leonardo Micro + сенсорная панель
// Поддержка английского и русского языков
// Страница проекта: http://esp8266-server.de/keypadRU.html
// Автор: Михаил Дворкин
// формат команд: "§"- Начало команды, Команда, Партаметр, пробел -Конец команды (Пример "слово1§t1000 цслово2" эта команда означает жди 1 секунду )
// §p - Press "§p0x80 " нажать Strg
// §r - Release "§r0x80 " отпустить Strg
// §a - Release All "§a " отпустить все нажатые клавиши
// §w - Write "§w0xB0 " напечатать ввод (enter)
// §t - Timer "§t3000 " 3 секунды ждать
// §l - Sprache "§l0 " переключит на 0-английский 1-русский
// Скан-коды смотрите здесь
// https://github.com/MichaelDworkin/KeyboardMultiLanguage/blob/master/src/KeyboardMultiLanguage.h
#include <stdint.h>
#include <EEPROM.h>
#include "TouchScreen.h"
#include <KeyboardMultiLanguage.h>
#include "KeyboardMappingRU.h" // Таблица русской раскладки
// ------------------- Распиновка тачскрина ----------------
#define X1 A1
#define X2 A3
#define Y1 A0
#define Y2 A2
/*
#define Y1 A1
#define Y2 A3
#define X1 A0
#define X2 A2
*/
#define PIEZO_PIN 3 // номер ножки с Пьезо
int kalibriere = 0;
boolean losgelassen = 1;
int KalibrWert[4];
// ----------------- Здесь задаётся количество столбцов и строк -----------------
#define Reihen 3 // строк
#define Spalten 4 // столбцов
// ----------------- Команды и тексты, присвоенны соответствующей ячейке -------------------
// ----------------- Двумерный массив соответствует таблице клавиш ----------------------
// открытие скайпа, поиск абонента, видеовызов
//#define skype "§p0x87 r§r0x87 §t100 \"C:\\Program Files (x86)\\Microsoft\\Skype for Desktop\\Skype.exe\"\n§t3000 §p0x80 §p0x81 s§t500 §a §t500 echo§t3000 §w0xD9 \n§p0x80 §p0x81 k§a "
// открытие ардуино, открытие пследнего проекта, закрытие пустого окна
//#define arduino "§p0x87 r§r0x87 §t100 \"C:\\arduino-1.8.8\\arduino.exe\"\n§t12000 §w0x82 §t100 §w0xD9 §t100 §w0xD9 §t100 §w0xD9 §t100 §w0xD7 §t100 §w0xB0 §t500 §p0x82 §t100 §w0xb3 §t100 §r0x82 §p0x82 §p0xc5 §a "
const String data[Reihen][Spalten] =
{
{ "String1\n", "String2\n", "String3\n", "String4\n"},
{ "String5\n", "String6\n", "String7\n", "String8\n" },
{ "String9\n", "String10\n", "String11\n", "String12\n"},
};
/*
const String data[Reihen][Spalten]
{
{ "1", "2", "3", "A" },
{ "4", "5", "6", "B" },
{ "7", "8", "9", "C"},
};
*/
// Для лучшей точности нам нужно знать сопротивление тачскрина
// между электродами Х1 и Х2. Замерьте его мультиметром.
// У использованного - примерно 700 Ом.
TouchScreen ts = TouchScreen(X1, Y1, X2, Y2, 700);
// ---------------- преобразование HEX String в Integer -----------------------
unsigned int hexToDec(String hexString)
{
unsigned int decValue = 0;
int nextInt;
hexString.toUpperCase();
for (int i = 0; i < hexString.length(); i++)
{
nextInt = int(hexString.charAt(i));
if (nextInt >= 48 && nextInt <= 57) nextInt = map(nextInt, 48, 57, 0, 9);
if (nextInt >= 65 && nextInt <= 70) nextInt = map(nextInt, 65, 70, 10, 15);
if (nextInt >= 97 && nextInt <= 102) nextInt = map(nextInt, 97, 102, 10, 15);
nextInt = constrain(nextInt, 0, 15);
decValue = (decValue * 16) + nextInt;
}
return decValue;
}
// ---------------- Setup ------------------------------------------
void setup(void)
{
Serial.begin(115200);
pinMode(PIEZO_PIN, OUTPUT);
Keyboard.language(Russian); // выбор языка /раскладки
delay(1000);
EEPROM.get( 0 , KalibrWert ); // считываем из памяти значения калибровки сенсорной панельи
if (KalibrWert[0] >= KalibrWert[1] || KalibrWert[2] >= KalibrWert[3]) // если дурацкие значения
{
KalibrWert[0] = 0; // то загружаем значения по умолчанию
KalibrWert[1] = 1000;
KalibrWert[2] = 0;
KalibrWert[3] = 1000;
}
}
// ---------- Вывод текста через HID-клавиатуру и выполнение команд -----
void KeyOutput(const String str)
{
int pos = str.indexOf('§'); // находим начало первой команды
while (pos >= 0)
{
if (pos > 0) Keyboard.print(str.substring(0, pos - 1)); // выводим текст до команды и между командами
str.remove(0, pos + 1);
char kode = str.charAt(0); // выделяем команды
pos = str.indexOf(' ');
String Daten = str.substring(1, pos); // выделяем параметр
byte z;
switch (kode) // команды
{
case 'w':
z = hexToDec(Daten);
Keyboard.write(z);
break;
case 't':
delay(Daten.toInt());
break;
case 'p':
z = hexToDec(Daten);
Keyboard.press(z);
break;
case 'r':
z = hexToDec(Daten);
Keyboard.release(z);
break;
case 'a':
Keyboard.releaseAll();
break;
case 'l':
if (Daten == "1") Keyboard.language(Russian);
else Keyboard.language();
break;
}
str.remove(0, pos + 1);
pos = str.indexOf('§'); // находим начало следующей команды
}
if (str.length() > 0)Keyboard.print(str); // выводим текст после команды
}
void loop(void) {
TSPoint p = ts.getPoint(); // a point object holds x y and z coordinates
// we have some minimum pressure we consider 'valid'
if (p.z < ts.pressureThreshhold) losgelassen = 1; // запоминаем отпускание сенсора
if (p.z > ts.pressureThreshhold && losgelassen) // если нажато а раньше было отпущено то
{
int x = map( p.x, KalibrWert[0], KalibrWert[1], 0, Spalten); // вычесляем столбец
int y = map( p.y, KalibrWert[2], KalibrWert[3], 0, Reihen); // вычесляем строку
if (y < Reihen && x < Spalten)
{
digitalWrite(PIEZO_PIN, !digitalRead(PIEZO_PIN)); // издаём щелчок
if (!kalibriere) KeyOutput(data[y][x]); // если не в модусе отладки то печатаем данные
}
else Serial.print(F("номер строки или столбца вне массива данных!"));
losgelassen = 0; // сенсор до сих пор нажат
delay(300);
switch (kalibriere) // контроль выбора калибровки и отладки
{
case 1:
kalibriere = 2;
KalibrWert[0] = p.x; // x min
KalibrWert[2] = p.y; // y min
delay(1000);
Serial.println(F("А теперь в нижнем правом углу\n"));
break;
case 2:
kalibriere = 0;
Serial.println("");
KalibrWert[1] = p.x; // x max
KalibrWert[3] = p.y; // y max
delay(1000);
Serial.println(F("калибровка окончина"));
EEPROM.put( 0, KalibrWert);
Serial.println(F("X Min \tX Max \tY Min \tY Max"));
Serial.print(String(KalibrWert[0]) + "\t");
Serial.print(String(KalibrWert[1]) + "\t");
Serial.print(String(KalibrWert[2]) + "\t");
Serial.println(String(KalibrWert[3]) + "\t");
delay(1000);
break;
case 3:
Serial.println(F("значения аналого-цифрового преобразователя:"));
Serial.print("X = "); Serial.print(p.x);
Serial.print("\tY = "); Serial.print(p.y);
Serial.println(F(" "));
Serial.println(F("откалиброванные и пересчитанные в таблицу значения:"));
Serial.print("X = ");
Serial.print(x);
Serial.print("\tY = ");
Serial.println(y);
Serial.println(" ");
break;
}
}
// 2 команды через последовательный терминал
// символ "k" - калибровка
// символ "r" - показывает абсолютные значения положения и значения сетки
if (Serial.available()) // Когда ввод сделан
{
char Wahl = Serial.read(); // Получить введенный знак
Serial.flush();
Serial.println(Wahl);
switch (Wahl) // контроль выбора
{
case 'k': // старт калибровки
kalibriere = 1;
Serial.println(F("калибровка"));
Serial.println(F("Нажмите:"));
Serial.println(F("В верхнем левом углу\n"));
break;
case 'r': // старт вывода отладочной информации
if (!kalibriere)
{
kalibriere = 3;
Serial.println(F("Значения положения и значения сетки"));
Serial.println(F("чтобы вернутся нажмите \"r\""));
}
else
{
kalibriere = 0;
Serial.println(F("USB-Клавиатура снова включина"));
}
break;
}
}
}
+22 |
731
35
|
+29 |
1044
40
|
+27 |
1009
43
|
А ещё экран с адовым временем отклика можно было использовать для вывода надписей на кнопках и их смены во время работы.
А ещё емкостный тачскрин можно поставить, будет ещё лучше.
У емкостного линий больше, но все они также идут к контроллеру. Он часто распаян прямо на шлейфе. А дальше те же spi/i2c.
Так что да, также.
Резистивный тач, это может быть так же отдельная микросхема тоже обычно SPI и прерывание, но можно и совсем дешево, подключая через аналоговые входы программно изменять координаты.
Поэтому как итог, емкостной тач подключается как и резистивный если это не программная реализация через АЦП у резистивного.
Минимальный размер — чуть больше пальца (из опыта — 3,2'' четко делятся на 3х4, на 4х5 уже ложные срабатывания появляются
Особенно пригодится там, где пароль нельзя ctrl+v, например в камерах Hikvision.
Вот можно было бы через комп быстренько кнопки переназначать, вообще цены небыло бы.
Ну или держать на компе Arduino IDE и пачку скетчей с разными командами и зашивать нужную.
Или использовать microSD, вставил в комп, переписал пресеты, вставил в esp32/arduino и используеш.
Если когда-нибудь мне будет прям вообще нефиг делать и я выполню предыдущие 27 пунктов из списка «сделать, когда совсем будет нефиг делать», то займусь реализацией этого проекта.
Если есть USB сканер штрихкодов — то штрихкода с нужным содержимым и сканируй на здоровье.
Всё на бумаге :)
Либо идете на али и ищете Macro pad, +-1к рублей, никакого колхоза, и у вас на руках удобный и рабочий пад с кучей кнопок. Бонусом идут сьемные кейкапы, можете сделать гравировку со своими макросами, купить кейкапы с отсеком для бумажек ( напечатаете туда красивые картинки), или пойти во все тяжкие и покупать кастомные кнопки, либо печатать на 3д принтере.
Если денег не жалко то есть elgato stream deck, советую сразу идти на авито, мамкины стримеры любят набрать девайсов, и потом ничего не сделав, продавать все за копейки, девайс со скрина на авито от 10к но предлагают торг.
Каждая кнопка имеет маленький экран, можно выводить что угодно, хоть картинку, хоть гифку, хоть мониторинг температуры процессора.
github.com/imchipwood/dumbpad/tree/master/combo
получается что пароль вроде и на виду, но не так то и просто подобрать.
А с фиксированным набором String1, String2… — проще и надёжнее поставить 12 кнопок. Или больше. Любой конструкции. И расположить их удобнее чем сетка 3х4 (если надо).
Хотя тач с бумажкой под ним — конечно «стильно, модно, молодёжно».
Вот пример реализации управления CSTN матрицей на FPGA. Стоимость решения выходит порядка 450 долларов — извините, за эти деньги можно 5К дисплей 27" собрать. Было. Дополнительная клавиатура падонка
www.buydisplay.com/tft-display/arduino-tft-display?diagonal_size=287
Сложно да, это не типичный для ардуино уровень. Вот и вся проблема.
«resistive touch screen 8 inch» на aliexpress. Сразу находится.
Или на том же buydisplay, правда, ёмкостные, но контроллер на шлейфе уже есть.
И сборки дисплейные тоже там есть.
Хочу купить 7 дюймовый экран для Андуина на пробу.
Написал сегодня им запрос, посмотрим, что ответят…
Помимо PayPal там есть Western Union и Wire (как я понял, это SWIFT).
Судя по поиску, есть банки, выполняющие эти переводы к Китай.
Реквизиты для оплаты показываются при выборе способа Wire Transfer на сайте BuyDisplay.
RMB — Renminbi — официальное название китайской валюты.
1 Жэньминьби равно == 8,81 Российский рубль.
Спасибо за помощь.
Но согласен, тогда результат вывалится из зоны «поделка выходного дня из спичек и желудей за три копейки»…
Но у вас был ненужный тач, если его покупать то тоже поделка становится нецелесообразной.
За три копейки — блок кнопок (или плёночная клавиатура, 4х4 40 руб).
https://aliexpress.ru/item/item/32576928627.html
https://aliexpress.ru/item/item/1005002283752470.html
https://aliexpress.ru/item/item/4001252034370.html
Но они работают с PayPal. PayPal в России не работает.
ЧИП феррит + супрессор (NUP4201MR6, например). Иначе это будет работать до первого шерстяного свитера, увы.
про софтовый усб уже сказано. Если оно заработало — это исключение, а не правило.
У attiny вроде тоже такое есть.
Нужно 4 незанятых аналоговых входа.
На attiny88 вроде можно сделать.
esp8266-server.de/keypadRU.html