Проблема кодирования индикатора велосипедной передачи

Недостаток практики. Я забыл многие функции C& С++... Может ли кто-нибудь помочь мне с этим кодированием, пожалуйста...

Я думаю, что это основная кодировка: Тема: Индикатор передач

Я впервые нашел это, Gear_Indicator_Raw

Но в этих скетчах было много проблем,

  1. Эти скетчи работают так же, как и простой счетчик,
  2. Невозможно показать "2" из "0"
  3. Нет нейтрального обнаружения,

Что касается Bike Gear, (1 N 2 3 4 5) One Down Four up, я внес некоторые изменения, Но не получается добавить нейтральную часть плавно...

А вот и мой код:

#define BUTTON_DOWN 13
#define BUTTON_UP 4
#define BUTTON_N 11

int ledPinA = 7;
int ledPinB = 12;
int ledPinC = 10;
int ledPinD = 9;
int ledPinE = 8;
int ledPinF = 6;
int ledPinG = 5;

int val_up = 0;
int val_down = 0;
int val_n = 0;
int old_val_n = 0;
int old_val_down = 0;
int old_val_up = 0;
int gear = 0;
// Метод setup() запускается один раз при запуске скетча

void setup()
{
  pinMode(BUTTON_N, INPUT);
  pinMode(BUTTON_UP, INPUT);
  pinMode(BUTTON_DOWN, INPUT);

  pinMode(ledPinA, OUTPUT);
  pinMode(ledPinB, OUTPUT);
  pinMode(ledPinC, OUTPUT);
  pinMode(ledPinD, OUTPUT);
  pinMode(ledPinE, OUTPUT);
  pinMode(ledPinF, OUTPUT);
  pinMode(ledPinG, OUTPUT);
}

void led0()
{
  digitalWrite(ledPinA, LOW);
  digitalWrite(ledPinB, LOW);
  digitalWrite(ledPinC, LOW);
  digitalWrite(ledPinD, LOW);
  digitalWrite(ledPinE, LOW);
  digitalWrite(ledPinF, LOW);
  digitalWrite(ledPinG, HIGH);
}
void led1()
{
  digitalWrite(ledPinA, HIGH);
  digitalWrite(ledPinB, LOW);
  digitalWrite(ledPinC, LOW);
  digitalWrite(ledPinD, HIGH);
  digitalWrite(ledPinE, HIGH);
  digitalWrite(ledPinF, HIGH);
  digitalWrite(ledPinG, HIGH);
}
void led2()
{
  digitalWrite(ledPinA, LOW);
  digitalWrite(ledPinB, LOW);
  digitalWrite(ledPinC, HIGH);
  digitalWrite(ledPinD, LOW);
  digitalWrite(ledPinE, LOW);
  digitalWrite(ledPinF, HIGH);
  digitalWrite(ledPinG, LOW);
}
void led3()
{
  digitalWrite(ledPinA, LOW);
  digitalWrite(ledPinB, LOW);
  digitalWrite(ledPinC, LOW);
  digitalWrite(ledPinD, LOW);
  digitalWrite(ledPinE, HIGH);
  digitalWrite(ledPinF, HIGH);
  digitalWrite(ledPinG, LOW);
}
void led4()
{
  digitalWrite(ledPinA, HIGH);
  digitalWrite(ledPinB, LOW);
  digitalWrite(ledPinC, LOW);
  digitalWrite(ledPinD, HIGH);
  digitalWrite(ledPinE, HIGH);
  digitalWrite(ledPinF, LOW);
  digitalWrite(ledPinG, LOW);
}
void led5()
{
  digitalWrite(ledPinA, LOW);
  digitalWrite(ledPinB, HIGH);
  digitalWrite(ledPinC, LOW);
  digitalWrite(ledPinD, LOW);
  digitalWrite(ledPinE, HIGH);
  digitalWrite(ledPinF, LOW);
  digitalWrite(ledPinG, LOW);
}
void led6()
{
  digitalWrite(ledPinA, LOW);
  digitalWrite(ledPinB, HIGH);
  digitalWrite(ledPinC, LOW);
  digitalWrite(ledPinD, LOW);
  digitalWrite(ledPinE, LOW);
  digitalWrite(ledPinF, LOW);
  digitalWrite(ledPinG, LOW);
}
void led7()
{
  digitalWrite(ledPinA, LOW);
  digitalWrite(ledPinB, LOW);
  digitalWrite(ledPinC, LOW);
  digitalWrite(ledPinD, HIGH);
  digitalWrite(ledPinE, HIGH);
  digitalWrite(ledPinF, HIGH);
  digitalWrite(ledPinG, HIGH);
}
void led8()
{
  digitalWrite(ledPinA, LOW);
  digitalWrite(ledPinB, LOW);
  digitalWrite(ledPinC, LOW);
  digitalWrite(ledPinD, LOW);
  digitalWrite(ledPinE, LOW);
  digitalWrite(ledPinF, LOW);
  digitalWrite(ledPinG, LOW);
}
void led9()
{
  digitalWrite(ledPinA, LOW);
  digitalWrite(ledPinB, LOW);
  digitalWrite(ledPinC, LOW);
  digitalWrite(ledPinD, LOW);
  digitalWrite(ledPinE, HIGH);
  digitalWrite(ledPinF, LOW);
  digitalWrite(ledPinG, LOW);
}

