поворотники через резистивный делитель

Тема в разделе "Arduino & Shields", создана пользователем Якутская сила, 19 сен 2018.

  1. Здравствуйте! Я только недавно начала просвещаться по тематике микроконтроллеров, и в том числе ардуино. Идея всего этого действа такая: на базе ардуино создать проводку на мот (свет, поворотники, стопы, стартер, то есть то, что не требует большого ума и опыта). Решено было сделать через резистивный делитель, начала я с поворотников и почти сразу же встряла.
    1. По нажатию кнопки поворотника поворотник должен промигать 20 сек и отключиться автоматически, но так же он должен отключиться при повторном нажатии этого же поворотника. Как это сделать?
    Раз уж спрашиваю, задам кучу вопросов:
    2. Достаточно ли программной защиты от дребезга кнопки, или нужна аппаратная защита, если да, то можно схему?
    3. Как сделать так, что бы во время работы поворотника, к примеру, ардуино реагировала на нажатие на кнопку звукового сигнала?
    4. Сама логика кода адекватна, или надо все было по другому сделать?

    Схему, расчеты и почти весь код я брала отсюда (где схема параллельного подключения) http://codius.ru/articles/Arduino_Подключение_нескольких_кнопок_к_одному_аналоговому_входу

    Код (C++):
    int pinIn     = A0;
    int keyValue  =  0; // Состояние покоя
    int TurnR = 1;
    int TurnL = 2;
    int light = 3;
    int hotn = 4;
    int pinTurnR = 11;
    int pinTurnL = 12;
    long prevMillis = 0;


    void setup() {
      pinMode(pinIn, INPUT);
      pinMode (pinTurnR, OUTPUT);
      pinMode (pinTurnL, OUTPUT);
      Serial.begin(9600);
    }

    void loop()
    {
      int newKeyValue = GetKeyValue(); // Получаем актуальное состояние кнопок с коррекцией дребезга, вызываем функцию описанную ниже

      if (keyValue != newKeyValue) {  // Если новое значение не совпадает со старым - реагируем на него, сравниваем значения которое было, с которым появилось
        keyValue = newKeyValue;       // Актуализируем переменную хранения состояния, приравниваем старую переменную к новому значение

        if (keyValue > 0) {  // Если значение больше 0, значит кнопка нажата, если кнопка нажата, то сигнал больше 1

          if (TurnR == keyValue){

          Serial.println("TurnR " + String(keyValue));//выводим на экран номер нажатой кнопки
          int i = 0;
          while( i<=14) { newKeyValue = GetKeyValue();
             
                    if (newKeyValue !=0 && newKeyValue !=4 && newKeyValue !=3 && newKeyValue!=keyValue)  break;
                                                keyValue = newKeyValue;                                                                          
                                            digitalWrite (pinTurnR, 1);//мигание светодиода 20 сек("1" - 1 сек, "0" - 0,5сек)
                                              delay (1000);
                                              digitalWrite (pinTurnR, 0);
                                            delay (500);
                                       
                                            i++;
                             }        
                           i = 0;
                                }          
           
          if (TurnL == keyValue){
          Serial.println("TurnL " + String(keyValue));
          int i = 0;
         while (i<=14 ) {
             
                    newKeyValue = GetKeyValue();
             
                    if (newKeyValue != keyValue && newKeyValue!=0 )  break;
                                                keyValue = newKeyValue;
                                     
                                              digitalWrite (pinTurnL, 1);//мигание светодиода 20 сек("1" - 1 сек, "0" - 0,5сек)
                                               delay (1000);
                                                digitalWrite (pinTurnL, 0);
                                                   delay (500);
                                         
                                              i++;
                                       
                         }                   i = 0;
                                     
          }

          if (light == keyValue)
          Serial.println("light " + String(keyValue));
          if (hotn == keyValue)
          Serial.println("hotn " + String(keyValue));
        }
        else if (keyValue < 0) {       // Если -1 - неизвестное состояние, незапрограммированное нажатие
          Serial.println("unknown pressed");
        }
        else {                        // Если 0, то состояние покоя
          Serial.println("all keys are not pressed");
        }
      }

    }



    int GetKeyValue(){
        static int   count = 0;    //счетчик
         if (GetButtonNumberByValue(analogRead(pinIn)) > 0)// если есть сигнал на аналоговом входе то
         {
          if (millis() - prevMillis > 100)
          {
            prevMillis = millis();
            count++;
          }
        }
        else
          count = 0;
        if (count >= 5)
        {
          return GetButtonNumberByValue(analogRead(pinIn));
        }
        if (GetButtonNumberByValue(analogRead(pinIn)) == 0)
          return 0;
        if ((GetButtonNumberByValue(analogRead(pinIn)) < 0))
          return -1;

    }

    int GetButtonNumberByValue(int value) {   // Новая функция по преобразованию кода нажатой кнопки в её номер
      int values[5] = {0, 341, 511, 609, 769};// небольшой массив из значений, которые могут поступить от 4 кнопок на вход
      int error     = 15;                     // Величина отклонения от значений - погрешность
      for (int i = 0; i <= 4; i++) {
        // Если значение в заданном диапазоне values[i]+/-error - считаем, что кнопка определена
        if (value <= values[i] + error && value >= values[i] - error) return i;
      }
      return -1;                              // Значение не принадлежит заданному диапазону
    }
     
     
    Последнее редактирование: 19 сен 2018
  2. b707

    b707 Гуру

    по-моему, на любом моте и так есть поворотники и сигнал - и безо всякого ардуино
     
    Airbus и parovoZZ нравится это.
  3. Большинство знаний получается путем опыта, да и так интереснее во все это вникать. И может быть получиться общую массу проводки уменьшить
     
  4. b707

    b707 Гуру

    это вряд ли (с)
    Лампочки останутся на своих местах, значит и проводов надо столько же. Управлять лампами проще всего посредством реле, тем более что они уже там есть. Так что скорее увеличится - на массу ардуины как минимум :)

    Вы не ответили про резистивный делитель - зачем он там?...
     
  5. Mitrandir

    Mitrandir Гуру

    чтоб все кнопки на 1 аналоговый пин повесить
     
  6. b707

    b707 Гуру

    сорри, у меня никогда не было мопеда - неужели там так много кнопок, что у ардуины не хватит пинов?
     
  7. DetSimen

    DetSimen Guest

    просто приклей, не подключая, ардуину к бензобаку термосоплями и наслаждайся.
     
    Daniil, Airbus и parovoZZ нравится это.
  8. DetSimen

    DetSimen Guest

    Большинство знаний получается, когда с интересом, а не лишбыздать, читаешь умные книшки, например "Искусство схемотехники", или, на худойканец "Занимательная электроника".
     
    Airbus и parovoZZ нравится это.
  9. Vovka

    Vovka Гик

    "Мот" является средством повышенной опасности!
    А тут начинающий пытается что-то делать на микроконтроллере по управлению...
    Эл.помехи, тряска, вода, грязь...
    Ладно, если будет моргать фарой когда не нужно, а если на скорости включится стартер???
    Оставьте эту затею!!!
     
    Daniil и parovoZZ нравится это.
  10. vvr

    vvr Инженерище

    вот народ, барышня мотык тюнингует, а вы вместо помощи критикуете деяние и книжки какие то предлагаете...
    кто то может начать ещё и о безопасности движения трындеть.
    Якутию это всё равно не остановит.
    Я.с. - перед публикацией могли бы смело всё на макете собрать и попробовать, а уже если что не так - вопросы задавать.
    да и код перед тем как народу показывать нужно отформатировать.
     
    vasdor и Mitrandir нравится это.
  11. parovoZZ

    parovoZZ Гуру

    Отладочная информация в коде зачем?
    Где подробные комментарии в коде? Вчитываться в код здесь будут 1-2 человека, остальные пройдут мимо.

    МК не для тех, кто
    Для начала надо подтянуть знания в области электроники. Затем подучить основы программирования.

    Ну или готовить деньги и нанимать репетитора, который всё расскажет и даже сделает.
     
  12. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Если решили изучать Ардуину, изучите заодно и симулятор электронных схем - Протеус. Тут сильно не надо заморачиваться - нарисовал схему с Ардуиной, зуммером, кнопочками и лампочками. Даже не надо деталей, обязательных в реальной схеме - типа ограничительных резисторов, промежуточных реле и тд. - это же симуляшка. Задали виртуальному процессору файл прошивки - и смотрите результат работы именно вашей программы. Милое дело. А уж после - можете и на макетке собирать, и в реале - мотоцикл дербанить, если не жалко.
     

    Вложения:

    • Moto.PNG
      Moto.PNG
      Размер файла:
      15,5 КБ
      Просмотров:
      408
    • Motocikle.ino.zip
      Размер файла:
      5,4 КБ
      Просмотров:
      170
    Последнее редактирование: 19 сен 2018
    vasdor нравится это.
  13. Airbus

    Airbus Радиохулиган Модератор

    А во Вьетнаме вообще поворотники не включают и в зеркала не смотрят.Только бибикають.Услышал гудок справа прими влево иначе сшибут нах.И по теме-надо реально сделать на макетке помигать светодиодами вместо поворотников а потом понять-Оно тебе надо?Да и как тут сказали Ардуино не самый лучший способ.Грязь сырость итд.У меня раз в год задние фонари ВАЗ 21093 начинают жить своей жизнью а ведь там нет электроники и они типа закрыты от внешних условий.Во всем нужен здравый смысл.Хотите изучать Ардуино?На Амперке масса примеров в картинках и кодах.И даже некоторые можно применить в домашнем хозяйстве.
     
    Последнее редактирование: 19 сен 2018
    Vovka, DetSimen и parovoZZ нравится это.