Номерация включённой передачи МКПП на Ардуино

Здравствуйте, товарищи!
Помогите абсолютному новичку в программировании. Долго искал куда приспособить свою ардуинку и вот представился случай сделать подобную индикацию передач МКПП на мотоцикле. Схема простая до невозможного (см. скриншот). Два Геркона, Ардуино и панель на 6 контактов с соответствующими передачами 1-6, подтягиваемых к “земле”. Начал хорошо, 1 и 2 переключаются, а вот дальше застопорился, 3я не отображается, пробовал складывать условия, пробовал с разными операторами “if”, “else” снимать сигнал со смежных пинов, не хочет и всё. Гугл ничего толкового не даёт, искал подобные скетчи. Общая концепция - задать 7 режимов (не знаю точно как их назвать) и в каждом режиме задающие пины А0 и А1, переключают индикатор на смежные передачи КПП, но как это правильно написать, моих мозгов нехватило, для вас, я думаю, не составит труда подсказать. Спасибо.

#define N  2
#define ST1  3
#define ST2  4
#define ST3  5
#define ST4  6
#define ST5  7
#define ST6  8
#define DOWN_G  A0
#define UP_G  A1

void setup() {
	pinMode(N, OUTPUT);
	pinMode(ST1, OUTPUT);
	pinMode(ST2, OUTPUT);
	pinMode(ST3, OUTPUT);
	pinMode(ST4, OUTPUT);
	pinMode(ST5, OUTPUT);
	pinMode(ST6, OUTPUT);
	pinMode(DOWN_G, INPUT);
	pinMode(UP_G, INPUT);
	digitalWrite(ST1, 1);
	digitalWrite(ST2, 1);
	digitalWrite(ST3, 1);
	digitalWrite(ST4, 1);
	digitalWrite(ST5, 1);
	digitalWrite(ST6, 1);
}

void loop () {
	if(digitalRead(DOWN_G) == 1) {
		digitalWrite(N, 1);
		digitalWrite(ST1, 0);
		digitalWrite(ST2, 1);
	}
	if(digitalRead(UP_G) == 1) {
		digitalWrite(ST1, 1);
		digitalWrite(ST2, 0);
	}
	if(digitalRead(UP_G) == 1 && (ST2) == 0) {
		digitalWrite(ST2, 1);
		digitalWrite(ST3, 0);
	}
}	

У вас концепт неправильный.
Рычаг передач в мото ведь как работает - он не включает конкретную передачу, а только понижает или повышает.
Вот и вам с диодами надо работать так же - при замыкании верхнего геркона повышать номер передачи, а при замыкании нижнего - понижать.
Заведите переменную “текущая передача” и в своих условиях чтения герконов не включайте светодиоды, а только прибавляйте или отнимайте от номера передачи единицу.
И только потом включайте светодиод в соответствии с полученным номером.

Кроме того, герконы у вас включены неправильно и будут глючить. Нужно использовать подтяжку.

Идею с переменной понял вроде, попробую реализовать. А с подтяжкой вы имели ввиду, прописать INPUT_PULLUP на вводах или воткнуть резюки подтягивающие?

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

Вопрос , а почему нельзя написать в лупе просто
складывать или вычитать номер передачи в зависимости от срабатывания входных импульсов. Добавить еще проверку на последнюю и первую передачу. А по номеру зажигать нужный светодиод. Если нужно по нулю, то инвертировать математику.

void loop () {
peredacha=	peredacha + digitalRead(UP_G);
peredacha=	peredacha - digitalRead(DOWN_G);

}

Да никто тебе не запрещает - пиши. Потом расскажешь как оно работает… ))

идея не такая простая, 2 входа-это 4 состояния, а светодиодов больше :frowning:

нет, тут не 2 входа, как вы выразились, а 2 раздельных независимых последовательных входа. Вы можете подавать на 1 вход постоянно импульсы и они будут складываться, а на второй вычитаться.

Можно. Но импульсов может быть больше чем 2 из за дребезга контактов. Совсем рядом свеча с высоковольтными импульсами, которые могут как завесить МК и так и дать ложные импульсы. И возникает вопрос а как узнать что передача первая? При любом ложном импульсе счётчик собьётся и вернуть его в нормальную работу не получится.

Это уже не относится к логике, с дребезгом бороться другими методами надо.
По логике вам нужно: получил импульс - увеличил счетчик, другой уменьшил. А при вашем коде , лишний импульс вернет все в исходное?
Передачу ,можно косвенно, определять по скорости и обороту двигателя.

В корне не верный подход ограничивать логику желаемой областью. Когда пишется программа нужно учесть все возможные варианты развития событий. Я уже писал, если от наводки произойдёт увеличение счетчика хотя бы один раз то в дальнейшем показания будут неверными всегда. В логике программы не предусмотрена такая ситуация.

1 лайк

А откуда бедной слабой ардуине взять данные об оборотах и особенно о скорости? Ещё геркон на вилку и магнит на обод?

Тогда зачем заморачиваться с индикацией?

ЗЫ: без обратной связи это будет не индикатор включенной передачи, а показометр каких-то цифр ))

Так человек(ТС) нарисовал именно “показометр” , про обратную связь вопроса не было.

Пока на работе сидел . от нечего делать нарисовал.
https://wokwi.com/projects/417231030438054913

Спасибо. Да, это действительно показометр, счетчик передач.

Тс , это не рабочий код, это одна из версий как можно считать. Чтобы он заработал нужно ещё кучу условий, убрать дребезг, контроль переключений и ещё всякого которое всплывёт по ходу.

У меня магнитный датчик стоит на вилке для скорости, а обороты могу снять с провода на приборку.

Начало положено) Дальше по ходу разберусь, но чую не без помощи.

обычно обороты берут с зажигания.

Прям с замка зажигания? Или другое место имеется?