Передача измерений штангенциркуля на ПК через ардуино

Аватара пользователя
xenon-alien
Почётный участник
Почётный участник
Сообщения: 4499
Зарегистрирован: 01 янв 2013, 13:13
Репутация: 920
Настоящее имя: Daniel
Откуда: Закарпатская обл. Украина
Контактная информация:

Re: Передача измерений штангенциркуля на ПК через ардуино

Сообщение xenon-alien »

UAVpilot писал(а):Эти переменные есть и в изначальном варианте. Но в обоих вариантах они объявлены как локальные в функции decode() и за пределами этой функции не видны.
Вот этот момент из просмотренных уроков понимаю и припоминаю.
UAVpilot писал(а):в таком случае реальный результат находится в локальных переменных внутри функции decode()
xenon-alien писал(а):Да ещё и прировнял value с decode... (а такого в исходнике нет)
UAVpilot писал(а): И компилятор не ругается на необъявленные переменные.
xenon-alien писал(а):Начал ругаться, когда захотел вывести result, как и до этого делал.
Так как оно за пределами локации.
А value видимо глобальна и не верно применена, или назначена...
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Передача измерений штангенциркуля на ПК через ардуино

Сообщение Serg »

Во втором варианте где-то в начале есть что-то типа:
value = decode();
Видимо тут value автообъявляеется. А вот присваивания значения переменной result нигде не видно - видимо и нет оснований для её автообъявления. Примерно внизу программы есть попытка вывода значения несуществующей result - вот на это наверно компиятор и ругается...
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
xenon-alien
Почётный участник
Почётный участник
Сообщения: 4499
Зарегистрирован: 01 янв 2013, 13:13
Репутация: 920
Настоящее имя: Daniel
Откуда: Закарпатская обл. Украина
Контактная информация:

Re: Передача измерений штангенциркуля на ПК через ардуино

Сообщение 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();
  }

}
Но нет - решил навести порядок и изменил структуру.
Последний раз редактировалось xenon-alien 03 апр 2020, 01:30, всего редактировалось 1 раз.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Передача измерений штангенциркуля на ПК через ардуино

Сообщение Serg »

Я глубоко не вникал, но вполне возможно, что происходит что-то подобное описанное тут в "програмистских задачках".
По хорошему быстрее будет написать новый код, чем разбираться в этом и ловить скрытые в нём "глюки".
Но у меня и ардуин-то нет, не на чём пробовать, да и времени... Сам, когда захотел подобное, просто купил штангенциркуль с BlueTooth. :)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
xenon-alien
Почётный участник
Почётный участник
Сообщения: 4499
Зарегистрирован: 01 янв 2013, 13:13
Репутация: 920
Настоящее имя: Daniel
Откуда: Закарпатская обл. Украина
Контактная информация:

Re: Передача измерений штангенциркуля на ПК через ардуино

Сообщение xenon-alien »

UAVpilot писал(а):Я глубоко не вникал, но вполне возможно, что происходит что-то подобное описанное тут в "програмистских задачках".
И не стоит...
UAVpilot писал(а):По хорошему быстрее будет написать новый код, чем разбираться в этом и ловить скрытые в нём "глюки".
Наверно я сам скорей напишу - скрещу, чем разберусь в этом...
UAVpilot писал(а):Но у меня и ардуин-то нет, не на чём пробовать, да и времени... Сам, когда захотел подобное, просто купил штангенциркуль с BlueTooth.
Хитрый!!! Но наверное самый верный вариант.
Мне просто интересно... Вот и "парюсь"...
За одно может что-то новое узнаю. А то скоро нужно будет боле глубже вникнуть в написания программ.
20200306_140736.jpg (6518 просмотров) <a class='original' href='./download/file.php?id=179507&sid=6e0edd549c539c9c171a65062b0ad272&mode=view' target=_blank>Загрузить оригинал (4.52 МБ)</a>
SVP
Мастер
Сообщения: 6135
Зарегистрирован: 19 дек 2012, 15:49
Репутация: 884
Откуда: Москва
Контактная информация:

Re: Передача измерений штангенциркуля на ПК через ардуино

Сообщение SVP »

Насколько я помню в ардуине работает дебаггер из коробки, в чем проблема посмотреть что и где портится ?
Аватара пользователя
vala
Почётный участник
Почётный участник
Сообщения: 490
Зарегистрирован: 08 окт 2013, 21:01
Репутация: 258
Откуда: Latvia
Контактная информация:

Re: Передача измерений штангенциркуля на ПК через ардуино

Сообщение 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 переименуте на свою и смотрите чтобы тип данных совподал.
Аватара пользователя
xenon-alien
Почётный участник
Почётный участник
Сообщения: 4499
Зарегистрирован: 01 янв 2013, 13:13
Репутация: 920
Настоящее имя: Daniel
Откуда: Закарпатская обл. Украина
Контактная информация:

Re: Передача измерений штангенциркуля на ПК через ардуино

Сообщение 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.
Там можно настроить одно нажатие, двойное нажатие и удержание.
Как раз три функции, которые мне нужны...
Аватара пользователя
vala
Почётный участник
Почётный участник
Сообщения: 490
Зарегистрирован: 08 окт 2013, 21:01
Репутация: 258
Откуда: Latvia
Контактная информация:

Re: Передача измерений штангенциркуля на ПК через ардуино

Сообщение vala »

xenon-alien писал(а):vala,
Не совсем понятен фрагмент кода.
Функцыя декодирует полученные данные от штангеля в число без лишних заморочек.
Если в ваших переменных " result, finalresult" прочтённое отрицательное число с штанегеля отображается верно ( проверьте через serial monitor),
то ищите вину дальше по цепочке.
Подозреваю что вам всю кашу портит билиотека keyboard и отрицательное число придётся записывать, знак и число по отдельности.
Производить проверку числа и если оно отрицательное, то и передовать его в надлежащем виде.
Аватара пользователя
vala
Почётный участник
Почётный участник
Сообщения: 490
Зарегистрирован: 08 окт 2013, 21:01
Репутация: 258
Откуда: Latvia
Контактная информация:

Re: Передача измерений штангенциркуля на ПК через ардуино

Сообщение 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.
Аватара пользователя
xenon-alien
Почётный участник
Почётный участник
Сообщения: 4499
Зарегистрирован: 01 янв 2013, 13:13
Репутация: 920
Настоящее имя: Daniel
Откуда: Закарпатская обл. Украина
Контактная информация:

Re: Передача измерений штангенциркуля на ПК через ардуино

Сообщение xenon-alien »

vala писал(а):Подозреваю что вам всю кашу портит билиотека keyboard и отрицательное число придётся записывать, знак и число по отдельности.
В коде без меню (пост 43) и с библиотекой keyboard всё работает нормально при нажатии, отрицательные значения выводятся соответственно штангелю - корректно.
xenon-alien писал(а):Мне уже кажется проще будет использовать библиотеку OneButton.
Там можно настроить одно нажатие, двойное нажатие и удержание.
Как раз три функции, которые мне нужны...
Аватара пользователя
vala
Почётный участник
Почётный участник
Сообщения: 490
Зарегистрирован: 08 окт 2013, 21:01
Репутация: 258
Откуда: Latvia
Контактная информация:

Re: Передача измерений штангенциркуля на ПК через ардуино

Сообщение 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);
Аватара пользователя
xenon-alien
Почётный участник
Почётный участник
Сообщения: 4499
Зарегистрирован: 01 янв 2013, 13:13
Репутация: 920
Настоящее имя: Daniel
Откуда: Закарпатская обл. Украина
Контактная информация:

Re: Передача измерений штангенциркуля на ПК через ардуино

Сообщение xenon-alien »

vala писал(а):к коду из вашего первого поста
На код из первого поста не смотрите, там не учитываются мм/дюйм + ко всему там схема инверсная считывания данных.
Пост 43 - рабочий код с одой кнопкой до одному нажатию.
Вот исходник кода
С ним всё работает.
Только после внедрения меню и измены структуры отрицательные значения пропали...

То что вы в первом коде описали, скорей всего так сделаю с OneButton библиотекой.
И диоды тогда не нужны, так как просто нужно запомнить на какие нажатия что было назначено.
Скорей всего:
1 клик - результат + ввод
длинный клик - результат + таб
2 клик - результат + Ctrl+A

А вот при меню, которая чередует выводящие комбинации клавиш - там нужна индикация, что бы знать какая комбинация будет отправляться.
Как по мне, то лучше всего было бы меню сделать, но для меня это сложно.
При нажатии - просто отправляются данные, а по длинному - выбирается комбинация клавиш.
Аватара пользователя
xenon-alien
Почётный участник
Почётный участник
Сообщения: 4499
Зарегистрирован: 01 янв 2013, 13:13
Репутация: 920
Настоящее имя: Daniel
Откуда: Закарпатская обл. Украина
Контактная информация:

Re: Передача измерений штангенциркуля на ПК через ардуино

Сообщение 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
Некоторые строки за комментированные. (если покажется бардаком)
Аватара пользователя
xenon-alien
Почётный участник
Почётный участник
Сообщения: 4499
Зарегистрирован: 01 янв 2013, 13:13
Репутация: 920
Настоящее имя: Daniel
Откуда: Закарпатская обл. Украина
Контактная информация:

Re: Передача измерений штангенциркуля на ПК через ардуино

Сообщение xenon-alien »

Обновил первый пост.
Все теперь работает.
Если что, то в инстаграме короткое видео.
Ответить

Вернуться в «Оффтоп»