две кнопки, две независимые программы, одна ардуина

Тема в разделе "Arduino & Shields", создана пользователем svjatoy, 30 ноя 2015.

  1. svjatoy

    svjatoy Нуб

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

    так вот задача:
    две кнопки ()думаю на разных портах всё таки или на цапе проще?()
    две резные программы, которые не зависят друг от друга и управляются каждая своей кнопкой.
    1 микросхема (ардуина)

    как должно работать:
    1 кнопка просто включает выключает нагрузку, при удержании кнопки в 5 сек нагрузка начинает моргать(к примеру лампочка) нагрузкой выступает 30а автомобильное реле.

    2 кнопка имеет 3 режима. выкл, вкл 2 лампы, стробоскоп из 2 ламп. каждая лампа жрёт 4 ампера. для реализации стробоскопа реле не пойдёт. соотв вопрос чем заменить. какой нить мощный транзистор?

    итак конкретно я имею след: два кода, две разные программы.

    первая прога под первую кнопку. вопрос по проге как ввести удерживание 5 сек чтоб нагрузка на 13 пине начала моргать.

    вторая прога там всё мне понятно и вопросов по ней нет.

    самый главный вопрос как их правильно соединить в одну программу:

    вот примеры кодов 2 прог:

    1 прога на 1 кнопку:

    01 int flag=0;
    02
    03 void setup()
    04 {
    05
    06 pinMode(13, OUTPUT);
    07
    08
    09 }
    10
    11 void loop()
    12
    13 {
    14
    15 if(digitalRead(14)==HIGH&&flag==0)//если кнопка нажата
    16 // и перемення flag равна 0 , то ...
    17 {
    18
    19 digitalWrite(13,!digitalRead(13));
    20 flag=1;
    21 //это нужно для того что бы с каждым нажатием кнопки
    22 //происходило только одно действие
    23 // плюс защита от "дребезга" 100%
    24
    25 }
    26
    27 if(digitalRead(14)==LOW&&flag==1)//если кнопка НЕ нажата
    28 //и переменная flag равна - 1 ,то ...
    29 {
    30
    31 flag=0;//обнуляем переменную flag
    32 }
    33 }


    вторая прога:
    на 2 кнопку:

    01 int regim=1;
    02 int flag=0;
    03
    04 void setup()
    05 {
    06 pinMode(10,OUTPUT);
    07 pinMode(9,OUTPUT);
    08
    09 }
    10
    11 void loop()
    12
    13 {
    14
    15 if(digitalRead(14)==HIGH&&flag==0)//если кнопка нажата
    16 // и перемення flag равна 0 , то ...
    17 {
    18 regim++;
    19 flag=1;
    20
    21 //это нужно для того что бы с каждым нажатием кнопки
    22 //происходило только одно действие
    23 // плюс защита от "дребезга" 100%
    24
    25 if(regim>3)//ограничим количество режимов
    26 {
    27 regim=1;//так как мы используем только одну кнопку,
    28 // то переключать режимы будем циклично
    29 }
    30
    31 }
    32
    33 if(digitalRead(14)==LOW&&flag==1)//если кнопка НЕ нажата
    34 //и переменная flag равна - 1 ,то ...
    35 {
    36
    37 flag=0;//обнуляем переменную "knopka"
    38 }
    39
    40
    41
    42 if(regim==1)//первый режим
    43 {
    44 digitalWrite(9,LOW);//выключаем все светодиоды
    45 digitalWrite(10,LOW);
    46
    47
    48 //здесь может быть любое ваше действие
    49 }
    50 if(regim==2)//второй режим
    51 {
    52 digitalWrite(10,HIGH);//включае красный светодиод
    53 digitalWrite(9,LOW);
    54
    55 //здесь может быть любое ваше действие
    56 }
    57
    58 if(regim==3)//третий режим
    59 {
    60
    61 digitalWrite(9,HIGH);//включае зеленый светодиод
    62 digitalWrite(10,LOW);
    63
    64
    65 //здесь может быть любое ваше действие
    66 }


    67 }
     
  2. ИгорьК

    ИгорьК Гуру

  3. Tomasina

    Tomasina Сушитель лампочек Модератор

  4. DrProg

    DrProg Вечный нерд

    Простые задачи можно решать без классов. Вот пример двух независимо мигающих светодиодов плюс реакция третьим светодиодом на кнопку:
    Код (C++):
    #define LP1 9
    #define LP2 8
    #define LP3 10
    #define BUTTON 12
    // независимые таймеры событий
    unsigned long timer1;
    unsigned long timer2;

    void setup() {
      pinMode(LP1, OUTPUT);
      pinMode(LP2, OUTPUT);
      pinMode(LP3, OUTPUT);
      pinMode(BUTTON, INPUT_PULLUP);
      // начало отсчета
      timer1 = millis() + 500;
      timer2 = timer1 + 100;
    }

    void loop() {

      // каждые 500мс срабатывает эта часть кода
      if (millis() > timer1) {
        digitalWrite(LP1, !digitalRead(LP1));
        timer1 = millis() + 500;
      }

      // каждые 100мс эта часть
      if (millis() > timer2) {
        digitalWrite(LP2, digitalRead(LP2));
        timer2 = millis() + 100;
      }

      // когда нажата кнопка срабатывает эта часть
      if (!digitalRead(BUTTON)) {
        digitalWrite(LP3, HIGH);
      } else {
        digitalWrite(LP3, LOW);
      }
    }
    Что до дребезга, то остаюсь сторонником аппаратного гашения.
     
    ИгорьК нравится это.
  5. svjatoy

    svjatoy Нуб

    спасибо пошол изучать. если что не получиться спрошу. спасибо. аппаратное гашение лутше чем родное ардуино?
     
  6. DrProg

    DrProg Вечный нерд

    Нет понятия гашения "родное ардуино", есть программное и аппаратное. Программное требует несколько дополнительных строк кода и задерживает процесс на некоторое время, аппаратное упрощает и ускоряет код (чуть усложняя схему подключения кнопок), что для вашего случая более чем предпочтительно.
     
    ИгорьК нравится это.
  7. ИгорьК

    ИгорьК Гуру

    Извиняюсь, а без задержки программно никак?
     
  8. seres

    seres Нуб

    boolean Selest,S; // объявляем переменные
    /*...
    Некоторый код...
    ...*/
    if (Selest && digitalRead(button_pin)) {
    delay(5);
    if (digitalRead(button_pin)){
    S=true;
    /*
    Пишем код...
    */
    }
    if(S) {
    delay(5);
    S=false;
    }

    Задержка работает только тогда, когда сработала кнопка!!!
     
  9. seres

    seres Нуб

    Selest = !(digitalRead(button_pin))
     
  10. DrProg

    DrProg Вечный нерд

    А как выждать пока кнопка успокоится без задержки?
     
    ИгорьК нравится это.
  11. DrProg

    DrProg Вечный нерд

    Для вставки кода используйте специальное окно, кнопка слева от кавычек вот так:
    Код (C++):
    boolean Selest,S; // объявляем переменные
    /*...
    Некоторый код...
    ...*/

    if (Selest && digitalRead(button_pin)) {
    delay(5);
    if (digitalRead(button_pin)){
    S=true;
    /*
    Пишем код...
    */

    }
    if(S) {
    delay(5);
    S=false;
    }
     
     
    ИгорьК нравится это.
  12. ИгорьК

    ИгорьК Гуру

    да, вопрос. Ну, подождём, может кто знает - авось расскажет... :)
     
  13. DrProg

    DrProg Вечный нерд

    Расскажите, не томите! Интересно же как без задержки реализовать эту самую задержку суть которой в том чтобы переждать дребезг.
     
    ИгорьК нравится это.
  14. seres

    seres Нуб

    if(S){ // если кнопка нажата ждём чтобы обнулить "S"
    delay(5);
    S=false;
    }
     
  15. DrProg

    DrProg Вечный нерд

    Вы мой совет про вставку кода прочитали? Почему нет?
     
    ИгорьК нравится это.
  16. seres

    seres Нуб

  17. seres

    seres Нуб

    А понял!
    Код (C++):
    boolean Selest,S;// объявляем переменные
    /*...
    Некоторый код...
    ...*/

    if(Selest && digitalRead(button_pin)){
    delay(5); // ВОТ ТА САМАЯ ЗАДЕРЖКА , ЧТОБЫ ПЕРЕЖДАТЬ ДРЕБЕЗГ!!! МОЖНО И delay(10); ДЛЯ УВЕРЕНОСТИ!!!
    if(digitalRead(button_pin)){
    S=true;
    /*
    Пишем код...
    */

    }
    Selest = !(digitalRead(button_pin)) // переводим в false. от повторного срабатывания
    кнопки
    if(S){
    delay(5);
    S=false;
    }
     
     
  18. DrProg

    DrProg Вечный нерд

    Если нужен сам факт нажатия кнопки, то можно и без пережидания дребезга, все зависит от того что будет делаться дальше. Если возврат к ожиданию очередного нажатия, то этот самый дребезг будет многократно и непредсказуемо нажимать кнопку. Если же уход на какую то достаточно длительную процедуру, то и не обязательно.
     
    ИгорьК нравится это.
  19. ИгорьК

    ИгорьК Гуру

    Спокойствие! Только спокойствие!
    Только в нирвана можно постичь отсутствие разницы между временем мигания лампочки и временем повторной проверки кнопки в вашем гениальном скетче.
     
  20. DrProg

    DrProg Вечный нерд

    Вот оно в чем дело! Оказывается речь шла про мой гениальный скетч который вовсе не переключает лампочку, то есть ему плевать на дребезг в принципе (что и так было понятно). А я то думал мы говорим о сабже которому все таки нужна эта обработка. Ждал еще более гениального скетча в ответ. Но чуда не случилось. (
     
    ИгорьК нравится это.