Прошу помощи с кодом для реализации поворотников на моте

Maglink
Offline
Зарегистрирован: 22.04.2017

 

Приветствую!

Прошу помощи знатоков, т.к. сам в программирование ноль, нужен код для реализации реле поворотников на моте, т.к. родное реле кончилось...

Имеем в арсенали три не фиксированных кнопки - левый поворот, правый поворот, выключить моргание...

Одна фиксированая кнопка - аварийка...

Алгаритм представляю себе такой:

Проверяем состояние кнопки аварийки: 1. вкл.- останавливаем все и моргаем левым и правым 2. выкл. - проверяем состояния остальных кнопок

Кнопка левый поворот: 1. нажали один раз - моргаем пока не нажали стоп либо правый поворот или кнопка аварийки

Кнопка правый поворот: 1. нажали один раз - моргаем пока не нажали стоп либо левый поворот или кнопка аварийки

Прощу прощения за сумбур...

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Обратитесь вот сюда.

access
Offline
Зарегистрирован: 10.05.2017

так то на мотоцикле положения фиксированые в переключателе, а отключение иде нажатием на сам переключательв исходном положении.

Maglink
Offline
Зарегистрирован: 22.04.2017

Тоже всегда думал, что так, а вот на БМВ не так(((

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Maglink пишет:
Имеем в арсенали три не фиксированных кнопки - левый поворот, правый поворот, выключить моргание...

Одна фиксированая кнопка - аварийка...

Алгаритм представляю себе такой:

Проверяем состояние кнопки аварийки: 1. вкл.- останавливаем все и моргаем левым и правым 2. выкл. - проверяем состояния остальных кнопок

Кнопка левый поворот: 1. нажали один раз - моргаем пока не нажали стоп либо правый поворот или кнопка аварийки

Кнопка правый поворот: 1. нажали один раз - моргаем пока не нажали стоп либо левый поворот или кнопка аварийки

Разумеется можно и так. Но все же правильнее так. Создаете 2 класса кнопок: нефиксированая и фиксированая. Если для нефиксированой нужен 1 обработчик вызываемый при переходе отж-наж, то для фиксированой надо два переходчика отж-наж, наж-отж. Ну еще класс мигающий светодиод для мигания, без обработчиков. Потом пишете обработчики для кнопок для управления кнопок и все. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

qwone,

вот ТС пишет

Maglink пишет:
сам в программирование ноль, нужен код
А Вы ему
qwone пишет:
Создаете 2 класса

Это у Вас такой троллинг? Или Вы невнимательно читали сообщение ТС?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

qwone,

вот ТС пишет

Maglink пишет:
сам в программирование ноль, нужен код
А Вы ему
qwone пишет:
Создаете 2 класса

Это у Вас такой троллинг? Или Вы невнимательно читали сообщение ТС?

в школу отправил, во второй класс )))

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ЕвгенийП пишет:

Это у Вас такой троллинг? Или Вы невнимательно читали сообщение ТС?

А что делать. Сейчас на программирование на Ардуине достигла такого уровня регресса.Что новички даже простейший скетч не могут слепить. Я бы даже кинул цитату: на Ардуине программирования нет.

Maglink
Offline
Зарегистрирован: 22.04.2017

Спасибо за отклик, до компа доберусь, попробую набросать..

Maglink
Offline
Зарегистрирован: 22.04.2017

Решил отписаться, вообщем решил данную задачу)

Сперва написал все с использованием delay()

#define buttonL 2          // кнопка левый указатель
#define buttonR 3          // кнопка правый указатель
#define buttonS 4          // кнопка стоп
#define buttonA 5          // кнопка аварийки
#define inL 6              // вывод реле левый указатель
#define inR 7              // вывод реле правый указатеьл

int tekL = HIGH;
int tekR = HIGH;

void setup()
{
 pinMode(buttonL, INPUT);
 pinMode(buttonR, INPUT);
 pinMode(buttonS, INPUT);
 pinMode(buttonA, INPUT);
 pinMode(inL, OUTPUT);    
 pinMode(inR, OUTPUT);
 digitalWrite(buttonL, HIGH);
 digitalWrite(buttonR, HIGH);
 digitalWrite(buttonS, HIGH);
 digitalWrite(buttonA, HIGH);
 digitalWrite(inL, HIGH);    
 digitalWrite(inR, HIGH);
}
void loop()

