Вопрос на засыпку Помогите пожалуйста разобраться!

Тема в разделе "Arduino & Shields", создана пользователем sanik, 11 янв 2016.

  1. neyasbltb_88

    neyasbltb_88 Нуб

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

    Pahan Нуб

    При удержании пульта идет код 2276802 с периодом 447мкс. Я тоже думаю, что тут что-то с временем нужно...
    Получается: светодиод должен загореться (1) при первом нажатии кнопки при любом из условий, либо при всех:
    - код 2276802 получен 1 раз
    - код 2276802 поступает с периодом 447мкс
    - код 2276802 поступает с периодом 447мкс и затем когда-то этот код не приходит дольше 447 мкс

    При повторном нажатии этой же кнопки на радиопульте (либо1 раз, либо с удержанием и последующим отпусканием) светодиод выключается: то есть при условиях:
    - код 2276802 получен 1 раз
    - код 2276802 поступает с периодом 447мкс
    - код 2276802 поступает с периодом 447мкс и затем когда-то этот код не приходит дольше 447 мкс

    Вот как то так я думаю, вот как бы это английскими буковками с русским пояснением, кто что делает, а то я совсем зеленый
     
  3. Pahan

    Pahan Нуб

    Выходит, что основаниям так скажем для смены статуса кнопки (т.е. что она будет делать при нажатии либо при отключении) - будет отсутствие кода 2276802 более 447мкс.

    Может кто, че подскажет?
     
  4. mcureenab

    mcureenab Гуру

    Нужно заметить, что из-за помех некоторые посылки могут теряться. Поэтому может статься так, что после срабатывания кнопки некоторое время команда не будет приходить. Потом моет проскочить исправный код или серия кодов, потом снова пауза и снова серия.

    Нужно определиться насколько часто надо отрабатывать команды, чтобы такие пропуски кодов тоже можно было игнорировать.
     
  5. Pahan

    Pahan Нуб

    ну предположим, что нет помех - т.е удерживаем кнопку -шпарит код с интервалом 447
    тогда что?
     
  6. mcureenab

    mcureenab Гуру

    Ну типа после успешной команды некоторое время все игнорировать.
    Все равно интерфейс с одной кнопкой ненадежный. Если чел не видит результат (нет обратной связи), то ХЗ в каком состоянии останется устройство.
     
  7. Pahan

    Pahan Нуб

    Тут в чем вопрос:
    Есть же китайские радиопульты на 433Мгц и к ним приемники на 433 с релюшками.
    Так вот эти приемники програмируются кнопкой на 3 разных режима. Один из этих режимов есть -кнопка нажата однократно, либо нажата и держится, либо нажата и держится затем отпущена - ТО реле включилось.
    Если второй раз нажал кнопку - реле выключилось. У меня есть такие наборы, нормально работают.

    Вопрос то, я хочу на ардуине с дешевым ардуинским китайским приемником на 433 сделать такой же так сказать приемник, как у меня в комплекте с пультом, но режим управления -одной кнопкой.

    вот и весь вопросик, но как его решить?
     
  8. sanik

    sanik Гик

    Думаю вот этот пример должен помочь в вашем случае Кнопку нажата или отпущена отслеживаем флагами а действия которые должны происходить прописываем режимами
    Код (C++):
    int R_LedPin = 13;             // Подключаем красный светодиод к порту 13
    int G_LedPin = 12;             // Подключаем зеленый светодиод к порту 12
    int B_LedPin = 11;             // Подключаем синий светодиод к порту 11
    int ButPin = 10;               // Подключаем кнопку к выходу 10
    int flag = 0;                  // флаг состояния
    int regim = 0;                 // Переключалка

    void setup()
    {
      pinMode(ButPin, INPUT);
      pinMode(R_LedPin, OUTPUT);  
      pinMode(G_LedPin, OUTPUT);  
      pinMode(B_LedPin, OUTPUT);  
    }

    void loop()
    {
      if(digitalRead(ButPin) == HIGH && flag == 0)     // если кнопка нажата и флаг равен 0
        {                                            
          regim ++;    // прибавляем к режиму единицу
          flag = 1;  // переключаем состояние флага
         
          if(regim > 7)                     // Если номер режима превышает требуемого (в данном случае 7 режимов)
            {                              
              regim = 0;      // то отсчет начинается с нуля ( зциклично по кругу)
            }
        }
     
      if(digitalRead(ButPin) == LOW && flag == 1) // если кнопку отпустили
        {
          flag = 0;  //сбрасываем флаг
        }

    // ======= Вполняем задачу при выборе режима =======
    // РЕЖИМ 0: OFF
      if(regim == 0)
        {
          digitalWrite(R_LedPin, LOW);
          digitalWrite(G_LedPin, LOW);
          digitalWrite(B_LedPin, LOW);    
        }
       
    // РЕЖИМ 1: R
      if(regim == 1)
        {
          digitalWrite(R_LedPin, HIGH);
          digitalWrite(G_LedPin, LOW);
          digitalWrite(B_LedPin, LOW);    
        }

    // РЕЖИМ 2: G
      if(regim == 2)
        {
          digitalWrite(R_LedPin, LOW);
          digitalWrite(G_LedPin, HIGH);
          digitalWrite(B_LedPin, LOW);    
        }

    // РЕЖИМ 3: B
      if(regim == 3)
        {
          digitalWrite(R_LedPin, LOW);
          digitalWrite(G_LedPin, LOW);
          digitalWrite(B_LedPin, HIGH);    
        }
           
    // РЕЖИМ 4: RG
      if(regim == 4)
        {
          digitalWrite(R_LedPin, HIGH);
          digitalWrite(G_LedPin, HIGH);
          digitalWrite(B_LedPin, LOW);    
        }
       
    // РЕЖИМ 5: GB
      if(regim == 5)
        {
          digitalWrite(R_LedPin, LOW);
          digitalWrite(G_LedPin, HIGH);
          digitalWrite(B_LedPin, HIGH);    
        }
       
    // РЕЖИМ 6: RB
      if(regim == 6)
        {
          digitalWrite(R_LedPin, HIGH);
          digitalWrite(G_LedPin, LOW);
          digitalWrite(B_LedPin, HIGH);    
        }
       
    // РЕЖИМ 7: RGB
      if(regim == 7)
        {
          digitalWrite(R_LedPin, HIGH);
          digitalWrite(G_LedPin, HIGH);
          digitalWrite(B_LedPin, HIGH);    
        }
    }
     
  9. mcureenab

    mcureenab Гуру

    Тут повторные команды и таймауты никак не обрабатываются.
     
  10. sanik

    sanik Гик

    Здесь показан основной принцип захвата нажатия кнопки и переключение режимов.Что мешает добавить таймер после первого нажатия кнопки, перед тем как переключить флаг и прибавить единицу к режиму?
     
  11. mcureenab

    mcureenab Гуру

    С кнопкой на радиопульте другой подход. В нем нет состояния кнопка нажата или отпущена. Он с определенной частотой и с помехами посылает один и тот же сигнал когда кнопка нажата и не посылает ничего, когда кнопке не нажата.


    Нужно различать реальные нажатия кнопки и серию таких же команд в перемежку с эфирным мусором которая возникает при её удержании.

    Если команда поступила, можно сразу переключать режим, но дальше нужно игнорировать команды от удержания кнопки. Затем понять, что кнопка отпущена.
     
    Pahan нравится это.
  12. Pahan

    Pahan Нуб

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

    mcureenab Гуру

    Код (C++):
    // Статические переменные

    unsigned long static prev_time = 0; // Время предыдущей команды
    В функции loop

    Код (C++):
    unsigned long curr_time = millis();
    Код получен
    Код (C++):
    if ( curr_time - prev_time < 3000 ) // Удержание кнопки. Паузы между командами не менее 3 сек
    {
        prev_time = curr_time; // Команда стала крайней
        return; // Больше ничего не делаем
    }
     
    Выполняем команду.