void setLed(int number)
{
  switch (number)
  {
    case 0:  
      led0();
      break;
    case 1:  
      led1();
      break;
    case 2:  
      led2();
      break;
    case 3:  
      led3();
      break;
    case 4:  
      led4();
      break;
    case 5:  
      led5();
      break;
    case 6:  
      led6();
      break;
    case 7:  
      led7();
      break;
    case 8:  
      led8();
      break;
    case 9:  
      led9();
      break;
  }
}

// метод loop() выполняется снова и снова,
// пока на Arduino есть питание

void oldloop()
{
  led0();
  led1();
  led2();
  led3();
  led4();
  led5();
  led6();
  led7();
  led8();
  led9();
}

void loop()
{
//нейтральный

    val_n =  digitalRead(BUTTON_N);
    if ((val_n == HIGH) &&gear<=2)
    {
      gear = 0;                         // Неправильно отправлено "gear = HIGH"
      delay(100);
    }

// Готовимся

    val_up = digitalRead(BUTTON_UP);
    if ((val_up == HIGH) && (old_val_up == LOW) &&(gear<6) && (gear>0))
    {
      gear += 1;
      delay(100);
    }

    else if ((val_up == HIGH) && (old_val_up == LOW) &&(gear==0))
    {
      gear += 2;
      delay(100);
    }
    old_val_up = val_up;

// Передача вниз

    val_down = digitalRead(BUTTON_DOWN);
    if ((val_down == HIGH) && (old_val_down == LOW)&& (gear>1))
    {
      gear -= 1;
      delay(100);
    }

    else   if ((val_down == HIGH) && (old_val_down == LOW) && (gear==0))
    {
      gear += 1;
      delay(100);
    }
    old_val_down = val_down;

// Максимальный предел

    if (gear >= 5)
    {
      gear = 5;
    }

    setLed(gear);
}

Проблема:

  1. Без части "// нейтральная" все работает нормально, но не может показывать "0" без сброса.
  2. С частью "// нейтраль", когда включена передача, вместо увеличения на дисплее отображается "0" после "1".
  3. Если я очень быстро нажму на кнопку "4", передача повысится до максимальной.

Я думаю, что в этой части есть проблема:

//нейтрально

    val_n =  digitalRead(BUTTON_N);
    if ((val_n == HIGH) &&gear<=2)
    {
     gear = HIGH;
      delay(100);
    }

И, пожалуйста, если кто-нибудь может рассказать мне о "Void oldloop()", для чего это нужно?

, 👍1


2 ответа


Лучший ответ:

1

Вероятная проблема

Я не знаю, как решить проблему, однако я вижу как минимум один элемент, который выглядит странно в //нейтральной части:

gear = HIGH;

Похоже, что gear — это статус контакта (НИЗКИЙ/ВЫСОКИЙ), но двумя строками выше:

if ((val_n == HIGH) &&gear<=2)

Здесь gear — целое число. Мне это кажется совершенно неуместным.

