Помогите, посмотрите мой "скетч". Что-то всё делаю неверно!

Всем, доброго дня.
На автомобиле накрылся блок управления раздаточной коробкой. Аппаратно РКПП управляется обычным электродвигателем ( не шаговым), который через редуктор вращает шток в одну и другую сторону . Внутри имеются контактны с использованием которых можно знать в каком положении вилка и соответственно что включено.
Управление : нефиксируемые кнопки 4WD и LOW (пониженная передача).
С алгоритмом , наверное я понял что надо. Аппаратно реверс двигателя с использованием реле - управление через транзистор, включение контрольных ламп через транзистор не вызывает проблем.
Не могу решить задачу: нажатие кнопки 1 при наличии “1” на входах 2 3 5 ( по логике “И”), появляется “1” на вых 7 и эта единица сохраняется до появления “1” на входах 3 4 (по логике “И”). И вот таких 6 различных вариантов условий. Надеюсь немного понятно по скетчу , если его можно так назвать :frowning: . Плата MH-Tiny ( как Nano), дрова поставил, програмируется нормально, простые моргалки и т.д. проверил работает.
Заранее спасибо.

[code]
//  14  вход с кнопки 4WD  - кнопка 1
//  13   вход с кнопки LOW  -кнопка 2
// 2    вход 2 оранжево-белый провод от РКПП
//3    вход 3 коричнево-белый провод от РКПП
//4   вход 4 белый провод от РКПП
//5   вход 5 пурпурный от РКПП
//7    выход на реле двигателя для вращения вперед
//8    выход на реле двигателя для вращения назад
//10      выход на лампу 4WD серый провод
//11     выход на лампу LOW коричнево-белый провод
//25    выход на пищалку провод не штатный


void setup() {
  Serial.begin(9600);

  pinMode(7, OUTPUT);  //контакт 7 назначаем ВЫХОДОМ
  pinMode(8, OUTPUT);   //контакт 8 назначаем ВЫХОДОМ
  pinMode(10, OUTPUT); //контакт 10 назначаем ВЫХОДОМ
  pinMode(11, OUTPUT); //контакт 11 назначаем ВЫХОДОМ
  pinMode(25, OUTPUT); //контакт 25 назначаем ВЫХОДОМ
  pinMode(14, INPUT_PULLUP); //контакт 14 вход кнопки с неявным нулем
  pinMode(13, INPUT_PULLUP); //контакт 13 вход кнопки с неявным нулем
  digitalWrite(7, LOW); //устанавливаем сигнал 0 на выход ВПЕРЕД
  digitalWrite(8, LOW); //устанавливаем сигнал 0 на выход Назад
}

void loop() {
  boolean button1 = !digitalRead(14);
  boolean button2 = !digitalRead(13);

  // если кнопка 1 была нажата 
  if (button1 == 1 && digitalRead(2) && digitalRead(3) && digitalRead(5))  //  переход от 2 WD  к 4 WD  если есть сигнал ВХоды 2 3 5
    do   {
      digitalWrite(7, HIGH);//включается двигатель вперед
    }
    while (digitalRead(3) && digitalRead(4)) ;// выполняем проверку  сигналов контактных колец до сигналов на 3 и 4
  digitalWrite(7, LOW);// остановка двигателя

  if (button1 == 1 && digitalRead(3) && digitalRead(4)) // переход от 4 WD  к 2 WD  если есть сигнал ВХоды  3 4
    do {
      digitalWrite(8, HIGH);//включается двигатель назад
    }
    while (digitalRead(2) && digitalRead(3) && digitalRead(5)); // выполняем проверку  сигналов контактных колец до сигналов на  2 3 5
  digitalWrite(8, LOW);// остановка двигателя

  if ( button1 == 1 && digitalRead(4) && digitalRead(5))  //  переход от 4 WD LOW  к 2 WD  если есть сигнал ВХоды 4 5
    do {
      digitalWrite(8, HIGH);//включается двигатель назад
    }
    while (digitalRead(2) && digitalRead(3) && digitalRead(5)) ;// выполняем проверку  сигналов контактных колец до сигналов на  2 3 5
  digitalWrite(8, LOW);// остановка двигателя

// если кнопка 2 была нажата

  if (button2 == 1 && digitalRead(2) && digitalRead(3) && digitalRead(5)) //  переход от 2 WD  к 4 WD LOW  если есть сигнал ВХоды 2 3 5
    do {
      digitalWrite(7, HIGH);//включается двигатель вперед
    }
    while (digitalRead(4) && digitalRead(5)); // выполняем проверку  сигналов контактных колец до сигналов на 4 и 5
  digitalWrite(7, LOW);// остановка двигателя

  if (button2 == 1 && digitalRead(3) && digitalRead(4)) //  переход от 4 WD  к 4 WD LOW если есть сигнал ВХоды  3 4
    do {
      digitalWrite(7, HIGH);//включается двигатель вперед
    }
    while (digitalRead(4) && digitalRead(5)); // выполняем проверку  сигналов контактных колец до сигналов на 4 и 5
  digitalWrite(7, LOW);// остановка двигателя

  if (button2 == 1 && digitalRead(4) && digitalRead(5)) //  переход от 4 WD LOW  к 4 WD  если есть сигнал ВХоды 4 5
    do {
      digitalWrite(8, HIGH);//включается двигатель назад
    }
    while  (digitalRead(3) && digitalRead(4)); // выполняем проверку  сигналов контактных колец до сигналов на 3 и 4
  digitalWrite(8, LOW); // остановка двигателя
}
[/code]

