Подключение нескольких приемников 433 МГц к одному передатчику

Нет ответов
lennen
Offline
Зарегистрирован: 10.11.2015

Добрый день. Решил сделать пульт на передатчике 433 МГц. А приемников оказалось несколько - это разные вещи, которые должны включаться вместе по команде с пульта. 

Чего я не так делаю? Может быть, проблема не в программе, а в том, что или напряжение подаю чуть ниже или чуть выше 5В, или же ток не тот, или что?

Передатчик

#include <VirtualWire.h>

const int led_pin = 13;
const int transmit_pin = 12;
//const int receive_pin = 2;
//const int transmit_en_pin = 3;
const int buttonPin = 2;
int buttonState = 0;
int pastButton = 0;

void setup()
{
  Serial.begin(9600); //Debug Only
    // Initialise the IO and ISR
    vw_set_tx_pin(transmit_pin);
 //   vw_set_rx_pin(receive_pin);
  //  vw_set_ptt_pin(transmit_en_pin);
    vw_set_ptt_inverted(true); // Required for DR3100
    vw_setup(2000);       // Bits per sec
    pinMode(led_pin, OUTPUT);
    pinMode(buttonPin, INPUT);
}

int vklcnt = 0; //timer for vkl
int offcnt = 0; //timer for off

char msg[5] = {'v','k','l','#'};
char msg0[5] = {'o','f','f','#'};

void loop()
{  
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH)
  {
    if (pastButton == 0) // Если в первый раз переход с выкл на вкл, то обнуляем vklcnt
    {  pastButton = 1; vklcnt = 0;}  
    
    msg[3] = vklcnt >> 8;
    msg[4] = vklcnt;

      Serial.println(vklcnt);
    digitalWrite(led_pin, HIGH); // Flash a light to show transmitting
    vw_send((uint8_t *)msg, 5);
    vw_wait_tx(); // Wait until the whole message is gone
    delay(50);
    vklcnt = vklcnt + 1;
  }
  else if (buttonState == LOW)
  {  
    if (pastButton == 1) // Если в первый раз переход с вкл на выкл, то обнуляем offcnt
    {  pastButton = 0; offcnt = 0;  }  
    
    msg0[3] = offcnt >> 8;
    msg0[4] = offcnt;
    
      Serial.println(offcnt);
    digitalWrite(led_pin, LOW);
    vw_send((uint8_t *)msg0, 5);
    vw_wait_tx(); // Wait until the whole message is gone
    delay(50);
    offcnt = offcnt + 1;
  }

 

 

Приемник

 

#include <VirtualWire.h>

const int led_pin = 13;
const int receive_pin = 12;


void setup()
{
    delay(1000);
    Serial.begin(9600);	// Debugging only
    Serial.println("setup");

    // Initialise the IO and ISR
    vw_set_rx_pin(receive_pin);
    vw_set_ptt_inverted(true); // Required for DR3100
    vw_setup(2000);	 // Bits per sec

    vw_rx_start();       // Start the receiver PLL running

    for(int i = 1; i <=19; i++){if(i != 12) pinMode(i, OUTPUT);}
    
    for(int i = 1; i <=19; i++){ //for no noisy light from any lightning pin
            if(i != 12) digitalWrite(i, LOW);
          }    
}

  long x;

void loop()
{
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

    if (vw_get_message(buf, &buflen)) // Non-blocking
    {
	
        //for (int i=0;i<3;i++)
        //Serial.print(char(buf[i]));
        //Serial.print(buf[3]);
        //Serial.println(buf[4]);
        
        //digitalWrite(led_pin, HIGH); // Flash a light to show received good message
	// Message with a good checksum received, dump it.
        if (buf[1] == 'k') //vkl
        {
          for(int i = 1; i <=19; i++){
            if(i != 12) digitalWrite(i, HIGH);
          }
          
          delay(1000);                  //тестовый блик
          
          for(int i = 1; i <=19; i++){
            if(i != 12) digitalWrite(i, LOW);
          }
          
           delay(2000);                  // не горим
           
           
           
           //А вот и наша программа. Но здесь еще начинаем с задержки до выхода на сцену
           //delay 20000; Он разбит на kmax циклов, то есть в цикле 20000 мс / 100 = 200 мс. И надо отнять значение таймера с пульта, тоже поделенное на 100.
           float kmax = 30;

           int timeFromStart1 = int(buf[3]);
           timeFromStart1 = timeFromStart1<<8;         //shift x_high over to leftmost 8 bits
           timeFromStart1 |= int(buf[4]);                 //logical OR keeps x_high intact in combined and fills in  
           float timeFromStart = timeFromStart1; //Это поправка на время, своеобразный таймер с пульта. 
           //Если сигнал принят не с первого раза, то надо уменьшить задержку до выхода на сцену.

           int k = 0; 
           while (buf[1] != 'f' && k < kmax) //Если off, то сразу выходим из ожидания
           { // и быстро проходим к через всю программу к ее началу
                vw_get_message(buf, &buflen);
                if (buf[1] != 'f'){// Если по прежнему сигнал включения или ничего нет,
                delay((20700 - timeFromStart*100)/kmax); // то ждем до выхода на сцену
                Serial.print("Ждем дальше выхода на сцену : "); Serial.println(char(buf[0]));}
                Serial.println(timeFromStart);
                k++;
            }

              vw_get_message(buf, &buflen); // Если вдруг отключили, то выводим в отладку сообщение и быстро завершаемся
                if (buf[1] == 'f')
                {Serial.println("False start reset has been done. The device has been turned off"); }
           

            vw_get_message(buf, &buflen);
            if (buf[1] == 'k'){ // Если не пришел сигнал выключения, начинаем программу
              Serial.print("Выход на сцену сделан. Программа началась.");
                          
             // А вот здесь уже целиком и полн
             //остью программа. Менять на ту, которая нужна
              for(int j = 0; j<100; j++){ 
               
                 for(int i = 1; i <=19; i++){
                  if(i != 12) digitalWrite(i, HIGH);
                 }
              
                 delay(100);  
              
                 for(int i = 1; i <=19; i++){
                  if(i != 12) digitalWrite(i, LOW);
                 }
              
                 delay(100);             
              }
                //Конец нашей программы
            }
          
        }
    } 
        
}

То есть суть не в том, что совсем не работает... Скорее наоборот, работает, но бывают казусы, когда прямо на расстоянии 1 м в зоне видимости один из предметов не запускается.