Помоги найти ошибку
- Войдите на сайт для отправки комментариев
Ср, 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. Пользоваться тем, что есть.
Все все я понял, код корявый, надо переписывать, ситуацию со светодиодом переживу, поэтому буду пользоваться что есть, как говорится "не х..й лезть в исправный механизм" тем более что на трех машинах за два года не у кого нареканий не было. Всем спасибо)))