задержка, таймер, импульс. Как реализовать ?

Тема в разделе "Arduino & Shields", создана пользователем aavs, 26 янв 2017.

  1. aavs

    aavs Нерд

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

    Читал материалы но немного запутался в обилии библиотек методов реализации.

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

    void setup() {
    pinMode(8, OUTPUT); // 8 пин - Включает реле c задержкой 1 сек. до окончания отключения кнопки и повторного срабатывания 6 пина.
    pinMode(7, OUTPUT); // 7 пин - Включает реле сразу но на 5 сек. после отключается и бездействует до повторного срабатывания 6 пина.
    pinMode(6, INPUT); // 6 пин - Кнопка с фиксацией подключена к земле и по умолчанию 0
    digitalWrite(6, HIGH); //подключаем подтягивающий резистор
    }

    void loop() {
    digitalWrite(7, !digitalRead(6));
    digitalWrite(8, !digitalRead(6));
    }

    -------------------------------------------------------------------------------------------------------------------------------

    Также необходимо сделать один из выходов, выводом который будет давать импульсы на протяжении всего срабатывания 7 пина с частатой 0,25 сек.


    Пожалуйста подскажите как это правильно реализовать.
     
  2. mcureenab

    mcureenab Гуру

    Пользуйтесь разметкой кода.
    Код (C++):
    void setup() {
    ...
        pinMode(6,  INPUT_PULLUP); // 6 пин - Кнопка с фиксацией подключена к земле и по умолчанию 0,   подключаем подтягивающий резистор
    }
     
     
  3. mcureenab

    mcureenab Гуру

    С утра не врубаюсь в режимы работы реле.
    Можно по шагам написать в форме воздействие - реакция?

    Кейс 1 (кнопка, время, пин 7, генератор 4 Гц).
    Кнопка нажата - пин 7, генератор включены.
    Прошло 5 сек - пин 7, генератор выключены.
    Кнопка отпущена - нет реакции.

    Кейс 2 (кнопка, время, пин 7).
    Кнопка нажата - пин 7, генератор включены.
    Кнопка отпущена - нет реакции.
    Прошло 5 сек - пин 7, генератор выключены.

    Кейс 3 (кнопка, время, пин 8).
    Кнопка нажата - нет реакции.
    Прошла 1 сек - пин 8 включен.
    Кнопка отпущена - пин 8 выключен.

    Кейс 4 (кнопка, время, пин 8).
    Кнопка нажата - нет реакции.
    Кнопка отпущена - нет реакции.
    Прошла 1 сек - нет реакции.

    Далее по кейсам будете проверять работу устройства.
     
  4. rkit

    rkit Гуру

    Начните с чего-то одного. Не надо с первой же попытки пытаться сделать сложное многоэтажное устройство.
     
  5. aavs

    aavs Нерд

    Дело в том что у меня вышло устройство из строя и его необходимо сделать. для этого нужно это действие.
     
  6. mcureenab

    mcureenab Гуру

    Кейсы правильно расписаны?
     
  7. aavs

    aavs Нерд

    Простите, какие ? Что есть кейсы?
     
  8. rkit

    rkit Гуру

    Тем не менее с места взлететь у вас не получится. Всё делается последовательно.
     
  9. mcureenab

    mcureenab Гуру

    Вы какую часть сообщений читаете???

     
  10. aavs

    aavs Нерд

    Конечно последовательно.
    Читал и смотрел и в примерах везде МК без фиксации. Что упростило бы мне задачу. Но в моем случает с фиксацией и необходимо что бы 7 пин работал 5секунд на частоте которую можно будет указать в переменной
     
  11. aavs

    aavs Нерд

    Я прочел ваше сообщение. Если все правильно понял то так оно и должно быть. Но как это записать в скетч
     
  12. aavs

    aavs Нерд

    Давайте начнем с того что нужно при нажатии на кнопку подать сигнал на 7 пин который будет работать 5 секунд и после этого сигнал пропадет.
     
  13. mcureenab

    mcureenab Гуру

    Код (C++):
    // VeRsIoN 9

    void setup() {
      digitalWrite(7, HIGH);
      digitalWrite(8, HIGH);
      digitalWrite(9, HIGH);
      pinMode(9, OUTPUT); // Генератор 4 Гц
      pinMode(8, OUTPUT); // 8 пин - Включает реле c задержкой 1 сек. до окончания отключения кнопки и повторного срабатывания 6 пина.
      pinMode(7, OUTPUT); // 7 пин - Включает реле сразу но на 5 сек. после отключается и бездействует до повторного срабатывания 6 пина.
      pinMode(6, INPUT_PULLUP); // 6 пин - Кнопка с фиксацией подключена к земле и по умолчанию 0
    }

    void loop(){
      static boolean btn_on1 = false; // Изначально считаем что кнопка отпущена.
      static unsigned long pin7_time = 0; // Таймер пина 7. Не активен
      static unsigned long pin8_time = 0; // Таймер пина 8. Не активен
      static unsigned long pin9_time = 0; // Таймер генератора 4Гц на пин 9. Не активен
      unsigned long time = millis();
      boolean btn_on2 = digitalRead(6) == LOW; // Кнопка нажата, ключ замкнут на GND.
      if ( btn_on1 != btn_on2 ) { // Кнопка изменила состояние.
          btn_on1 = btn_on2;
          if ( btn_on1 ) { // Кнопка нажата.
            digitalWrite(7, LOW);
            digitalWrite(9, LOW); // Сразу подаем периодический импульс
            pin7_time = time + 5000; // 5 сек
            pin8_time = time + 1000; // 1 сек
            pin9_time = time + 250 / 2; //  Полупериод 4Гц.
          } else { // Кнопка отпущена.
            digitalWrite(7, HIGH);// Отключаем все пины
            digitalWrite(8, HIGH);
            digitalWrite(9, HIGH);
            pin7_time = 0; // Прекращаем ожидание
            pin8_time = 0;
            pin9_time = 0;
          }
      }
      if ( pin7_time && (pin7_time <= time) ) { // Время pin7 истекло. Выключаем.
        digitalWrite(7, HIGH);
        digitalWrite(9, HIGH);
        pin7_time = 0;
        pin9_time = 0;
      }
      if ( pin8_time && (pin8_time <= time) ) { // Время pin8 истекло. Включаем.
        digitalWrite(8, LOW);
        pin8_time = 0;
      }
      if ( pin9_time && (pin9_time <= time) ) { // Время pin9 истекло. Включаем.
        if( LOW == digitalRead(9)) {
            digitalWrite(9, HIGH);
        } else {
            digitalWrite(9, LOW);
        }
        pin9_time = pin9_time + 250 / 2; // Еще полупериод 4Гц.
      }
    }
     
    Последнее редактирование: 27 янв 2017
  14. mcureenab

    mcureenab Гуру

    Возможно. Я не проверял.
    Ошибка секретная?
     
  15. aavs

    aavs Нерд

    Хорошо, спасибо. но вот только ругается при проверке на строку:
    if ( pin9_time && pin9_time <= time ) { // Время pin9 истекло. Включаем.
     
  16. aavs

    aavs Нерд

    Код (C++):

    sketch_jan26h:21: error: expected unqualified-id before 'if'

       if ( pin7_time && pin7_time <= time ) { // Время pin7 истекло. Выключаем.

       ^

    sketch_jan26h:27: error: expected unqualified-id before 'if'

       if ( pin9_time && pin9_time <= time ) { // Время pin9 истекло. Включаем.

       ^

    exit status 1
    expected unqualified-id before 'if'
     
     
  17. mcureenab

    mcureenab Гуру

    Лишняя фигурная скобка осталась. Отредактировал код VeRsIoN 2
     
  18. aavs

    aavs Нерд

    И сново ругается:
    Код (C++):

    C:\Users\Алексей\Documents\Arduino\sketch_jan26i\sketch_jan26i.ino: In function 'void loop()':

    sketch_jan26i:31: error: too many arguments to function 'int digitalRead(uint8_t)'

    In file included from sketch\sketch_jan26i.ino.cpp:1:0:

    C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:135:5: note: declared here

    int digitalRead(uint8_t);

         ^

    exit status 1
    too many arguments to function 'int digitalRead(uint8_t)'
     
     
  19. mcureenab

    mcureenab Гуру

    Этой конструкции хватает примерно на 50 суток:

    Код (C++):
    unsigned long time = millis();
    потом счет с 0 начинается.

    Какая периодичность работы устройства?
     
  20. mcureenab

    mcureenab Гуру

    digitalRead скопипастил из digitalWrite. HIGH остался. поправил

    // VeRsIoN 3