Помоги найти ошибку

mralvad
Offline
Зарегистрирован: 22.11.2016

Кнопка старт стоп, все работает олично но как всегда есть "НО", при нажатии педали сцепления светодиод в кнопке должен плавно разгораться и тухнуть с определенной скоростью, но почему то в режиме 1 и 3 все работает нормально а в режие 2 раза в 2-3 быстрее. Вроде и код везде одинаковый. Строки выделил

 

#include <Bounce2.h> // подключаем библиотеку подавления дребезга Bounce 2
#define pressed_long 1000 // длительность долговременного нажатия
#define Dimmer A7 // пин входа габаритов
#define Clutch 8 // пин входа сцепления
#define Button 12 // пин кнопки
#define Buzzer 3 // пин зуммера
#define Rled 6 // пин красного сид
#define Gled 9 // пин зеленого сид
#define Bled 10 // пин синего сид
#define ACC 11 // пин аксессуаров
#define Ign 7 // пин зажигания
#define Starter 5 // пин стартера
#define ob_start 500 // обороты запуска двигателя
#define INTERVAL 750UL // интервал мигания при автозапуске
unsigned long astop_Starter = 3000; // ограничение автоматической работы стартера
unsigned long mstop_Starter = 10000; // ограничение ручной работы стартера
unsigned long previousMillis = 0; // счетчик времени

// Тахометр для ускорения и точности переменные помещаются в ОЗУ:
volatile unsigned long micros_th = 0; // переменная времени импульса
volatile byte tz = 0; // счетчик обнуления
volatile unsigned int tp = 0; // обороты
volatile boolean tt = false; // триггер тахометра


// Установки кнопки:
int regim = 1; // начальный режим
Bounce bouncer = Bounce(); // создаем экземпляр класса Bounce
unsigned long pressed_moment; // счетчик времени нажатия

// Установки светодиодов:
int brightness = 0; // начальная яркость
int fadeAmount = 7; // шаг изменеия яркости
unsigned long inter = 100; // частота мигания при запуске
unsigned long currentTime; // счетчик времени
unsigned long loopTime; // период сид
unsigned long RpreviousMillis; // период сид

void setup() // настройка
{
  attachInterrupt(0, tahometr, FALLING); // активация прерывания для тахотера
  pinMode(Dimmer, INPUT); // объявляем режим работы пина
  pinMode(Clutch, INPUT); // объявляем режим работы пина
  pinMode(Button, INPUT); // объявляем режим работы пина
  pinMode(Buzzer, OUTPUT); // объявляем режим работы пина
  pinMode(Rled, OUTPUT); // объявляем режим работы пина
  pinMode(Gled, OUTPUT); // объявляем режим работы пина
  pinMode(Bled, OUTPUT); // объявляем режим работы пина
  pinMode(ACC, OUTPUT); // объявляем режим работы пина
  pinMode(Ign, OUTPUT); // объявляем режим работы пина
  pinMode(Starter, OUTPUT); // объявляем режим работы пина
  digitalWrite(Buzzer, LOW); // выключаем выход
  digitalWrite(Rled, LOW); // выключаем сид
  digitalWrite(Gled, LOW); // выключаем сид
  digitalWrite(Bled, LOW); // выключаем сид
  digitalWrite(ACC, LOW); // выключаем выход
  digitalWrite(Ign, LOW); // выключаем выход
  digitalWrite(Starter, LOW); // выключаем выход
  bouncer .attach(Button); // привязываем библиотеку кнопки к выводу Button
  bouncer .interval(20); // устанавливаем период дребезга = 20 мс
  Serial.begin(9600); // установка Serial-порта на скорость 9600 бит/сек
  currentTime = millis(); // устанавливаем время
  loopTime = currentTime; // синхронизируем время
}