{
  
  tekL = digitalRead(buttonL);
  tekR = digitalRead(buttonR);
       while(tekL == LOW && digitalRead(buttonS) == HIGH && digitalRead(buttonR) == HIGH && digitalRead(buttonA) == HIGH)
       {
        digitalWrite(inL, LOW);
        delay(350); 
        digitalWrite(inL, HIGH);
        delay(350);      
       }
       while(tekR == LOW && digitalRead(buttonS) == HIGH && digitalRead(buttonL) == HIGH&& digitalRead(buttonA) == HIGH)
       { 
        digitalWrite(inR, LOW);
        delay(350); 
        digitalWrite(inR, HIGH);
        delay(350);
       }
       while(digitalRead(buttonA) == LOW)
       {
        digitalWrite(inR, LOW); 
        digitalWrite(inL, LOW);
        delay(350); 
        digitalWrite(inR, HIGH);
        digitalWrite(inL, HIGH);
        delay(350);
       }
   if (digitalRead(buttonS) == LOW){
     tekL = HIGH;
     tekR = HIGH;
   }
}

но меня не устроил данный вариант, поэтому я его переработал во второй вариант

#define buttonL 2          // кнопка левый указатель
#define buttonR 3          // кнопка правый указатель
#define buttonS 4          // кнопка стоп
#define buttonA 5          // кнопка аварийки
#define inL 6              // вывод реле левый указатель
#define inR 7              // вывод реле правый указатеьл

int tekL = HIGH;
int tekR = HIGH;

void setup()
{
 pinMode(buttonL, INPUT);
 pinMode(buttonR, INPUT);
 pinMode(buttonS, INPUT);
 pinMode(buttonA, INPUT);
 pinMode(inL, OUTPUT);    
 pinMode(inR, OUTPUT);
 digitalWrite(buttonL, HIGH);
 digitalWrite(buttonR, HIGH);
 digitalWrite(buttonS, HIGH);
 digitalWrite(buttonA, HIGH);
 digitalWrite(inL, HIGH);    
 digitalWrite(inR, HIGH);
}
uint32_t ms, ms1 = 0;
bool led_stat    = true;
bool ll = true;
bool lr = true;

void loop() {
   ms = millis();
   if(digitalRead(buttonL) == LOW)
   { tekL = LOW;
     tekR = HIGH; }
   if(digitalRead(buttonR) == LOW)
   { tekR = LOW;
     tekL = HIGH; }
   if(tekL == LOW)
       {
       digitalWrite(inR, HIGH);
         if(( ms - ms1 ) > 400 || ms < ms1 )
           {
             ms1 = ms;
             digitalWrite(inL, ll); 
             ll = !ll;
           }
       }
   if(tekR == LOW)
       {
       digitalWrite(inL, HIGH);
         if(( ms - ms1 ) > 400 || ms < ms1 )
           {
             ms1 = ms;
             digitalWrite(inR, lr); 
             lr = !lr;
           }
       }
   if(digitalRead(buttonS) == LOW)
       {
       tekR = HIGH; 
       digitalWrite(inR, HIGH);
       tekL = HIGH;
       digitalWrite(inL, HIGH);
       }
    if(digitalRead(buttonA) == LOW)
       { 
         tekL = HIGH;
         tekR = HIGH;  
         if( ( ms - ms1 ) > 400 || ms < ms1 ){
         ms1 = ms;   
         digitalWrite(inL, led_stat); 
         digitalWrite(inR, led_stat); 
         led_stat = !led_stat;
       }
       }
   if(digitalRead(buttonA) == HIGH && digitalRead(inL) == LOW && digitalRead(inR) == LOW)
       {
         digitalWrite(inL, HIGH);    
         digitalWrite(inR, HIGH);
       }
}

Этот вариант устраивает больше, но тоже есть свои нюансы, но работает гараздо лучше чем в первом исполнении)

Может кто-нибудь укажет на явные ошибки?

т.к. сам только начинаю в этом разбираться)))

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Maglink.Держите код. Код простой, хотя вам покажется сложным. В 2017 уже нет простых вещей. Все вещи сложные, даже те что делают простые вещи.