Не лезь кривыми руками в источник повышенной опасности

6 лайков

:)) почитав форум, именно от Вас я ожидал подобного ответа. Неоригинально.

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

3 лайка

Я не знаю, где Вы напарили – в программе или в описании, но я пытаюсь сравнить Ваши слова с Вашим кодом.

Вот слова:

А вот код

  // если кнопка 1 была нажата 
  if (button1 == 1 && digitalRead(2) && digitalRead(3) && digitalRead(5))  //  переход от 2 WD  к 4 WD  если есть сигнал ВХоды 2 3 5
    do   {
      digitalWrite(7, HIGH);//включается двигатель вперед
    }
    while (digitalRead(3) && digitalRead(4)) ;// выполняем проверку  сигналов контактных колец до сигналов на 3 и 4
  digitalWrite(7, LOW);// остановка двигателя

В коде написано совсем не то, что в “словах”, а именно: и эта единица сохраняется до исчезновения “1” хотя бы с одного из входов 3 и 4. Не знаю, что Вы хотели написать, но написали Вы именно это.

Ну, и так везде.

Кроме того, структура программы несколько … не могу подобрать прилагательного, “грабельная”, что ли. В общем, я присоединяюсь к совету коллеги.

2 лайка

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

1 лайк

Мазда МПВ или Бонго Френди? На них такое стояло.
Я уж не помню как, давно было, но я родную схему починил у себя. Там что-то очень примитивное было.

:slight_smile: вообще с другого континента автомобиль. Блока родного нет в наличии. Вместо блока вакханалия из 7 реле и оттопорщиной синей изоленты, которая никак не отзывается ни на какие действия из вне, только угрожает пожаром хвостового отделения.

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

Пока по-русски. В виде вразумительной таблички.
Когда будет получен приемлемый вариант “по-русски”, можно будет переходить к варианту “на Си”.
Для того, чтобы писать/отлаживать программу, нужно четко знать, что именно она должна делать. Очевидно, никто из присутствующих не имеет ни малейшего понятия, что должна делать программа, которая Вам нужна.
Нет такой волшебной кнопки “сделать, как я хочу”. Поэтому “как Вы хотите”, Вам придется подробно сформулировать.

Чтобы программа работала, как надо, недостаточно устранить одну ошибку - исправить необходимо все. Но прежде, чем устранять, их надо найти. А чтобы найти, нужно знать, чем именно поведение программы отличается от желаемого. А для этого, в свою очередь, нужно узнать, каково желаемое поведение программы, а этого никто кроме Вас не знает.

2 лайка

Красиво сказано. Действительно, не подумал. Может быть так будет понятнее

@Acris , представляешь вообще “сюрпризы” этого "художества? Где измерение скорости? Информация о нажатии педали газа, тормоза, поворота руля?

Одно случайное нажатие или помеха на скорости…и мы тебя здесь больше не увидим.
Лучше прислушайся к вышеписавшим. Не лезь строить ракету, не научившись ходить.
К тому же такая задача нереальна для 1 человека. Тут и инженер по механике, по схемотехнике, программист. Минимум трое.

А сколько тут было таких, которые модифицировали газовое оборудование. Где они теперь? Отож.)
(“А сколько людей пыталось перепрыгнуть тот ручей в литейном!” М. Жванецкий.)

1 лайк

Вы сами-то поняли, что спросили?

Козьма Прутков тоже был мастер подобных вопросов, например: “Где начало того конца, которым оканчивается начало?

2 лайка

поддерживаю

2 лайка

Ломай меня полностью™

2 лайка