void loop() // основной цикл
{
  currentTime = millis(); // счетчик привязываем ко времени
  if (tz != 0) {
    tz--;
  }
  else
  {
    tp = 0;
  }; // обработка тахометра
  //Serial.print("Tacho: "); // информация в порт
  //Serial.println (tp); // информация в порт
  //delay (500); // задержка

  if (bouncer.update()) // если произошло событие
  {
    if (bouncer.read() == HIGH) { // если кнопка нажата
      pressed_moment = millis(); // запоминаем время нажатия
      tone(Buzzer, 3500, 60); // подаем сигнал что нажата кнопка
    }
    else // кнопка отпущена
    {
      if ((millis() - pressed_moment) < pressed_long && (millis() - pressed_moment) > 300) { // если кнопка удерживалась более 300 мс но менее длительности долговременного нажатия
        if (regim == 2) { // если 2 режим
          tone(Buzzer, 3500, 60); // звуковой сигнал
          delay(100); // задержка
          tone(Buzzer, 3500, 60); // звуковой сигнал
          regim = 1; // возвращаемся в 1 режим
          pressed_moment = 0; // обнуляем момент нажатия
          goto rej1; // переход на 1 режим
        }
      }
      if ((millis() - pressed_moment) < pressed_long && (millis() - pressed_moment) > 300) { // если кнопка удерживалась более 300 мс но менее длительности долговременного нажатия
        if (regim == 3) { // если 3 режим
          tone(Buzzer, 3500, 60); // звуковой сигнал
          delay(100); // задержка
          tone(Buzzer, 3500, 60); // звуковой сигнал
          regim = 2; // возвращаемся в 2 режим
          pressed_moment = 0; // обнуляем момент нажатия
          goto rej2; // переход на 2 режим
        }
      }
      if ((millis() - pressed_moment) < pressed_long) { // если кнопка была нажата кратковременно
        if (regim == 0) { // если был включен 0
          regim = 4; //  устанавливаем 4 режим
          pressed_moment = 0; // обнуляем момент нажатия
          goto rej4; // переход на 4 режим
        }
        if (regim == 4 && digitalRead(Clutch) == !HIGH) { // если был включен 4 режим и нажато сцепление
          regim = 2; //  устанавливаем 2 режим
          pressed_moment = 0; // обнуляем момент нажатия
          goto rej2; // переход на 2 режим
        }
        if (digitalRead (Clutch) == !LOW) { // сцепление при этом не нажато
          regim++; // увеличиваем счетчик текушего режима
          if (regim > 3) { // при достижении максимального режима
            regim = 1; // возвращаемся в 1 режим
          }
          pressed_moment = 0; // обнуляем момент нажатия
        }
        else
        {
          if (regim == 4) { //если был включен 4 режим
            regim = 1; // устанавливаем 1 режим
            pressed_moment = 0; // обнуляем момент нажатия
            goto rej1; // переход на 1 режим
          }
          else // иначе, если нажато сцепление:
          {
            regim = 5; // устанавливаем 5 режим
            pressed_moment = 0; // обнуляем момент нажатия
            delay(200); // задержка
            tone(Buzzer, 3500, 100); // звуковой сигнал
            delay(200); // задержка
            tone(Buzzer, 3500, 100); // звуковой сигнал
            goto rej5; // переход на 5 режим
          }
        }
      }
    }
  }
  if ((pressed_moment > 0) && ((millis() - pressed_moment) > pressed_long)) { // кнопка удерживалась долго
    if (regim == 1 || regim == 2 || regim == 3) { // если 1, 2 или 3 режим
      regim = 5; // устанавливаем 5 режим
      pressed_moment = 0; // обнуляем момент нажатия
      tone(Buzzer, 3500, 100); // звуковой сигнал
      delay(200); // задержка
      tone(Buzzer, 3500, 100); // звуковой сигнал
      delay(200); // задержка
      tone(Buzzer, 3500, 100); // звуковой сигнал
      goto rej5; // переход на 5 режим
    }
    if (regim == 0) { // если 0 режим
      regim = 4; // то устанавливаем 4 режим
      pressed_moment = 0; // обнуляем момент нажатия
      goto rej4; // переход на 4 режим
    }
    if (regim == 4) { // если 4 режим
      regim = 1; // то устанавливаем 1 режим
      pressed_moment = 0; // обнуляем момент нажатия
      goto rej1; // переход на 1 режим
    }
  }

  if (regim == 0) // нулевой режим - автозапуск
  { rej0: // ссылка на 0 режим
    if (tp < 10) { // если заглох
      regim = 1; // устанавливаем 1 режим
      goto rej1; // переход на 1 режим
    }
    if (digitalRead(Clutch) == !HIGH) { // если нажали сцепление
      regim = 4; // устанавливаем 4 режим
      goto rej4; // переход на 4 режим
    }
    digitalWrite(ACC, LOW); // аксессуары выключены
    digitalWrite(Ign, LOW); // зажигание выключено
    digitalWrite(Starter, LOW); // стартер отключен
    static unsigned long previousMillis = 0;
    if (millis() - previousMillis > INTERVAL) {
      previousMillis = millis();
      digitalWrite(Rled, !digitalRead(Rled)); // мигаем красным
    }
    digitalWrite(Gled, LOW); // зеленый сид выключен
    digitalWrite(Bled, LOW); // синий сид выключен
    Serial.println("Engine autostart"); // передаем режим работы
  }

  if (regim == 1) // первый режим - все выключено
  { rej1: // ссылка на 1 режим
    if (tp >= ob_start) { // если двигатель заведен с автозапуска
      regim = 0; // устанавливаем 0 режим
      goto rej0; // переход на 0 режим
    }
    digitalWrite(ACC, LOW); // аксессуары отключены
    digitalWrite(Ign, LOW); // зажигание отключено
    digitalWrite(Starter, LOW); // стартер отключен
    digitalWrite(Rled, LOW); // красный сид выключен
    digitalWrite(Gled, LOW); // зеленый сид выключен
    digitalWrite(Bled, LOW); // синий сид выключен
    if (digitalRead(Clutch) == !HIGH) { // если нажато сцепление
      if (currentTime >= (loopTime + 1)) { // проверяем время
        analogWrite(Rled, brightness); // передаём яркость сид
        brightness = brightness + fadeAmount;  // прибавляем шаг изменения яркости
        if (brightness <= 0 || brightness >= 255) {
          fadeAmount = -fadeAmount; // если достигли мин. или макс. значения, то идем в обратную сторону (реверс)
        }
        if (brightness >= 255) {
          brightness = 255; // устанавливаем предел чтобы не мигал
        }
        if (brightness <= 0) {
          brightness = 0; // устанавливаем предел чтобы не мигал
        }
        loopTime = currentTime; // синхронизируем время
      }
    }
    else
    {
      digitalWrite(Rled, LOW); // гасим сид
    }
    Serial.println("All off"); // передаем режим рабоы
  }

  if (regim == 2) // второй режим - включены аксессуары
  { rej2: // ссылка на 2 режим
    digitalWrite(ACC, HIGH); // аксессуары включены
    digitalWrite(Ign, LOW); // зажигание отключено
    digitalWrite(Starter, LOW); // стартер отключен
    digitalWrite(Rled, LOW); // красный сид выключен
    if (analogRead(Dimmer) >= 200) {
      analogWrite(Gled, 50); // если включены габариты зеленый снижает яркость чтобы не слепить
    }
    else
    {
      digitalWrite(Gled, HIGH); // иначе зеленый сид включен
    }
    digitalWrite(Bled, LOW); // синий сид выключен
    if (digitalRead(Clutch) == !HIGH) { // если нажато сцепление
      if (currentTime >= (loopTime + 1)) { // проверяем время
        digitalWrite(Gled, LOW); // выключаем зеленый сид
        analogWrite(Rled, brightness); // передаём яркость сид
        brightness = brightness + fadeAmount;  // прибавляем шаг изменения яркости
        if (brightness <= 0 || brightness >= 255) {
          fadeAmount = -fadeAmount; // если достигли мин. или макс. значения, то идем в обратную сторону (реверс)
        }
        if (brightness >= 255) {
          brightness = 255; // устанавливаем предел чтобы не мигал
        }
        if (brightness <= 0) {
          brightness = 0; // устанавливаем предел чтобы не мигал
        }
        loopTime = currentTime; // синхронизируем время
      }
    }
    else
    {
      digitalWrite(Rled, LOW); // гасим сид
      if (analogRead(Dimmer) >= 200) { // восстанавливем сид
        analogWrite(Gled, 50); // если включены габариты зеленый снижает яркость чтобы не слепить
      }
      else
      {
        digitalWrite(Gled, HIGH); // иначе зеленый сид включен
      }
    }
    Serial.println("ACC"); // передаем режим работы
  }

  if (regim == 3) // третий режим - включено зажигание
  { rej3: // ссылка на 3 режим
    if (tp >= ob_start) { // если двигатель работает
      regim = 4; // устанавливаем 4 режим
      goto rej4; // переход на 4 режим
    }
    digitalWrite(ACC, HIGH); // аксессуары включены
    digitalWrite(Ign, HIGH); // зажигание включено
    digitalWrite(Starter, LOW); // стартер отключен
    digitalWrite(Rled, LOW); // красный сид выключен
    digitalWrite(Gled, LOW); // зеленый сид выключен
    if (analogRead(Dimmer) >= 200) {
      analogWrite(Bled, 50); // если включены габариты синий снижает яркость чтобы не слепить
    }
    else
    {
      digitalWrite(Bled, HIGH); // иначе синий сид включен
    }
    if (digitalRead(Clutch) == !HIGH) { // если нажато сцепление
      if (currentTime >= (loopTime + 1)) { // проверяем время
        digitalWrite(Bled, LOW); // синий сид выключен
        analogWrite(Rled, brightness); // передаём яркость сид
        brightness = brightness + fadeAmount;  // прибавляем шаг изменения яркости
        if (brightness <= 0 || brightness >= 255) {
          fadeAmount = -fadeAmount; // если достигли мин. или макс. значения, то идем в обратную сторону (реверс)
        }
        if (brightness >= 255) {
          brightness = 255; // устанавливаем предел чтобы не мигал
        }
        if (brightness <= 0) {
          brightness = 0; // устанавливаем предел чтобы не мигал
        }
        loopTime = currentTime; // синхронизируем время
      }
    }
    else
    {
      digitalWrite(Rled, LOW); // гасим сид
      if (analogRead(Dimmer) >= 200) { // восстанавливаем сид
        analogWrite(Bled, 50); // если включены габариты синий снижает яркость чтобы не слепить
      }
      else
      {
        digitalWrite(Bled, HIGH); // иначе синий сид включен
      }
    }
    Serial.println("Ignition"); // передаем режим работы
  }

  if (regim == 4) // четвертый режим - основной рабочий
  { rej4: // ссылка на 4 режим
    if (tp < 10) { // если заглох
      regim = 3; // устанавливаем 3 режим
      goto rej3; // переход на 3 режим
    }
    digitalWrite(ACC, HIGH); // аксессуары включены
    digitalWrite(Ign, HIGH); // зажигание включено
    digitalWrite(Starter, LOW); // стартер отключен
    if (analogRead(Dimmer) >= 200) {
      analogWrite(Rled, 50); // если включены габариты красный снижает яркость чтобы не слепить
    }
    else
    {
      digitalWrite(Rled, HIGH); // иначе красный сид включен
    }
    digitalWrite(Gled, LOW); // зеленый сид выключен
    digitalWrite(Bled, LOW); // синий сид выключен
    Serial.println("Engine on"); // передаем режим работы
  }

  if (regim == 5) // пятый режим - пуск двигателя
  { rej5: // ссылка на 5 режим
    if (tp >= ob_start) { // если двигатель работает
      regim = 4; // устанавливаем 4 режим
      goto rej4; // переход на 4 режим
    }
    digitalWrite(ACC, LOW); // аксессуары отключены
    digitalWrite(Ign, HIGH); // зажигание включено
    digitalWrite(Gled, LOW); // зеленый сид выключен
    digitalWrite(Bled, LOW); // синий сид выключен
    //delay (1000); // задержка на бензонасос и датчики
    previousMillis = millis(); // время для ограничения стартера
    RpreviousMillis = millis(); // время для мигания красного сид
    if (bouncer.read() == LOW && digitalRead(Clutch) == !HIGH) // если кнопка отпущена и нажато сцепление
    { auto_start: // подпрограмма автозапуска
      currentTime = millis(); // текущее время
      if (currentTime - RpreviousMillis > inter) {
        RpreviousMillis = currentTime;  // мигание сид
        digitalWrite(Rled, !digitalRead(Rled));
      }
      if (tp <= ob_start && digitalRead(Clutch) == !HIGH) { // если не заведена, но сцепление нажато
        digitalWrite(Starter, HIGH); // включаем стартер
        Serial.print("Starter on auto"); // информация в порт
        Serial.println (tp); // информация в порт
      }
      if (tp >= ob_start) { // если завелась
        digitalWrite(Starter, LOW); // отключаем стартер
        regim = 4; // устанавливаем 4 режим
        Serial.println("Start ok"); // информация в порт
        goto rej4; // переход на 4 режим
      }
      if (digitalRead(Clutch) == !LOW) { // если отпустили сцепление
        digitalWrite(Starter, LOW);  // отключаем стартер
        tone (Buzzer, 3500, 1000); // звуковой сигнал
        regim = 3; // устанавливаем 3 режим
        Serial.println("Error: clutch"); // информация в порт
        goto rej3; // переход на 3 режим
      }
      if (currentTime - previousMillis > astop_Starter) { // если сработал таймаут
        digitalWrite(Starter, LOW); // отключаем стартер
        tone (Buzzer, 3500, 1000); // звуковой сигнал
        regim = 3; // устанавливаем 3 режим
        Serial.println("Error: timeout"); // информация в порт
        goto rej3; // переход на 3 режим
      }
      if (digitalRead(Button) == HIGH) { // если еще раз нажали кнопку
        digitalWrite(Starter, LOW); // отключаем стартер
        regim = 3; // устанавливаем 3 режим
        Serial.println("Error: press button"); // информация в порт
        delay (1000); // задержка
        goto rej3; // переход на 3 режим
      }
      goto auto_start; // возврат в начало подпрограммы автозапуска
    }
    else // если не сработало первое правило (кнопка отпущена нажато сцепление)
    { manual_start: // подпрограмма ручного запуска
      if (digitalRead(Button) == HIGH) { // кнопка нажата, начинается ручной запуск
        currentTime = millis(); // текущее время
        if (currentTime - RpreviousMillis > inter) {
          RpreviousMillis = currentTime;  // мигаем сид
          digitalWrite(Rled, !digitalRead(Rled));
        }
        digitalWrite(Starter, HIGH); // включаем стартер
        Serial.print("Starter on manual"); // информация в порт
        Serial.println (tp); // информация в порт
      }
      else // если отпустили кнопку
      {
        digitalWrite(Starter, LOW); // отключаем стартер
        regim = 3; // устанавливаем 3 режим
        Serial.println("Start off"); // информация в порт
        goto rej3; // переход на 3 режим
      }
      if (currentTime - previousMillis > mstop_Starter) { // если сработал таймаут
        digitalWrite(Starter, LOW); // отключаем стартер
        tone (Buzzer, 3500, 1000); // звуковой сигнал
        regim = 3; // устанавливаем 3 режим
        Serial.println("Error: timeout"); // информация в порт
        goto rej3; // переход на 3 режим
      }
      goto manual_start; // возврат в начало подпрограммы ручного запуска
    }
  }
}

