ARDUINO Одно-кнопочное меню для штангенциркуля

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
146
Да, под LM358 инвертированный сигнал.
У меня всё-таки заказана плата с микросхемой TXS010E на плате 8-канальный.
в конечном итоге сигнал будет инвертирован или нет? я думаю сегодня я осилю лень и припаяю провода и соберу макетку с парой инвертирующих транзисторов и попробую, потому что прога не будет работать, если штангенциркуль не подключить

Подогнать меню не сложно будет под старый - инверсный код, если готово.
там надо поменять значения low на high и наоборот в самом алгоритме считывания бит, но я так понял, что меня надо не все подряд
если скажеш про инверсию или неинверсию в твоем конечном аппаратном варианте платы, то я подгоню код под любой вариант

Как раз думаю, что хватило бы и простого кода меню типа: длинные нажатия чередуют слова "ПРИВЕТ", "КАК ДЕЛА", "ПОКА", а вывод в серийный порт делается простым нажатием на кнопку.
так и сделано, это стандартный прием при написании программ под контроллер и отладке кода
 

xenon-alien

✩✩✩✩✩✩✩
29 Мар 2020
38
0
Здесь не чат. Сообщения можно редактировать
в конечном итоге сигнал будет инвертирован или нет?
там надо поменять значения low на high и наоборот в самом алгоритме считывания бит, но я так понял, что меня надо не все подряд
если скажеш про инверсию или неинверсию в твоем конечном аппаратном варианте платы, то я подгоню код под любой вариант
В конечном итоге, хотелось что бы код был универсальный - желательна возможность изменения входного сигнала 1-2 строками, если кто-то захочет повторить и не париться с выбором. Так как у каждого в наличии разные компоненты могут быть.
потому что прога не будет работать, если штангенциркуль не подключить
Не у всех штангелях выведены сигнальные данные. Т.е. клеммы то есть и разъем тоже, но со средних ног (клок и дата) не выдает 1.3-1.5в.
Благодарен, что решил со всем кодом разобраться, но мне хватило бы и самой менюшки.

так и сделано, это стандартный прием при написании программ под контроллер и отладке кода
Есть возможность фрагмент кода сбросить с готовым меню?
Я бы попытался внедрить в код из первого поста...
Сейчас тоже соберу макетку и на транзисторах и на LM358.

Может на транзисторах и подтяжке проще будет....

А LM358 можно без инверсии подключить?
 
Изменено:

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
146
А LM358 можно без инверсии подключить?
можно, входы местами поменять только
Может на транзисторах и подтяжке проще будет....
проще, только базу нужно к земле подтянуть через 10к, чтобы помех не наводилось

Есть возможность фрагмент кода сбросить с готовым меню?
раскоменти код обработки битов в функции луп
 

Вложения

  • Лойс +1
Реакции: xenon-alien

xenon-alien

✩✩✩✩✩✩✩
29 Мар 2020
38
0
можно, входы местами поменять только
Как раз ищу схему... (туговата сображалка...)
раскоменти код обработки битов в функции луп
Что-то ошибку видает ArduinoIDE мол невозможно создать файл.
Но открылось в блокноте... Так что может смогу попробовать...
Не сложноват ли в конце фрагмент, где диоды прописаны?
Или так оно и должно быть?

Тебе удалось проверить меню кнопки без светодиодов и прочего?
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
146
Что-то ошибку видает ArduinoIDE мол невозможно создать файл.
тупая иде не может открыть файлы с пробелами в названии
сделай там _ или переименуй в одно слово, я код писал в другой среде и там все норм
Не сложноват ли в конце фрагмент, где диоды прописаны?
а в чем сложность? что по 3 строчки? можно было бы сделать в одну, но ардуина не дает возможность выставлять биты на порту через стандартную функцию digitalwrite
приходится по 3 штуки вызывать их
Тебе удалось проверить меню кнопки без светодиодов и прочего?
так светодиоды как раз и показывают проверку работоспособности
если они тебе не нужны, то можно не ставить
и пищалку тоже

