Помоги найти ошибку
- Войдите на сайт для отправки комментариев
Ср, 09/05/2018 - 00:00
Кнопка старт стоп, все работает олично но как всегда есть "НО", при нажатии педали сцепления светодиод в кнопке должен плавно разгораться и тухнуть с определенной скоростью, но почему то в режиме 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; }
Вы правда рассчитываете, что в этой портянке с loop()-ом на 400 строк, где миллис перемешаны с делеями, а переходы между режимами происходят по goto - кто-то станет разбираться ради того, чтоб у вас светик плавно разгорался? :)
Вы о процедурах и функциях никогда не слыхали?
код не мой, допилил под себя, может кому чисто ради интереса - поможет, не могогут силно не огорчусь
код не мой, допилил под себя, может кому чисто ради интереса - поможет
код отвратительный, я бы тем, кто такое выкладывает "может кому пригодится" - давал бы медаль "г-кодер"
Его нужно переписать от начала и до конца.
код не мой, допилил под себя, может кому чисто ради интереса - поможет
код отвратительный, я бы тем, кто такое выкладывает "может кому пригодится" - давал бы медаль "г-кодер"
Его нужно переписать от начала и до конца.
если честно работает уже 2 года некогда проблем не было
если честно работает уже 2 года некогда проблем не было
И чего же Вы тогда хотите?
Я полностью разделяю точку зрения b707, что существует только 2 варианта:
1. Переписывать с нуля.
2. Пользоваться тем, что есть.
Все все я понял, код корявый, надо переписывать, ситуацию со светодиодом переживу, поэтому буду пользоваться что есть, как говорится "не х..й лезть в исправный механизм" тем более что на трех машинах за два года не у кого нареканий не было. Всем спасибо)))