Подключение нескольких приемников 433 МГц к одному передатчику
- Войдите на сайт для отправки комментариев
Пнд, 31/07/2017 - 04:10
Добрый день. Решил сделать пульт на передатчике 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 м в зоне видимости один из предметов не запускается.