библиотека rc switch приемник rf

Тема в разделе "Arduino & Shields", создана пользователем misharaz, 4 июл 2019.

  1. misharaz

    misharaz Нуб

    1.все работает.....но когда я заключаю программу в бесконечный цикл с while(1) приюмник перестает работать
    2.кроме этого если пытаюсь послать 0 , то он не принимается
    спасибо
    миша
    Код (C++):
    работающая программа приемника
    #include <RCSwitch.h>
    RCSwitch mySwitch = RCSwitch();
    void setup()
    {
       mySwitch.enableReceive(0);
    }

    void loop()
    {
     
             if( mySwitch.available() )
              {
                 int value = mySwitch.getReceivedValue();
                 if( value == B11010001 )
                   Serial.println(value-B11010000,BIN);
                 if( value == B11011000 )
                  Serial.println(value-B11010000,BIN);
                 mySwitch.resetAvailable();
            }
     
    }
     
  2. Daniil

    Daniil Гуру

    loop и есть while(1)
    принимается, просто, код нуля 0b00100111
     
  3. b707

    b707 Гуру

    Миша, я смотрю вас опыт на ардуино.ру ничему не научил. Опять задаете вопросы, как трехлетний ребенок.
     
  4. misharaz

    misharaz Нуб

    вы правы начну все с начала(у меня проблема с русской клавиатурой поетому пытался быть лаконичным , но получается себе дороже )
    нужно управлять тележкой с радио передатчиком , для начало взял приемник и передатчик(fs1000a,XD-RF-5V )
    скопировал код,немножко изменил-просто вывожу посланную информацию на экран.
    все работает
    работаущия программа передатчика
    Код (C++):
    #include <RCSwitch.h>
    RCSwitch mySwitch = RCSwitch();
    int odin=12,dva=11;
    void setup()
      {
        mySwitch.enableTransmit(2);
        pinMode(odin,INPUT_PULLUP);
        pinMode(dva,INPUT_PULLUP);
      }

    void loop()
      {
        while(digitalRead(odin)==0)
          mySwitch.send(B0001,4);
        while(digitalRead(dva)==0)
          mySwitch.send(B0010,4);
    }
    работающая программа приемника:
    Код (C++):
    #include <RCSwitch.h>
    RCSwitch mySwitch = RCSwitch();
    void setup()
    {
       mySwitch.enableReceive(0);
       Serial.begin(9600);
    }

    void loop()
    {
        if( mySwitch.available() )
              {
                 value = mySwitch.getReceivedValue();
                 if( value == B0001 )
                   Serial.println(value);
                 if( value == B0010 )
                   Serial.println(value);
                 mySwitch.resetAvailable();
              }
    }
    добавил кнопку start в код приемника
    Код (C++):
    #include <RCSwitch.h>
    RCSwitch mySwitch = RCSwitch();
    void setup()
    {
       mySwitch.enableReceive(0);
       Serial.begin(9600);
       pinMode(10,INPUT_PULLUP);
    }

    void loop()
    {
      while(digitalRead(10)==1);
      while(1)
        {
           if( mySwitch.available() )
              {
                 value = mySwitch.getReceivedValue();
                 if( value == B0001 )
                   Serial.println(value);
                 if( value == B0010 )
                   Serial.println(value);
                 mySwitch.resetAvailable();
              }
        }    
    }
    программа перестала работать!!!!!!!
    проблему решил-убрал while(1),а while(digitalRead(10)==1); поставил в setup.
    теперь 2 вопроса
    1.почему с while(1) не работает?
    2.когда посылаю 0 --mySwitch.send(B0000, 4); ---послание не принимается
     
  5. Daniil

    Daniil Гуру

    Как подключена кнопка?
    Что значит не работает? Если вы на кнопку не нажимали, то и не должно ничего происходить, т.е. ваш
    как якорь для кода.
    Пока кнопку один раз не нажмут он не пройдёт мимо этой строчки.
    Почему один, т.к. следующая строчка цепляет код за свой while и от туда уже не отпустит.
    Как вы отправляете "0" как символ или как код сивола? Символ "0" имеет код 48 = 0x30 = В00110000 (кстати, в моём предыдущем сообщении я перепутал код)
     
  6. misharaz

    misharaz Нуб

     
  7. misharaz

    misharaz Нуб

    1.кнокпа n.o. подклечена между gnd и ножкой 10,работает как start для приемника,после нажаттия на нее программа входит в бесконечный цикл while(1)....и приемник не работает(как будто while связан с прерыванием????)
    2.посылау 0 , не символ нуля--- mySwitch.send(B0000, 4);
     
  8. Daniil

    Daniil Гуру

    без схемы разговор приведет в тупик, если уже не привел.
    ну ок, в коде и проверяйте не символ нуля.
    Без конкретной отладки разговора не будет.
    Сейчас вы говорите как-будто первый раз программируете. Если это так, то ответы в учебниках. Керниган и Ритчи хорошая книга.
     
  9. misharaz

    misharaz Нуб

    вопрос простой?почему бэз while(1) приемник работает , а с while(1) нет.ру
    так работает
    Код (C++):
    void loop()
    {
      if( mySwitch.available() )
              {
                 value = mySwitch.getReceivedValue();
                 if( value == B0001 )
                   Serial.println(value);
                 if( value == B0010 )
                   Serial.println(value);
                 mySwitch.resetAvailable();
              }  
    }
    а так нет
    void loop()
    {

    while(1)
    {
    if( mySwitch.available())
    {
    value = mySwitch.getReceivedValue();
    if( value == B0001 )
    Serial.println(value);
    if( value == B0010 )
    Serial.println(value);
    mySwitch.resetAvailable();
    }
    }
    }
    я знаы что loop сам по себе бесконечный цикл и что while(1) лишний....просто хочу понять в чем проблема
     
  10. b707

    b707 Гуру

    покажите мне в вашей программе строчку, где бы вы принимали значение B0000 - такого места нет
    Поэтому оно "не принимается" - а точнее принимается, только вы этого не видите
     
    DetSimen и Daniil нравится это.
  11. misharaz

    misharaz Нуб

    сново все с начала.....
    код передатчика
    Код (C++):
    #include <RCSwitch.h>

    RCSwitch mySwitch = RCSwitch();
    int odin=12,dva=11,tri=7,chet=3;
    void setup()
    {
        mySwitch.enableTransmit(2);
        pinMode(odin,INPUT_PULLUP);
        pinMode(dva,INPUT_PULLUP);
        pinMode(tri,INPUT_PULLUP);
        pinMode(chet,INPUT_PULLUP);
    }

    void loop()
    {
        while(digitalRead(odin)==0)
          mySwitch.send(B0001,4);
        while(digitalRead(dva)==0)
          mySwitch.send(B0010,4);
        while(digitalRead(tri)==0)
          mySwitch.send(B0100, 4);
        while(digitalRead(chet)==0)
          mySwitch.send(B1000, 4);
         
    }
    код приемника

    Код (C++):
    #include <RCSwitch.h>
    RCSwitch mySwitch = RCSwitch();

    int value;
    void setup()
    {
    mySwitch.enableReceive(0);
    Serial.begin(9600);
    }

    void loop()
    {
       if( mySwitch.available() )
              {
                 value = mySwitch.getReceivedValue();
                 Serial.println(value);
                 delay(500);
                 mySwitch.resetAvailable();
              }
    }
     
    программа работает- посылаю разные числа с передатчика приемник их принимает и выводит на экран

    теперь вопрос..почему если добавляю бесконечный цикл с while(1) приемник не реагирует????
    ***мне понятно что while(1) лишний***
    не работающий код
    Код (C++):
    #include <RCSwitch.h>
    RCSwitch mySwitch = RCSwitch();

    int value;
    void setup()
    {
    mySwitch.enableReceive(0);
    Serial.begin(9600);
    }

    void loop()
    {
      while(1)
      {
       if( mySwitch.available() )
              {
                 value = mySwitch.getReceivedValue();
                 Serial.println(value);
                 delay(500);
                 mySwitch.resetAvailable();
              }
      }      
    }
     
  12. b707

    b707 Гуру

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

    я так понял, что на вопрос "Почему не принимается 0" мы уже ответили?
     
  13. misharaz

    misharaz Нуб

    вопрос теоретический сам понять не смог...может у вас есть ответ?
     
  14. parovoZZ

    parovoZZ Гуру

    Loop в ардуино - это коллбэк функция. Соответсвенно, что-то там выполняется ещё из недр. Чтобы это обойти, ставят внутри лупа бесконечный цикл. Но уж если дело дошло до такого, то лучше вообще отказаться от ардуино-стайл программирования в пользу прозрачного и понятно работающего кода.