Динамическое управление пинами в библиотеке <VirtualWire.h>

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

void loop() {
  kon_220(); //  КОНТРОЛЬ 220V
  priem_server_dom();//обработка команд с домашнего сервера 
   termo_stab ();
    vw_set_rx_pin (8);//(receive_pin);pin приёма данных 433Мгц
    vw_setup(400); // Задаем скорость приема и ( передачи )
    vw_rx_start(); // Начинаем мониторинг эфира
 digitalWrite(led_1, HIGH);
    priem();
 digitalWrite(led_1, LOW);
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    //vw_set_rx_pin (7);//(receive_pin);pin приёма данных 28Мгц
    vw_setup(400); // Задаем скорость приема и (передачи)
    vw_rx_start(); // Начинаем мониторинг эфира
 digitalWrite(led_1, HIGH);
    priem();
 digitalWrite(led_1, LOW);
 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

 //~~~~~~~ интервал времени молчания и передачи ~~~~~~
  static unsigned long Time_1 = 0; //  
  if(millis() - Time_1 > Time_28) {//  время МЕЖДУ  циклаМИ передачи 28Мгц
    Time_1 = millis();  //
       interval_ptredacha (); 
  }  

Добрый день. Возникла проблема в динамическом управлении пинами в библиотеке VirtualWire.h Hеобходимо в процессе работы программы менять пины приема данных так как используется два пиёмника на разных частотах (433 Мгц и 28 Мгц), проблема в том что если снять ремарку со строки 12 нет приёма данных на частоте 433Мгц тоесть строка 5 не включает пин 8 и данные принимаются только с приёмника 28Мгц

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Добавляете переменную в которой будет храниться номер пина. Далее в коде вместо номера пина подставляете имя переменной. Также по ходу выполнения программы значение переменной можно менять.

uint8_t  receive_pin = 8; // присваиваем переменной номер пина

void setup() {
}

void loop() {
  vw_set_rx_pin (receive_pin); // подставляем переменную вместо номера
  // что-то делаем...
  receive_pin = 7; // меняем номер пина на другой, когда нужно
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Олег,

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

Если хотите два сразу, то надо модифицировать библиотеку. В том виде, в каком она сейчас, это, кажется, невозможно. Может я и ошибаюсь (давненько я не работал с этой библиотекой), но кажется, что так.

Вам это сильно нужно? Настолько. что Вы готовы модифицировать библиотеку?

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015
[code]
void loop() {
  kon_220(); //  КОНТРОЛЬ 220V
  priem_server_dom();//обработка команд с домашнего сервера 
   termo_stab ();
   static unsigned long Time = 0; //
  if(millis() - Time > 4000) {//   4 cek.
    Time = millis();}  //
  if(millis() > Time  && millis() < Time+2000){
    vw_set_rx_pin (8);//(receive_pin);pin приёма данных 433Мгц
  }
  if(millis() > Time+2000  && millis() < Time+4000){
    vw_set_rx_pin (7);//(receive_pin);pin приёма данных 28Мгц
  }
  //  vw_setup(400); // Задаем скорость приема и (передачи)
    vw_rx_start(); // Начинаем мониторинг эфира
 digitalWrite(led_1, HIGH);
    priem();
 digitalWrite(led_1, LOW);  
   

[/code]

Спасибо. Сделал так и всё заработало, контроллируемые процессы медленные

поэтому потеряные данные в одном цикле передачи я думаю будут востановлены

в следующем.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ага, т.е. Вы их разнесли по времени. Ну, если по задаче это подходит, то это самое простое и хорошее решение.