Контакт 4

Причина в том, что у вас нет алгоритма устранения дребезга, проверьте пример Debounce для Arduino. Когда кнопка нажата или нажата, она иногда очень быстро переключается несколько раз; это может привести к многократному увеличению/уменьшению передачи.

старый цикл

Функция oldLoop не используется, но если вы поменяете имена loop и oldLoop, вы можете использовать тестовый сценарий, который содержится в oldLoop.

Другие советы

  • Последовательно используйте интервалы
  • Вы можете многократно реорганизовать код светодиодов.
  • Вы можете использовать gear++; для увеличения или gear--; для уменьшения.

Обновить

(Изменена проблема устранения дребезга для контакта 4).

Вы изменили свой нейтральный код:

gear = 0;

Разве это не должно быть gear = 1;? Поскольку передача 1 означает нейтральное положение (передача 0 равна 1).

,

Ой, извините, на самом деле я использовал "gear=0", но, возможно, это ошибка, когда я редактировал его, чтобы опубликовать здесь..!!!, @BLUE

Спасибо, я закоротил код, как вы сказали, старый цикл бесполезен, gear++ и gear-- работают без сбоев... Но нейтральная функция все еще прерывается при включении передачи..., @BLUE

Затем измените последнюю строку с setLed(gear) на setLed(gear == 1 ? 0 : gear)... по крайней мере, это самое простое решение для кода, который у вас есть сейчас., @Michel Keijzers

Нет, у меня это не работает... Но, думаю, я разобрался с `if ((val_up == HIGH) && (val_n == LOW) && (gear>0))`... Меня смущал "oldloop"... Позвольте мне проверить пару раз..., @BLUE

Все работает очень хорошо. Также спасибо за часть устранения дребезга... Это помогает... Но последнее... Как игнорировать кнопку "удерживать"... Удерживая кнопку/датчик еще немного, оно продолжает увеличиваться/уменьшаться до максимума limit... Я хочу вывод, **только после отпускания кнопки**..., @BLUE

Вы можете запретить удерживать кнопку, когда срабатывает только задний фронт (т. е. нажатие кнопки) или нарастающий фронт (т. е. нажатие кнопки)... алгоритм устранения дребезга гарантирует, что у вас будет только один фронт., @Michel Keijzers

кей, после нескольких часов я тестировал схему... проблема возникает снова...!!! Также измените всю настройку штифта, затем запустите его собственную передачу ... Я думаю, что есть проблема с чувствительностью штифта ... !! (проверено с другими платами) Может быть, мне следует использовать подтягивающие резисторы ... Или использовать аналоговые контакты для ввода,,,, @BLUE

Нет цифровых контактов — это нормально, но вы действительно должны использовать подтягивающие или подтягивающие резисторы на случай, если кнопка нажата., @Michel Keijzers

Да, я использовал 10k pull-down... Теперь он работает... Позвольте мне проверить мой окончательный и фактический проект, чтобы я мог пометить его как решенный... :), @BLUE

Большое спасибо..., @BLUE

Рад, что это работает!, @Michel Keijzers


1

Ваша проблема в том, что вы не понимаете значение слова gear.

Одним из возможных значений может быть 0 = нейтраль, 1 .. 5 = передача. Но тогда при переключении передач вы не можете просто нажать + или -, так как последовательность 1 - 0 - 2 - 3 - ...

Другая интерпретация: шестеренка -- от 2 означает нейтральную, и вы отображаете что-то, что указывает на нейтральную (например, «0» или «-») всякий раз, когда шестеренка == 1, и вы отображаете «1», когда вы делаете другая шестерня-- и иметь числовое значение 0 в gear.

Ваше решение.

,

На самом деле меня смутила часть "oldloop", а исходный код был очень сложным... Я его как бы укоротил... Думаю, для 7-сегментного можно было бы сделать проще..., @BLUE

Проще всего изменить ваш переключатель (номер) { case 0: led1(); перерыв; случай 1: нейтральный светодиод(); перерыв;, @DataFiddler

Все, что я понял после множества неудач... Проблема в чувствительности выводов Arduino...!!! -_- Должен быть полный список всех частых проблем..!!!, @BLUE