void tahometr() { // подпрограмма измерения оборотов
  if (!tt) {
    micros_th = micros();
  }
  else
  {
    tp = (120000000 / (micros() - micros_th));
  }
  tt = !tt;
  tz = 30;
}

 

b707
Offline
Зарегистрирован: 26.05.2017

Вы правда рассчитываете, что в этой портянке с loop()-ом на 400 строк, где миллис перемешаны с делеями, а переходы между режимами происходят по goto - кто-то станет разбираться ради того, чтоб у вас светик плавно разгорался? :)

Вы о процедурах и функциях никогда не слыхали?

mralvad
Offline
Зарегистрирован: 22.11.2016

код не мой, допилил под себя, может кому чисто ради интереса - поможет, не могогут силно не огорчусь

b707
Offline
Зарегистрирован: 26.05.2017

mralvad пишет:

код не мой, допилил под себя, может кому чисто ради интереса - поможет

код отвратительный, я бы тем, кто такое выкладывает "может кому пригодится" - давал бы медаль "г-кодер"

Его нужно переписать от начала и до конца.

mralvad
Offline
Зарегистрирован: 22.11.2016

b707 пишет:

mralvad пишет:

код не мой, допилил под себя, может кому чисто ради интереса - поможет

код отвратительный, я бы тем, кто такое выкладывает "может кому пригодится" - давал бы медаль "г-кодер"

Его нужно переписать от начала и до конца.

если честно работает уже 2 года некогда проблем не было

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

mralvad пишет:

если честно работает уже 2 года некогда проблем не было

И чего же Вы тогда хотите?

Я полностью разделяю точку зрения b707, что существует только 2 варианта:

1. Переписывать с нуля.

2. Пользоваться тем, что есть.

mralvad
Offline
Зарегистрирован: 22.11.2016

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