HELP !!! СРОЧНО!!! НУЖЕН СКЕТЧ !!! ВРоде просто до не могу догнать!!!! ХОТЯ БЫ ПРИМЕР

Тема в разделе "Сделаю проект", создана пользователем Aleksey11, 18 сен 2017.

  1. Aleksey11

    Aleksey11 Нуб

    1. Есть UNO 1шт
    2. Шилдовские реле 4х канальные 4 шт
    3. приемник 433 частоты
    4. 4 пульта RF ( 10 кнопочные) С одинаковыми кодами) ( коды известны)
    Code: 57759, period duration: 410us.
    Code: 57760, period duration: 410us.
    Code: 57758, period duration: 410us.
    Code: 57771, period duration: 410us.
    Code: 57756, period duration: 410us.
    Code: 57754, period duration: 410us.
    Code: 57779, period duration: 410us.
    Code: 57757, period duration: 410us.
    Code: 57772, period duration: 410us.
    Code: 57777, period duration: 410us.

    Функционал простой первые 7 кнопок должны работать:
    1 раз нажали ( реле вкл на 1 секунду и выключилось)
    ПРИ УДЕРЖАНИ РЕЛЕ ДОЛжНО БЫТЬ В ЗАМКНУТОМ СОСТОЯНИИ, пока не отпустим кнопку.
    8 и 9 и 10 кнопка 1 раз нажали ( реле вкл на 1 секунду и выключилось)
     
  2. DIYMan

    DIYMan Гуру

    Смотри: при однократном нажатии код приходит однократно (считаем так для простоты). При удержании - код постоянно приходит, через какие-то промежутки времени (заведомо меньше секунды). Вывод: при любом получении кода обнуляем таймер выключения реле (переменная) - и всё. В псевдокоде:

    Код (C++):
    typedef struct
    {
        unsigned long clickTime;
        bool isRelayOn;
    } ButtonState;


    ButtonState button1State;

    void loop()
    {
        if(button1CodeReceived) // если получен код для первой кнопки
        {
            button1State.clickTime = millis(); // обнуляем таймер

            if(!button1State.isRelayOn) // если реле уже не включено
            {
                // включаем реле для кнопки 1
                digitalWrite(pin,level);
                button1State.isRelayOn = true; // сохраняем флаг включения реле
            }
        }
     
        // если включено реле и оно секунду работает - выключаем
        if(button1State.isRelayOn && millis() - button1State.clickTime > 1000)
        {
            button1State.isRelayOn = false; // сбрасываем флаг включения реле
            // выключаем реле
            digitalWrite(pin,level);
        }
    }
    Для остальных кнопок - аналогично, лучшим вариантом будет завести массив из N элементов ButtonState, и в цикле рулить/проверять.
     
    ИгорьК нравится это.