/*to_Maglink.ino
   светодиод Led_Right -> 6 1 горит /0 нет                            Правый поворот
   светодиод Led_Left  -> 7 1 горит /0 нет                            Левый поворот
   кнопка    Right     -> 2 0 нажата/1 нет программная подтядка на+5B Вкл правый поворот
   кнопка    Left      -> 3 0 нажата/1 нет программная подтядка на+5B Вкл левый поворот
   кнопка    No_blink  -> 4 0 нажата/1 нет программная подтядка на+5B Выкл мигание
   кнопка    Emergency -> 5 0 нажата/1 нет программная подтядка на+5B Аварийка фикст
*/
//--------------------class Cl_Led------------------------
class Cl_Led {
    byte pin;
    bool led = 0;
    bool stat_blink; // 0 не мигать /1 мигать
  public:
    Cl_Led *pnt = NULL;
    Cl_Led(byte _pin): pin(_pin) {}
    uint32_t past = 0 ;
    uint32_t time = 0 ;
    void setup() {
      if (this->pnt != NULL) this->pnt->setup();
      pinMode (pin, OUTPUT);
      digitalWrite(pin, LOW);
      stat_blink = 0; // выкл мигание
    }
    void ON() {
      digitalWrite(pin, HIGH);
      stat_blink = 0; // выкл мигание
    }
    void blink(uint32_t _time = 1000) {
      stat_blink = 1; // вкл мигание
      time = _time;
      past = millis();
      digitalWrite(pin, led = 1);
    }
    void OFF() {
      digitalWrite(pin, led = 0);
      stat_blink = 0; // выкл мигание
    }
    void loop() {
      if (this->pnt != NULL) this->pnt->loop();
      if (stat_blink && millis() - past >= time) {
        digitalWrite(pin, led = !led);
      }
    }
};
//----------------class Cl_Btn----------------------------
class Cl_Btn {
    byte pin ; // номер ноги на кнопке
    void (* Do1)(), (* Do2)();
    bool btn, btn_old;
    bool bounce_btn = 0; // антидребезговый флаг
    uint32_t past = 0 ;
  public:
    Cl_Btn *pnt = NULL;
    Cl_Btn(byte _pin, void (* _Do1)(), void (* _Do2)())
      : pin(_pin), Do1(_Do1), Do2(_Do2) {};
    void setup() {
      if (this->pnt != NULL) this->pnt->setup();
      pinMode(pin, INPUT_PULLUP);// подключить кнопку 1 с подтяжкой
      btn = digitalRead(pin); // прочитать реальное значение на выводе};
    }
    void loop() {
      if (this->pnt != NULL) this->pnt->loop();
      if (! bounce_btn && btn != digitalRead(pin)) { // если прошел фронт изм на выводн
        bounce_btn = 1;                                 // выставить флаг
        past = millis();                         // сделать временую засветку
      }
      else if ( bounce_btn && millis() - past >= 5 ) { // если прошло антидребезговое время
        bounce_btn = 0;      // то снять флаг
        btn_old = btn ;
        btn = digitalRead(pin) ; // прочитать реальное значение на выводе
        if (btn_old && !btn)  Do1();
        if (!btn_old && btn)  Do2();
      }
    }
};
//-----------------class Cl_sys---------------------------
class Cl_sys {
    Cl_Led * StartLed = NULL;
    Cl_Btn * StartBtn = NULL;
  public:
    Cl_sys() {};
    void setup() {
      StartLed->setup();
      StartBtn->setup();
    };
    void loop() {
      StartLed->loop();
      StartBtn->loop();
    };
    void Plug(Cl_Led * Led) {
      Led->pnt = StartLed;
      StartLed = Led;
    };
    void Plug(Cl_Btn * Btn) {
      Btn->pnt = StartBtn;
      StartBtn = Btn;
    };
};
//--------------------------------------------
Cl_Led Led_Right(6);// подключить светодиод1 на выв 6
Cl_Led Led_Left(7);// подключить светодиод2 на выв 7
void none() {} // заглушка
void Do_Right() {  // включить прав поворот
  Led_Right.blink(500); // 0,5 вкл - 0,5 выкл
}
void Do_Left() {  // включить левый поворот
  Led_Left.blink(500);// 0,5 вкл - 0,5 выкл
}
void Do_No_blink() {  // выключить мигание
  Led_Right.OFF();
  Led_Left.OFF();
}
void Do_Emergency() {  // включить аварийку поворот
  Led_Left.blink(500);// 0,5 вкл - 0,5 выкл
  Led_Left.blink(500);// 0,5 вкл - 0,5 выкл
}
Cl_Btn Right    (2 , Do_Right    , none       ) ;// подключить кнопку на выв 2
Cl_Btn Left     (3 , Do_Left     , none       ) ;// подключить кнопку на выв 3
Cl_Btn No_blink (4 , Do_No_blink , none       ) ;// подключить кнопку на выв 4
Cl_Btn Emergency(5 , Do_Emergency, Do_No_blink) ;// подключить кнопку на выв 5
Cl_sys Sys;

void setup() {
  Sys.Plug(&Led_Right);
  Sys.Plug(&Led_Left );
  Sys.Plug(&Right    );
  Sys.Plug(&Left     );
  Sys.Plug(&No_blink );
  Sys.Plug(&Emergency);
  Sys.setup();
}
void loop() {
  Sys.loop();
}