Помогите разобраться в коде для ардуино

Тема в разделе "Arduino & Shields", создана пользователем mrDobryj, 12 июн 2020.

  1. mrDobryj

    mrDobryj Нерд

    Друзья. Зашёл в тупик с кодом. В общем есть 3 ардуино на NRF. 2 из них передатчик и 1 приёмник. На тех что передатчик по кнопке. Обрабатывает их приёмник - кто быстрее нажал у таго и загорается сигнал на приёмнике. И пока не пройдёт 5 сек не реагирует на нажатия другого. Это всё работает как надо.
    Но мне надо чтобы и на кнопках загорался светодиод. Причём также - пока одна кнопка в течении 5 секунд горит, другая не нажимается.
    Не знаю как осилить эту задачу.
    Код прикладываю
    Код (C++):
    //ПЕРЕДАТЧИК
    #include <SPI.h>

    #include <nRF24L01.h>

    #include <RF24.h>

    long  r;
    RF24 radio(9,10);

    void RGB() {
    }

    void setup()
    {
       r = 0;

      radio.begin();

       radio.setChannel(15);
      radio.setDataRate (RF24_250KBPS);
    radio.setPALevel(RF24_PA_LOW);
    radio.openWritingPipe(0x0123456789LL);

      pinMode(A0,INPUT_PULLUP);
      pinMode(2, OUTPUT);

    }


    void loop()
    {
      // Кнопка 1
        if ((!digitalRead(A0)) == true) {
           r = 1;
           radio.write(&r,sizeof(r));
          digitalWrite(2,HIGH);
          delay(5100);
          digitalWrite(2,LOW);
          RGB();
          delay(100);

        }

    }
    Код (C++):
    //ПРИЁМНИК
    #include <SPI.h>

    #include <nRF24L01.h>

    #include <RF24.h>

    #include <SoftwareSerial.h>
    #include <DFPlayer_Mini_Mp3.h>

    RF24 radio(9,10);

    long  y;

    void setup()
    {
      radio.begin();

       radio.setChannel(15);
      radio.setDataRate (RF24_250KBPS);
    radio.setPALevel(RF24_PA_LOW);
    radio.openWritingPipe(0x0123456789LL);

      Serial.begin (9600);

      mp3_set_serial (Serial);

      Serial.begin(9600);

       y = 0;

      pinMode(A0, OUTPUT);
      pinMode(A1, OUTPUT);
        radio.startListening();
      mp3_set_volume (10);

    }


    void loop()
    {
         radio.read(&y,sizeof(y));
        if (y == 1) {
          Serial.println("1");
          digitalWrite(A0,HIGH);
          mp3_play (1);
          delay(5000);
          mp3_stop ();
          delay(100);
          void(* resetFunc) (void) = 0;
           resetFunc();

        }
        if (y == 2) {
          Serial.println("2");
          digitalWrite(A1,HIGH);
          mp3_play (2);
          delay(5000);
          mp3_stop ();
          delay(100);
          void(* resetFunc) (void) = 0;
           resetFunc();

        }
        digitalWrite(A0,LOW);
        digitalWrite(A1,LOW);

    }
     
  2. BAR__MEN

    BAR__MEN Официальный гик Администратор

     
    Simon нравится это.
  3. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Не глядя в ваш код могу сказать. Ваша задача не имеет решения. Как может передатчик что-то "знать" про кнопку другого передатчика ?
     
    BAR__MEN нравится это.
  4. mrDobryj

    mrDobryj Нерд

    Я совсем недавно пробую себя в этой сфере. А если обратно передавать? Или может между собой связь? Или в передатчики ещё модуль какой-нибудь воткнуть?
     
  5. Airbus

    Airbus Радиохулиган Модератор

    Я бы сделал так в коде приемника
    1— в сетапе А0 и А1 в состояние LOW
    2— в лупе перед вторым if написать else типо так
    else if (y==2) далее по тексту
     
  6. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Не работал с модулем NRF. Поэтому спрашиваю - Модули-то все одинаковые на Ардуинах ? Они же не бывают только приемник / передатчик. Они - приёмопередатчик. Требуется только программа. Связь передатчиков между собой - избыточна. Должна быть "звезда"- все через центр (транкинг-связь). Центр принял с устройства 1, отправил подтверждение на уст. 1 и сообщение на уст. 2. На уст. 2 засветился огонек и заблокировалась передача на время. И наоборот.
     
    Последнее редактирование: 12 июн 2020
  7. Daniil

    Daniil Гуру

    Вам нужно избавиться от delay.
    Для каждого СД нужно засекать время его включения. А в другом if проверять не прошло ли время горения и, если прошло, выключить СД
     
  8. Airbus

    Airbus Радиохулиган Модератор

    delay то здесь какраз кстати.Он и будет блокировать программу от всех телодвижений пока принят сигнал и горит светодиод. Как гриться кто первый включил тот молодец а кто нет-сами знаете
     
  9. Daniil

    Daniil Гуру

    спасибо, не так задачу прочитал
     
  10. mrDobryj

    mrDobryj Нерд

    Не совсем понятно на что это повлияет
     
  11. mrDobryj

    mrDobryj Нерд

    А delay(100) позволяет корректно работать мп3 плееру. Без него глючит.
     
  12. mrDobryj

    mrDobryj Нерд

    Программа не знает в какой момент включится светодиод на другой кнопке. Как это сделать?
     
  13. mrDobryj

    mrDobryj Нерд

    Вот как можно отправить на активный передатчик обратно какое-нибудь значение, которое включит СД и также не позволит не активному передатчику не включать СД на заданное время? Или это невозможно?
     
  14. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Очевидно придется отправлять двум адресатам - активному и неактивному. Активному - подтверждение, неактивному - предупреждение.