Проблема кодирования индикатора велосипедной передачи
Недостаток практики. Я забыл многие функции C& С++... Может ли кто-нибудь помочь мне с этим кодированием, пожалуйста...
Я думаю, что это основная кодировка: Тема: Индикатор передач
Я впервые нашел это, Gear_Indicator_Raw
Но в этих скетчах было много проблем,
- Эти скетчи работают так же, как и простой счетчик,
- Невозможно показать "2" из "0"
- Нет нейтрального обнаружения,
Что касается 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);
}
Проблема:
- Без части "// нейтральная" все работает нормально, но не может показывать "0" без сброса.
- С частью "// нейтраль", когда включена передача, вместо увеличения на дисплее отображается "0" после "1".
- Если я очень быстро нажму на кнопку "4", передача повысится до максимальной.
Я думаю, что в этой части есть проблема:
//нейтрально
val_n = digitalRead(BUTTON_N);
if ((val_n == HIGH) &&gear<=2)
{
gear = HIGH;
delay(100);
}
И, пожалуйста, если кто-нибудь может рассказать мне о "Void oldloop()", для чего это нужно?
@BLUE, 👍1
2 ответа
Лучший ответ:
Вероятная проблема
Я не знаю, как решить проблему, однако я вижу как минимум один элемент, который выглядит странно в //нейтральной части:
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 = нейтраль, 1 .. 5 = передача. Но тогда при переключении передач вы не можете просто нажать + или -, так как последовательность 1 - 0 - 2 - 3 - ...
Другая интерпретация: шестеренка -- от 2 означает нейтральную, и вы отображаете что-то, что указывает на нейтральную (например, «0» или «-») всякий раз, когда шестеренка == 1, и вы отображаете «1», когда вы делаете другая шестерня-- и иметь числовое значение 0 в gear
.
Ваше решение.
На самом деле меня смутила часть "oldloop", а исходный код был очень сложным... Я его как бы укоротил... Думаю, для 7-сегментного можно было бы сделать проще..., @BLUE
Проще всего изменить ваш переключатель (номер) { case 0: led1(); перерыв;
случай 1: нейтральный светодиод(); перерыв;
, @DataFiddler
Все, что я понял после множества неудач... Проблема в чувствительности выводов Arduino...!!! -_- Должен быть полный список всех частых проблем..!!!, @BLUE
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программа Nano Every с использованием порта UPDI
- Невозможно получить показания счетчика (Modbus)
- Помогите с программированием Arduino Nano для запуска вентилятора через ползунковый переключатель через определенные промежутки времени.
- Асинхронные вызовы функций в скетче ардуино
- как быстро loop() работает в Arduino
- Двигатель постоянного тока шумит, но не вращается
- Цикл While не прерывается
Ой, извините, на самом деле я использовал "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