Как раз ищу схему... (туговата сображалка...)
так схема с оу у тебя в первом посте, я про нее говорил
надо поменять выводы 2 и 3 местами
но оу тупо ставить, он не для таких задач нужен и тут хватит просто транзисторов бц547 или транслятора уровней на мелкасхеме или же на транзисторах
 
Изменено:
  • Лойс +1
Реакции: xenon-alien

xenon-alien

✩✩✩✩✩✩✩
29 Мар 2020
38
0
ВЕСЬМА ПРИЗНАТЕЛЕН ЗА ПОМОЩЬ!

Парочка моментов хотелось бы ещё прояснить.

C++:
#include <Keyboard.h>

#include "GyverButton.h"


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 value = 0.0;  
byte state = 0;     // состояние формата вывода: перенос, маркировать, табуляция

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
  {
    value = 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) {
  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 = 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;
    //Serial.print(result, 3);                   // Print result with 3 decimals
    //Serial.println(" in");
  }
  else
  {
    result = (value * sign) / 100.00;
    //Serial.print(result, 2);                   // Print result with 2 decimals
    //Serial.println(" mm");
  }
  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(value, 4);  // 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(value, 4);  // 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(value, 4);  // 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);
}

На данный момент не нравится работа кнопки и непонятен фрагмент кода.

Кнопка:
до этого отправлялось при нажатии, а теперь алгоритм, или библиотека как-то после отпускания отправляет.

Фрагмент:
if (bit_array[24] == 1) // Bit 24 tells the measureing unit (1 -> in, 0 -> mm)
{
result = (value * sign) / 2000.00;
//Serial.print(result, 3); // Print result with 3 decimals
//Serial.println(" in");
}
else
{
result = (value * sign) / 100.00;
//Serial.print(result, 2); // Print result with 2 decimals
//Serial.println(" mm");
}
return result;
}
Т.е. я показания (result) вывести не могу, так как матерится... (наверное и не надо, просто не совсем понял, что оно делает)
Пришлось выводить показания (value). Там всё хорошо работает.
Только не пойму, как значения выводить после запятой, что бы оно как-то автоматом понимало.
В миллиметрах всё ОК, там 2 значения, НО в дюймах округляет тоже до 2-х значений.
Прописал (value, 4); всюду - при дюймах ОК, но в миллиметрах 2 лишних нуля появляется.
Возможно ли просто решить этот момент?

Меню работает, как задумывал, только очередность нужно поменять.(ввод, таб и в конце с выделением, но то, я уже просто местами поменяю в конце)
Диоды тоже меняются поочередно. Осталось пищалку найти, но то уже потом.
Где-то в коробках валяется, заказывал когда-то активный зумер для электронной гитары токарного станка. (может завтра от ищу и тоже подключу проверить)

Завтра уже сниму короткое демо видео и выложу в инстаграм. (ссылку в любом случае оставлю.)
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
146
Пришлось выводить показания (value). Там всё хорошо работает.
все правильно
value = decode(); //decode the bit sequence
в эту переменную и выводится результат, но уже подогнанный под мм или дюймы в зависимости от переключателя на штангенциркуле
все остальные переменные - внутренние и их не надо трогать
Прописал (value, 4); всюду - при дюймах ОК, но в миллиметрах 2 лишних нуля появляется.
Возможно ли просто решить этот момент?
не все так просто тогда с этим, но могу допилить

вот допилил
 

Вложения

Изменено:
  • Лойс +1
Реакции: xenon-alien

xenon-alien

✩✩✩✩✩✩✩
29 Мар 2020
38
0
Ну ты крутой!
Мне бы понимать на таком уровне.

Последний косяк.
Отрицательные значения не верно отображает.
Это можно как-то исправить,или там весь алгоритм переделывать надо?
Есть ли возможность как-то менять точку на запятую?

Update:
Оригинал кода выдает верно значение учитывает отрицательный знак.
 
Изменено:

xenon-alien

✩✩✩✩✩✩✩
29 Мар 2020
38
0
Подогнал под старое - одно-кнопочное нажатие и там учитывается " - "
Вывожу result и всё ОК.

C++:
#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();
  }

}

Так что косяк где-то с value и result
Сам точно не найду, так как не знаю что искать, и что за что отвечает.
Структура совсем другая из-за меню... Разбито на мелкие "void" и ругается на "result"
От куда вообще взялось "value" ?
Я его раньше только в формулах видел, но оно никак не выводилось... а сам результат - да.

C++:
#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 value = 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
  {
    value = 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) {
  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");
  }
  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(result, 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(result, 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(result, 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);
}
 
Изменено:

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
146
я так и думал, что где-то косяк вылезет
хотел оптимизировать код и убрать лишее без тестирования в реальном железе

Отрицательные значения не верно отображает.
странно
что конкретно не так?

Есть ли возможность как-то менять точку на запятую?
сейчас допилю
вот пока попробуй этот код, знак должен нормально работать и 2 и 4 знака после запятой
 

Вложения

xenon-alien

✩✩✩✩✩✩✩
29 Мар 2020
38
0
что конкретно не так?
Не знаю...
выдает непонятный набор цифр. Не то что на штангеле.

2 и 4 знака после запятой
Они работали хорошо и в последний раз.
вот пока попробуй этот код, знак должен нормально работать
Недавно лег, так что проверю, как проснусь и раздуплюсь... результатом поделюсь.
Благодарю!
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
146
@xenon-alien,
запятую обязательно делать? с ней такой гимор получается, т.к. она не является разделителем и все функции работы с числами не заточены под парсинг запятой
получается куча костылей и быдлокода
 

xenon-alien

✩✩✩✩✩✩✩
29 Мар 2020
38
0
вот пока попробуй этот код,
Не заметил никаких изменений в коде и в результате тоже...
-3.02мм отображает, как 770.10
-0.1190 " - 30.3450
По каким причинам заменился result на value?
Оно же работало, как надо, только меню нужно было докинуть в код, а там вся структура изменилась...
Благодарен за помощь, буду думать сам, как это меню в изначальный код впихнуть без непонятной для меня структуризации...
Есть возможность код самой меню прислать, без структуризации, что бы мог раскидать по этим "параметрам"?
C++:
void setup()

void loop()

void decode()
Типа как тут...
 
Изменено:

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
146
По каким причинам заменился result на value?
сокращение кода
там малость тупо сделано в плане названий переменных и приводит к путаннице

надо будет припаиваться к плате и работать с реальными данными
Есть возможность код самой меню прислать, без структуризации, что бы мог раскидать по этим "параметрам"?
нет, там все друг на друга завязано как раз
Оно же работало, как надо, только меню нужно было докинуть в код, а там вся структура изменилась...
естественно
иногда одно небольшое изменение приводит к переписке 95% кода

что там с запятой? надо ее делать?
 

xenon-alien

✩✩✩✩✩✩✩
29 Мар 2020
38
0
там малость тупо сделано в плане названий переменных и приводит к путаннице
но результат при этом выводится верно.
Где-то в этом моменте и происходит не верная интерпретация показаний с отрицательным знаком. (result на value )
что там с запятой? надо ее делать?
Нет.
Можно в самой сисиеме настроить, но то лишние телодвижения...
Если сложно, то нет... (что бы не переделывать 95% кода)
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
146
я подключу свой штангенциркуль без инверсии скорей всего и доделаю код
реально с этой запятой возни много, работа со строками в 8 битных контроллерах довольно гиморное дело и жрет кучу памяти и может привести к порче памяти
по идее все что ты хочеш - должна делать прога на компутере, все эти вводы чисел, форматирование, определение типа проги, поиск нужного поля ввода

железка должна только слать 24 бита в сыром виде в усб или ком порт на низком уровне и все
все высокоуровневые задачи требуют много ресурсов
 

xenon-alien

✩✩✩✩✩✩✩
29 Мар 2020
38
0
я подключу свой штангенциркуль без инверсии скорей всего и доделаю код
Главное что бы порты были активны. Можно проверить обычным мультиметром. (черный на землю , а красный на дата и клок - должно показать 1,3-1,5 вольт, чуток ниже напряжения батарейки)
Я инверсию уже тоже не использую. (пины LM-ки перевернул и код с того блога работает правильно + на одно нажатия отправляет верные показания, как и отрицательные)
реально с этой запятой возни много, работа со стройками в 8 битных контроллерах довольно гиморное дело и жрет кучу памяти
по идее все что ты хочеш - должна делать прога на компутере, все эти вводы чисел, форматирование, определение типа проги, поиск нужного поля ввода
в винде можно спокойно десятичный знак изменить.

На данный момент:
Первоначальный код работает верно.
Одно-кнопочное меню тоже.
Только отрицательные показания не верны после модификации структуры кода под три функции.
 
Изменено:

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
146
Только отрицательные показания не верны после модификации структуры кода под три функции.
ну я посмотрю с реальным железом, просто разбирать его опять не хочется
столько винтиков там накручено и все такое хлипкое
 

xenon-alien

✩✩✩✩✩✩✩
29 Мар 2020
38
0
ну я посмотрю с реальным железом,
В реальном железе один бит отвечает за отрицательный знак. (21)
C++:
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)
Value его где-то теряет.
Вот мм и дюйм отрабатывается нормально.
просто разбирать его опять не хочется
столько винтиков там накручено и все такое хлипкое
Я достал кончиком жала через вход.
А сам порт то активен? Удалось проверить, что бы лишний раз не разбирать?
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
146
А сам порт то активен?
чего бы ему быть не активным? контакты есть
просто это нужно, т .к. сам код организован так, что даже нажатия кнопок не будут работать, пока на входе не будет нужный уровень и не просто уровень, а смена его и за определенное время
 

