Страница 3 из 3
Re: Передача измерений штангенциркуля на ПК через ардуино
Добавлено: 03 апр 2020, 00:55
xenon-alien
UAVpilot писал(а):Эти переменные есть и в изначальном варианте. Но в обоих вариантах они объявлены как локальные в функции decode() и за пределами этой функции не видны.
Вот этот момент из просмотренных уроков понимаю и припоминаю.
UAVpilot писал(а):в таком случае реальный результат находится в локальных переменных внутри функции decode()
xenon-alien писал(а):Да ещё и прировнял value с decode... (а такого в исходнике нет)
UAVpilot писал(а): И компилятор не ругается на необъявленные переменные.
xenon-alien писал(а):Начал ругаться, когда захотел вывести result, как и до этого делал.
Так как оно за пределами локации.
А
value видимо глобальна и не верно применена, или назначена...
Re: Передача измерений штангенциркуля на ПК через ардуино
Добавлено: 03 апр 2020, 01:07
Serg
Во втором варианте где-то в начале есть что-то типа:
value = decode();
Видимо тут value автообъявляеется. А вот присваивания значения переменной result нигде не видно - видимо и нет оснований для её автообъявления. Примерно внизу программы есть попытка вывода значения несуществующей result - вот на это наверно компиятор и ругается...
Re: Передача измерений штангенциркуля на ПК через ардуино
Добавлено: 03 апр 2020, 01:17
xenon-alien
UAVpilot писал(а):Во втором варианте где-то в начале есть что-то типа:
value = decode();
Видимо тут value автообъявляеется. А вот присваивания значения переменной result нигде не видно - видимо и нет оснований для её автообъявления. Примерно внизу программы есть попытка вывода значения несуществующей result - вот на это наверно компиятор и ругается...
Благодарю, что потратил на меня время, но я не понимаю происходящего.
Когда result локальный и я одним нажатием его вывожу, то всё работает, как и должно.
Человек решил по другому выкрутиться и ошибся.
К сожалению новую структуру кода не понимаю и не знаю где беда...
Я уже value = decode(); удалил и заменил глобальную переменную value на finalresult, что бы не путать.
Попытался привести код в первоначальное состояние с меню, но увы...
Надеюсь он сам разберется.
Просто неудобно постоянно перепрошивать ардуину для новых комбинаций клавиш.
Надеялся, что он попроще это напишет и заменит
if (digitalRead(buttonPin) == 0) // if the button goes low на меню.
Код: Выделить всё
#include <Keyboard.h>
int bit_array[25]; // For storing the data bit. bit_array[0] = data bit 1 (LSB), bit_array[23] = data bit 24 (MSB).
unsigned long time_now; // For storing the time when the clock signal is changed from HIGH to LOW (falling edge trigger of data output).
int buttonPin = 9; // Set a button to any pin
int CLOCK_PIN = 4;
int DATA_PIN = 5;
byte zeros = 2;
void setup() {
//Serial.begin(9600);
pinMode(buttonPin, INPUT); // Set the button as an input
digitalWrite(buttonPin, HIGH); // Pull the button high
pinMode(CLOCK_PIN, INPUT);
pinMode(DATA_PIN, INPUT);
}
void loop() {
while (digitalRead(CLOCK_PIN) == LOW) {} // If clock is LOW wait until it turns to HIGH
time_now = micros();
while (digitalRead(CLOCK_PIN) == HIGH) {} // Wait for the end of the HIGH pulse
if ((micros() - time_now) > 500) { // If the HIGH pulse was longer than 500 micros we are at the start of a new bit sequence
decode(); //decode the bit sequence
}
}
void decode() {
int sign = 1;
int i = 0;
float value = 0.0;
float result = 0.0;
bit_array[i] = digitalRead(DATA_PIN); // Store the 1st bit (start bit) which is always 1.
while (digitalRead(CLOCK_PIN) == HIGH) {};
for (i = 1; i <= 24; i++) {
while (digitalRead(CLOCK_PIN) == LOW) { } // Wait until clock returns to HIGH
bit_array[i] = digitalRead(DATA_PIN);
while (digitalRead(CLOCK_PIN) == HIGH) {} // Wait until clock returns to LOW
}
for (i = 0; i <= 24; i++) { // Show the content of the bit array. This is for verification only.
//Serial.print(bit_array[i]);
//Serial.print(" ");
}
//Serial.println();
for (i = 1; i <= 20; i++) { // Turning the value in the bit array from binary to decimal.
value = value + (pow(2, i-1) * bit_array[i]);
}
if (bit_array[21] == 1) sign = -1; // Bit 21 is the sign bit. 0 -> +, 1 => -
if (bit_array[24] == 1) { // Bit 24 tells the measureing unit (1 -> in, 0 -> mm)
result = (value*sign) / 2000.00;
zeros = 4;
//Serial.print(result,3); // Print result with 3 decimals
//Serial.println(" in");
} else {
result = (value*sign) / 100.00;
zeros = 2;
//Serial.print(result,2); // Print result with 2 decimals
//Serial.println(" mm");
}
if (digitalRead(buttonPin) == 0) // if the button goes low
{
Keyboard.println(result, zeros); // send a 'result' to the computer via Keyboard HID
delay(200); // delay so there aren't a kajillion z's
Keyboard.releaseAll();
}
}
Но нет - решил навести порядок и изменил структуру.
Re: Передача измерений штангенциркуля на ПК через ардуино
Добавлено: 03 апр 2020, 01:27
Serg
Я глубоко не вникал, но вполне возможно, что происходит что-то подобное описанное тут в "програмистских задачках".
По хорошему быстрее будет написать новый код, чем разбираться в этом и ловить скрытые в нём "глюки".
Но у меня и ардуин-то нет, не на чём пробовать, да и времени... Сам, когда захотел подобное, просто купил штангенциркуль с BlueTooth.
Re: Передача измерений штангенциркуля на ПК через ардуино
Добавлено: 03 апр 2020, 01:36
xenon-alien
UAVpilot писал(а):Я глубоко не вникал, но вполне возможно, что происходит что-то подобное описанное тут в "програмистских задачках".
И не стоит...
UAVpilot писал(а):По хорошему быстрее будет написать новый код, чем разбираться в этом и ловить скрытые в нём "глюки".
Наверно я сам скорей напишу - скрещу, чем разберусь в этом...
UAVpilot писал(а):Но у меня и ардуин-то нет, не на чём пробовать, да и времени... Сам, когда захотел подобное, просто купил штангенциркуль с BlueTooth.
Хитрый!!! Но наверное самый верный вариант.
Мне просто интересно... Вот и "парюсь"...
За одно может что-то новое узнаю. А то скоро нужно будет боле глубже вникнуть в написания программ.
Re: Передача измерений штангенциркуля на ПК через ардуино
Добавлено: 03 апр 2020, 11:24
SVP
Насколько я помню в ардуине работает дебаггер из коробки, в чем проблема посмотреть что и где портится ?
Re: Передача измерений штангенциркуля на ПК через ардуино
Добавлено: 03 апр 2020, 12:55
vala
Функцыя "decode"
Код: Выделить всё
void decode()
{
int i; // mainīgais cikla skaitītājam
int sign = 1; // skaitļa signatūras mainīgais (+ vai -)
long value = 0; // skaitļa bez signatūras mainīgais
for (i = 0;i < 23; i++)
{
while (digitalRead(clockpin)==HIGH) {} //wait until clock returns to HIGH- the first bit is not needed
while (digitalRead(clockpin)==LOW) {} //wait until clock returns to LOW
if (digitalRead(datapin)==LOW)
{
if (i < 20) // pirmie 20 biti
{
value|= 1<<i; // skaitlis no bitu virknes
}
if (i==20) // ja 21 bits ir '1'
{
sign=-1; // ja skaitlis būs negatīvs
}
}
}
result = value * sign; // piešķir pozitīvu vai negatīvu vērtību skaitlim
}
коментарии не стал переводить, там и так всё понятно.
Внедрите в свой код и будет работать правильно.
Переменную result переименуте на свою и смотрите чтобы тип данных совподал.
Re: Передача измерений штангенциркуля на ПК через ардуино
Добавлено: 03 апр 2020, 13:43
xenon-alien
vala,
Не совсем понятен фрагмент кода.
Не похож на исходной из
43 поста. Он работает верно и с отрицательными показаниями. Выводит тоже верно при нажатии на кнопку.
Вот тот, что человек сделал, только заменил value на finalresult и попытался сделать боле похожим на исходник, что бы не путаться при выводе и тем, что в формулах, но увы... Всё тот же косяк...
Код: Выделить всё
#include <Keyboard.h>
#include "GyverButton.h"
int bit_array[25]; // For storing the data bit. bit_array[0] = data bit 1 (LSB), bit_array[23] = data bit 24 (MSB).
const int CLOCK_PIN = 4; // штангенциркуль
const int DATA_PIN = 5; // штангенциркуль
const int BTN_PIN = 9; // кнопка ввод/режимы
const int LED_SELECT_PIN = 6; // светодиод режима "значение + выделить"
const int LED_INPUT_PIN = 7; // светодиод режима "ввод значения"
const int LED_TAB_PIN = 8; // светодиод режима "значение + табулятор"
const int BEEPER_PIN = 3; // пищалка
unsigned long time_now; // For storing the time when the clock signal is changed from HIGH to LOW (falling edge trigger of data output).
float finalresult = 0.0;
byte state = 0; // состояние формата вывода: перенос, маркировать, табуляция
byte zeros = 2;
GButton butt1(BTN_PIN);
void setup() {
pinMode(CLOCK_PIN, INPUT);
pinMode(DATA_PIN, INPUT);
pinMode(LED_SELECT_PIN, OUTPUT);
pinMode(LED_INPUT_PIN, OUTPUT);
pinMode(LED_TAB_PIN, OUTPUT);
pinMode(BEEPER_PIN, OUTPUT);
//Serial.begin(9600);
butt1.setDebounce(1); // настройка антидребезга (по умолчанию 80 мс)
butt1.setTimeout(1000); // настройка таймаута долгий клик
butt1.setClickTimeout(1); // настройка таймаута быстрый клик
set_mode();
}
// #### основной код ####
void loop() {
butt1.tick(); // обязательная функция отработки. Должна постоянно опрашиваться
while (digitalRead(CLOCK_PIN) == LOW); // If clock is LOW wait until it turns to HIGH
time_now = micros();
while (digitalRead(CLOCK_PIN) == HIGH); // Wait for the end of the HIGH pulse
if ((micros() - time_now) > 500) // If the HIGH pulse was longer than 500 micros we are at the start of a new bit sequence
{
decode(); //decode the bit sequence
}
if (butt1.isClick())
{
tone(BEEPER_PIN, 1000, 100);
send_value();
}
if (butt1.isHolded())
{
if (state == 2)
{
state = 0;
}
else
{
state++;
}
tone(BEEPER_PIN, 500, 100);
set_mode();
}
}
// ##### вспомогательные функции #### //
float decode(void) {
//void decode() {
int bit_array[25]; // For storing the data bit. bit_array[0] = data bit 1 (LSB), bit_array[23] = data bit 24 (MSB).
byte sign = 1;
byte i = 0;
float value = 0.0;
float result = 0.0;
bit_array[i] = digitalRead(DATA_PIN); // Store the 1st bit (start bit) which is always 1.
while (digitalRead(CLOCK_PIN) == HIGH);
for (i = 1; i <= 24; i++) {
while (digitalRead(CLOCK_PIN) == LOW); // Wait until clock returns to HIGH
bit_array[i] = digitalRead(DATA_PIN);
while (digitalRead(CLOCK_PIN) == HIGH); // Wait until clock returns to LOW
}
for (i = 0; i <= 24; i++) { // Show the content of the bit array. This is for verification only.
//Serial.print(bit_array[i]);
//Serial.print(" ");
}
for (i = 1; i <= 20; i++)// Turning the value in the bit array from binary to decimal.
{
value = value + (pow(2, i-1) * bit_array[i]);
}
if (bit_array[21] == 1) sign = -1; // Bit 21 is the sign bit. 0 -> +, 1 => -
if (bit_array[24] == 1) // Bit 24 tells the measureing unit (1 -> in, 0 -> mm)
{
result = (value*sign) / 2000.00;
zeros = 4;
//Serial.print(result, 3); // Print result with 3 decimals
//Serial.println(" in");
}
else
{
result = (value*sign) / 100.00;
zeros = 2;
//Serial.print(result, 2); // Print result with 2 decimals
//Serial.println(" mm");
}
finalresult = result;
//return result;
}
void set_mode()
{
switch (state)
{
case 0: set_select();
break;
case 1: set_input();
break;
case 2: set_tab();
break;
}
}
void send_value()
{
switch (state)
{
case 0: send_select();
break;
case 1: send_input();
break;
case 2: send_tab();
break;
}
}
// ### отправка данных в клавиатуру ###
void send_select()
{
//Serial.print("send mode 0 - value and select ctrl+A "); //
//Serial.println(value);
Keyboard.print(finalresult, zeros); // send a 'result' to the computer via Keyboard HID
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press('A');
Keyboard.releaseAll();
}
void send_input()
{
//Serial.print("send mode 1 - value and input "); //
//Serial.println(value);
Keyboard.print(finalresult, zeros); // send a 'result' to the computer via Keyboard HID
Keyboard.press(KEY_RETURN);
Keyboard.releaseAll();
}
void send_tab()
{
//Serial.print("send mode 2 - value and tabulator "); //
//Serial.println(value);
Keyboard.print(finalresult, zeros); // send a 'result' to the computer via Keyboard HID
Keyboard.press(KEY_TAB);
Keyboard.releaseAll();
}
// ### установка светодиодов режима ###
void set_select(void)
{
//Serial.println("set mode 0 - value and select ctrl+A"); //
digitalWrite(LED_SELECT_PIN, HIGH);
digitalWrite(LED_INPUT_PIN, LOW);
digitalWrite(LED_TAB_PIN, LOW);
}
void set_input(void)
{
//Serial.println("set mode 1 - value and input"); //
digitalWrite(LED_SELECT_PIN, LOW);
digitalWrite(LED_INPUT_PIN, HIGH);
digitalWrite(LED_TAB_PIN, LOW);
}
void set_tab(void)
{
//Serial.println("set mode 2 - value and tabulator "); //
digitalWrite(LED_SELECT_PIN, LOW);
digitalWrite(LED_INPUT_PIN, LOW);
digitalWrite(LED_TAB_PIN, HIGH);
}
В коде меню работает, загораются светодиоды по выбранной команде, но отрицательные значения не верно отображает. (пищалку не подключал)
-3.02мм отображает, как 770.10
-0.1190 " .................... 30.3450
Мне уже кажется проще будет использовать библиотеку OneButton.
Там можно настроить одно нажатие, двойное нажатие и удержание.
Как раз три функции, которые мне нужны...
Re: Передача измерений штангенциркуля на ПК через ардуино
Добавлено: 03 апр 2020, 15:11
vala
xenon-alien писал(а):vala,
Не совсем понятен фрагмент кода.
Функцыя декодирует полученные данные от штангеля в число без лишних заморочек.
Если в ваших переменных " result, finalresult" прочтённое отрицательное число с штанегеля отображается верно ( проверьте через serial monitor),
то ищите вину дальше по цепочке.
Подозреваю что вам всю кашу портит билиотека keyboard и отрицательное число придётся записывать, знак и число по отдельности.
Производить проверку числа и если оно отрицательное, то и передовать его в надлежащем виде.
Re: Передача измерений штангенциркуля на ПК через ардуино
Добавлено: 03 апр 2020, 16:17
vala
Parameters
character: a char or int to be sent to the computer. Can be sent in any notation that’s acceptable for a char. For example, all of the below are acceptable and send the same value, 65 or ASCII A:
Keyboard.write(65); // sends ASCII value 65, or A
Keyboard.write('A'); // same thing as a quoted character
Keyboard.write(0x41); // same thing in hexadecimal
Keyboard.write(0b01000001); // same thing in binary (weird choice, but it works)
Returns
Number of bytes sent. Data type: size_t.
Re: Передача измерений штангенциркуля на ПК через ардуино
Добавлено: 03 апр 2020, 17:38
xenon-alien
vala писал(а):Подозреваю что вам всю кашу портит билиотека keyboard и отрицательное число придётся записывать, знак и число по отдельности.
В коде без меню (пост 43) и с библиотекой keyboard всё работает нормально при нажатии, отрицательные значения выводятся соответственно штангелю - корректно.
xenon-alien писал(а):Мне уже кажется проще будет использовать библиотеку OneButton.
Там можно настроить одно нажатие, двойное нажатие и удержание.
Как раз три функции, которые мне нужны...
Re: Передача измерений штангенциркуля на ПК через ардуино
Добавлено: 03 апр 2020, 21:09
vala
xenon-alien писал(а):vala писал(а):Подозреваю что вам всю кашу портит билиотека keyboard и отрицательное число придётся записывать, знак и число по отдельности.
В коде без меню (пост 43) и с библиотекой keyboard всё работает нормально при нажатии, отрицательные значения выводятся соответственно штангелю - корректно.
xenon-alien писал(а):Мне уже кажется проще будет использовать библиотеку OneButton.
Там можно настроить одно нажатие, двойное нажатие и удержание.
Как раз три функции, которые мне нужны...
Мне стало интересно, немного вник. Раз вы не захотели поменять decode в коде с лампочками, то поступайте так:
к коду из вашего первого поста прикрутите кнопку, по простому через if.
Псевдо код:
Код: Выделить всё
butt1.tick();
if (butt1.isSingle())
{
// делаем то .....
}
if (butt1.isDouble())
{
// делаем то .....
}
и так далее
Вот библиотека на кнопку:
https://alexgyver.ru/gyverbutton/
Диодики и вывод на комп возмёте из неработающего кода примерно так:
Код: Выделить всё
Keyboard.println(result);
Keyboard.releaseAll();
digitalWrite(LED_SELECT_PIN, LOW);
digitalWrite(LED_INPUT_PIN, HIGH);
digitalWrite(LED_TAB_PIN, LOW);
Re: Передача измерений штангенциркуля на ПК через ардуино
Добавлено: 03 апр 2020, 21:21
xenon-alien
vala писал(а):к коду из вашего первого поста
На код из первого поста не смотрите, там не учитываются мм/дюйм + ко всему там схема инверсная считывания данных.
Пост 43 - рабочий код с одой кнопкой до одному нажатию.
Вот исходник кода
С ним всё работает.
Только после внедрения меню и измены структуры отрицательные значения пропали...
То что вы в первом коде описали, скорей всего так сделаю с OneButton библиотекой.
И диоды тогда не нужны, так как просто нужно запомнить на какие нажатия что было назначено.
Скорей всего:
1 клик - результат + ввод
длинный клик - результат + таб
2 клик - результат + Ctrl+A
А вот при меню, которая чередует выводящие комбинации клавиш - там нужна индикация, что бы знать какая комбинация будет отправляться.
Как по мне, то лучше всего было бы меню сделать, но для меня это сложно.
При нажатии - просто отправляются данные, а по длинному - выбирается комбинация клавиш.
Re: Передача измерений штангенциркуля на ПК через ардуино
Добавлено: 03 апр 2020, 23:32
xenon-alien
На данный момент код выглядит так
Код: Выделить всё
#include <GyverButton.h>
#include <Keyboard.h>
int bit_array[25]; // For storing the data bit. bit_array[0] = data bit 1 (LSB), bit_array[23] = data bit 24 (MSB).
unsigned long time_now; // For storing the time when the clock signal is changed from HIGH to LOW (falling edge trigger of data output).
//int buttonPin = 9; // Set a button to any pin
//OneButton button(9, true); // Setup a new OneButton on pin 9.
const int BTN_PIN = 9; // кнопка ввод/режимы
int CLOCK_PIN = 4;
int DATA_PIN = 5;
byte zeros = 2;
float Fresult = 0.0;
GButton butt1(BTN_PIN, HIGH_PULL);
void setup() {
//Serial.begin(9600);
//pinMode(buttonPin, INPUT); // Set the button as an input
//digitalWrite(buttonPin, HIGH); // Pull the button high
pinMode(CLOCK_PIN, INPUT);
pinMode(DATA_PIN, INPUT);
butt1.setDebounce(2); // настройка антидребезга (по умолчанию 80 мс)
butt1.setTimeout(300); // настройка таймаута долгий клик
butt1.setClickTimeout(600); // настройка таймаута между кликами (по умолчанию 300 мс)
//set_mode();
//button.attachDoubleClick(doubleclick); // link the function to be called on a doubleclick event.
//button.attachClick(singleclick); // link the function to be called on a singleclick event.
//button.attachLongPressStop(longclick); // link the function to be called on a longpress event.
}
void loop() {
//button.tick(); // check the status of the button
//delay(10);
butt1.tick(); // обязательная функция отработки. Должна постоянно опрашиваться
if (butt1.isSingle()) // проверка на один клик
{
Keyboard.print(Fresult, zeros); // send a 'result' to the computer via Keyboard HID
Keyboard.press(KEY_RETURN); // Press Enter key
Keyboard.releaseAll(); // Release all keys
}
if (butt1.isDouble()) // проверка на двойной клик
{
Keyboard.print(Fresult, zeros); // send a 'result' to the computer via Keyboard HID
Keyboard.press(KEY_LEFT_CTRL); // Press Left CTRL key
Keyboard.press('A'); // Press A key
Keyboard.releaseAll(); // Release all keys
}
if (butt1.isHolded())
{
Keyboard.print(Fresult, zeros); // send a 'result' to the computer via Keyboard HID
Keyboard.press(KEY_TAB); // Press Tab key
Keyboard.releaseAll(); // Release all keys
}
while (digitalRead(CLOCK_PIN) == LOW) {} // If clock is LOW wait until it turns to HIGH
time_now = micros();
while (digitalRead(CLOCK_PIN) == HIGH) {} // Wait for the end of the HIGH pulse
if ((micros() - time_now) > 500) { // If the HIGH pulse was longer than 500 micros we are at the start of a new bit sequence
decode(); //decode the bit sequence
}
}
void decode() {
int sign = 1;
int i = 0;
float value = 0.0;
float result = 0.0;
bit_array[i] = digitalRead(DATA_PIN); // Store the 1st bit (start bit) which is always 1.
while (digitalRead(CLOCK_PIN) == HIGH) {};
for (i = 1; i <= 24; i++) {
while (digitalRead(CLOCK_PIN) == LOW) { } // Wait until clock returns to HIGH
bit_array[i] = digitalRead(DATA_PIN);
while (digitalRead(CLOCK_PIN) == HIGH) {} // Wait until clock returns to LOW
}
for (i = 0; i <= 24; i++) { // Show the content of the bit array. This is for verification only.
//Serial.print(bit_array[i]);
//Serial.print(" ");
}
//Serial.println();
for (i = 1; i <= 20; i++) { // Turning the value in the bit array from binary to decimal.
value = value + (pow(2, i-1) * bit_array[i]);
}
if (bit_array[21] == 1) sign = -1; // Bit 21 is the sign bit. 0 -> +, 1 => -
if (bit_array[24] == 1) { // Bit 24 tells the measureing unit (1 -> in, 0 -> mm)
result = (value*sign) / 2000.00;
zeros = 4;
//Serial.print(result,3); // Print result with 3 decimals
//Serial.println(" in");
} else {
result = (value*sign) / 100.00;
zeros = 2;
//Serial.print(result,2); // Print result with 2 decimals
//Serial.println(" mm");
}
Fresult = result;
/*
if (digitalRead(buttonPin) == 0) // if the button goes low
{
Keyboard.println(result, zeros); // send a 'result' to the computer via Keyboard HID
delay(200); // delay so there aren't a kajillion z's
Keyboard.releaseAll();
}
*/
}
/*
void doubleclick() { // what happens when button is double-clicked
Keyboard.print(Fresult, zeros); // send a 'result' to the computer via Keyboard HID
Keyboard.press(KEY_LEFT_CTRL); // Press Left CTRL key
Keyboard.press('A'); // Press A key
Keyboard.releaseAll(); // Release all keys
}
void singleclick(){ // what happens when the button is clicked
Keyboard.print(Fresult, zeros); // send a 'result' to the computer via Keyboard HID
Keyboard.press(KEY_RETURN); // Press Enter key
Keyboard.releaseAll(); // Release all keys
}
void longclick(){ // what happens when buton is long-pressed
Keyboard.print(Fresult, zeros); // send a 'result' to the computer via Keyboard HID
Keyboard.press(KEY_TAB); // Press Tab key
Keyboard.releaseAll(); // Release all keys
}
*/
Только почему-то не работает двойное нажатие - не совсем понимаю функционал обох библиотек. (OneButton.h GyverButton.h)
Иногда промелькало выделение и запись нового значения. Кнопка на землю подключена. Пин подтянут - HIGH_PULL.
Отрицательные значения корректны.
xenon-alien писал(а):1 клик - результат + ввод
длинный клик - результат + таб
2 клик - результат + Ctrl+A
Некоторые строки за комментированные. (если покажется бардаком)
Re: Передача измерений штангенциркуля на ПК через ардуино
Добавлено: 04 апр 2020, 03:05
xenon-alien
Обновил первый пост.
Все теперь работает.
Если что, то в инстаграме короткое видео.