Разные периоды "горит\не горит" светодиода

Тема в разделе "Arduino & Shields", создана пользователем yden, 12 авг 2016.

  1. yden

    yden Гик

    спасибо
     
  2. ostrov

    ostrov Гуру

    Вот аппарат в ждущем режиме развлекается. Как раз на таком принципе: каждый кадр выдерживается свое заданное время. Один массив с командами и продолжительностью и программка из нескольких строк.


    Разумеется без delay() и его заменителей.
     
  3. yden

    yden Гик

    Что-то затык в коде идет. Заливаю на ардуино - срабатывает, моргает как надо. Но через какое-то время перестает работать. Через какое время - часа через полтора-два.
    Код (C++):

    //функция светодиод кнопки1
    void function_led_button1 (uint16_t time_led_button1_0, uint16_t time_led_button1_1)
    {
      static bool state_led_button1 = 0;       // состояние светодиода
      static uint32_t future_led_button1 = 0;  // время будущего перескока на другое состояние
      if (millis() < future_led_button1) return; // если время не пришло(нужное значение millis() ) то выйти из функции
      state_led_button1 = !state_led_button1;              // время смены пришло поменяйте состояние
      future_led_button1 += state_led_button1 ? time_led_button1_0 : time_led_button1_1 ;
      // определите новое время для перескока если state = 1 то future=future+time_0
      //                                      если state = 0 то future=future+time_1
      digitalWrite(led_button1, state_led_button1);
    }
    Для двух светиков сделал 2 функции - отличаются только button1\button2
     
  4. qwone

    qwone Гик

    static он не даст задуманое. Тут или класс или 2 функции
    Код (C++):
    const int Led1_Pin = 13; // нога светодиода
    const int Led2_Pin = 12; // нога светодиода

    void flashing1_non_stop_program(uint16_t time_0,uint16_t time_2 ) {
      static bool state = 0;
      static uint32_t timing = 0;
      if (millis()<timing) return;
      state = !state;
      timing += state ? time_0 : time_2 ;
      digitalWrite(Led1_Pin, state);
    }
    void flashing2_non_stop_program(uint16_t time_0,uint16_t time_2 ) {
      static bool state = 0;
      static uint32_t timing = 0;
      if (millis()<timing) return;
      state = !state;
      timing += state ? time_0 : time_2 ;
      digitalWrite(Led2_Pin, state);
    }
    void setup() {
    pinMode(Led1_Pin, OUTPUT);
    pinMode(Led2_Pin, OUTPUT);
    }
    void loop() {
       flashing1_non_stop_program(100,900);// 0.1 сек горит 0.9 сек нет
       flashing2_non_stop_program(500,600);// 0.5 сек горит 0.6 сек нет
      // идет продолжение программы без задержки на millis()
    }
     
    Последнее редактирование: 14 авг 2016
  5. qwone

    qwone Гик

    Или же так
    Код (C++):
    const int Led1_Pin = 13; // нога светодиода
    const int Led2_Pin = 12; // нога светодиода

    void flashing1_non_stop_program(int _Pin,uint16_t time_0,uint16_t time_1 ) {
      static bool state = 0;
      static uint32_t timing = 0;
      if (millis()<timing) return;
      state = !state;
      timing += state ? time_0 : time_1 ;
      digitalWrite(_Pin, state);
    }
    void flashing2_non_stop_program(int _Pin,uint16_t time_0,uint16_t time_1 ) {
      static bool state = 0;
      static uint32_t timing = 0;
      if (millis()<timing) return;
      state = !state;
      timing += state ? time_0 : time_1 ;
      digitalWrite(_Pin, state);
    }
    void setup() {
    pinMode(Led1_Pin, OUTPUT);
    pinMode(Led2_Pin, OUTPUT);
    }
    void loop() {
       flashing1_non_stop_program(Led1_Pin,100,900);// 0.1 сек горит 0.9 сек нет
       flashing2_non_stop_program(Led2_Pin,500,600);// 0.5 сек горит 0.6 сек нет   // идет продолжение программы без задержки на millis()
    }
     
  6. yden

    yden Гик

    У меня так:

    Код (C++):
    //функция светодиод кнопки1
    void function_led_button1 (uint16_t time_led_button1_0, uint16_t time_led_button1_1)
    {
      static bool state_led_button1 = 0;       // состояние светодиода
      static uint32_t future_led_button1 = 0;  // время будущего перескока на другое состояние
      if (millis() < future_led_button1) return; // если время не пришло(нужное значение millis() ) то выйти из функции
      state_led_button1 = !state_led_button1;              // время смены пришло поменяйте состояние
      future_led_button1 += state_led_button1 ? time_led_button1_0 : time_led_button1_1 ;
      // определите новое время для перескока если state = 1 то future=future+time_0
      //                                      если state = 0 то future=future+time_1
      digitalWrite(led_button1, state_led_button1);
    }

    //функция светодиод кнопки2
    void function_led_button2 (uint16_t time_led_button2_0, uint16_t time_led_button2_1)
    {
      static bool state_led_button2 = 0;       // состояние светодиода
      static uint32_t future_led_button2 = 0;  // время будущего перескока на другое состояние
      if (millis() < future_led_button2) return; // если время не пришло(нужное значение millis() ) то выйти из функции
      state_led_button2 = !state_led_button2;              // время смены пришло поменяйте состояние
      future_led_button2 += state_led_button2 ? time_led_button2_0 : time_led_button2_1 ;
      // определите новое время для перескока если state = 1 то future=future+time_0
      //                                      если state = 0 то future=future+time_1
      digitalWrite(led_button2, state_led_button2);
    }
     
     
  7. qwone

    qwone Гик

    Button c английского кнопка . А у вас светодиод . Их обозначают Led. А вы обозначили led_button светодиод кнопка. Это сбивает прочтение. Как для меня. Переменные пишутся английскими словами. Но как правило английский у нас, ладно у меня посредственый. Так что если нужны переменные. Набираю русское назначение переменных, а потом гугл переводчик. http://translate.google.com.ua/?hl=ru#en/ru/
    Разумеется подсократив позже.
     
  8. yden

    yden Гик

    Мое прочтение: светик на кнопке. Кнопка от звонка (не нашел стандартный выключатель без фиксации), сколхозил в нее светик. Поэтому назвал led_button.
    У меня еще есть индикатор в холле - led_holl, и на будке у собаки - led_budka :)
     
  9. qwone

    qwone Гик

    Пременные внутри функции { внутри скобок} не обязательно давать длиные названия. Обратите как у меня в тексте. Причем в разных функциях они совпадают. Я специально дал текст программы как образец.
     
  10. yden

    yden Гик

    Спасибо.
    Я думал что имя этих переменных должно быть уникальным.