xenon-alien

✩✩✩✩✩✩✩
29 Мар 2020
38
0
чего бы ему быть не активным? контакты есть
А мне попадались не активные порты с наличием контактов. Как проверить - я уже написал.
Нет смысла лишний раз разбирать.

По какой причине value может не учитывать знак " - " дублируя верные показатели штангеля - результат ?
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
146
По какой причине value может не учитывать знак " - " дублируя верные показатели штангеля - результат ?
без понятия даже
если ты про вывод в клавиатуру, то у тебя там по 2 и 4 знака выводит и может они как-то ограничивают и надо на 1 знак больше
я вчера ковырялся со строками и там форматирование строк как раз просит учитывать размер временного буфера с учетом запятой, знака, максимальной мантиссы и экспоненты

для того и нужно реально железо, потому что отладка подменой цифр и выводом в консоль не всегда помогает
тем более вот так удаленно
 

xenon-alien

✩✩✩✩✩✩✩
29 Мар 2020
38
0
без понятия даже
если ты про вывод в клавиатуру, то у тебя там по 2 и 4 знака выводит и может они как-то ограничивают и надо на 1 знак больше
На предыдущей странице я так же добавил в оригинал кода zeros... Так что там с однократным нажатием выводит верно result. (можешь глянуть как код выглядит).
Возможно ли запихнуть меню после результата?
C++:
  }
  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");
  }
  СЮДА;
}
Без дополнительных void?
 
Изменено:

xenon-alien

✩✩✩✩✩✩✩
29 Мар 2020
38
0
Мне немного не понятно, для чего 2 новые переменные для меню?
По идее одна дополнительная нужна, которая сохраняет/запоминаер одну из трех функций. А результат и так уже прописан.
Или я что-то упускаю...?
И почему value = decode , а не result?
C++:
// #### основной код ####
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
  {
    value = decode(); //decode the bit sequence
  }
  if (butt1.isClick())
  {
    tone(BEEPER_PIN, 1000, 100);
    send_value();
 
Изменено: