Подключение нескольких приемников 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 м в зоне видимости один из предметов не запускается.