315Mhz RF примник и передатчик

igorcds
Offline
Зарегистрирован: 03.12.2013

Доброго время суток.
Помогите разобраться с 315Mhz RF transmitter and receiver.
Собрал схему, запустил демо-код, все работает.
Добавил на ардуино передатчик светодиод LED и датчик вибрации SW-520D, т.е
при срабатывании SW, LED загорается. Если led не горит передатчик вещает "0",
если горит - то вещает "1". На ардуино приемнике установлено два светодида - зеленный(когда "0"-
включается) и красный - (включается когда "1"). В мониторе порта приемника все отображается, и "0" и"1"...

//передатчик
#include <VirtualWire.h>
const int transmit_pin = 2;  // пин DATA передатчика
const int ledPin =  13;      // номер выхода, подключенного к светодиоду
const int buttonPin = 2;     //датчик sw
int buttonState = 0;         // состояние sw


void setup
{
  vw_set_ptt_inverted(true); // Необходимо для DR3100
  vw_setup(2000); // Устанавливаем скорость передачи (бит/с)
  vw_set_tx_pin(transmit_pin); //установка пина, к которому подключен data-вход передатчика
  pinMode(ledPin, OUTPUT);     
  pinMode(buttonPin, INPUT);    
}

void loop
{
  buttonState = digitalRead(buttonPin);
if (buttonState == LOW)
  }
  digitalWrite(ledPin, HIGH);  
  int number = 111;
  char symbol = 'c';
  
  String strMsg = "z ";
  strMsg += symbol;
  strMsg += " ";
  strMsg += number;
  strMsg += " ";
  
  char msg[255];
  
  strMsg.toCharArray(msg, 255);
  
  Serial.println(msg);
  
  vw_send((uint8_t *)msg, strlen(msg));
  vw_wait_tx(); // Ждем пока передача будет окончена
  delay(200);
   } else {
  
  int number = 000;
  char symbol = 'c';
  
  String strMsg = "z ";
  strMsg += symbol;
  strMsg += " ";
  strMsg += number;
  strMsg += " ";
  
  char msg[255];
  
  strMsg.toCharArray(msg, 255);
  
  Serial.println(msg);
  
  vw_send((uint8_t *)msg, strlen(msg));
  vw_wait_tx(); // Ждем пока передача будет окончена
  delay(200);
}
}

Код приемника.


// Код приемника

#include <VirtualWire.h>
const int receive_pin = 2;   // Приемник
const int ledPin1 =  13;      // Красный LED
const int ledPin2 =  12;      // Зеленный LED

void setup()
{
  vw_set_rx_pin(receive_pin);// Установка пина приемника
  Serial.begin(9600);
  vw_set_ptt_inverted(true); // Необходимо для DR3100
  vw_setup(2000); // Задаем скорость приема
  vw_rx_start(); // Начинаем мониторинг эфира
  pinMode(ledPin1, OUTPUT);  //красный
  pinMode(ledPin2, OUTPUT);  //зеленный      
}

void loop()
{
  uint8_t buf[VW_MAX_MESSAGE_LEN]; // Буфер для сообщения
  uint8_t buflen = VW_MAX_MESSAGE_LEN; // Длина буфера

  if (vw_get_message(buf, &buflen)) // Если принято сообщение
  {
    // Начинаем разбор
    int i;
    // Если сообщение адресовано не нам, выходим
    if (buf[0] != 'z')
    {
      return; 
    }
    char command = buf[2]; // Команда находится на индексе 2
    
    // Числовой параметр начинается с индекса 4
    i = 4; 
    int number = 0;
    // Посколько передача идет посимвольно, то нужно преобразовать набор символов в число
    while (buf[i] != ' ')
    {
      number *= 10;
      number += buf[i] - '0';
      i++;
    }
    Serial.print(command);
    Serial.print(" ");
    Serial.println(number);
  }
}

Передатчик отрабатывает исправно.
Как выцепить то, что приходит на приемник? Монитор порта приемника отрабатывает, приемник получает правильную
информацию и показывает и "0" и "1".
Как эти "0" и"1" считать, чтобы воспользоваться оператором if( зажечь необходимый светодиод)?
Наверное оператором String, но как считать то что принято?
Подскажите, что выполняет эта часть кода:

 
      number *= 10;
      number += buf[i] - '0';
      i++;

Спасибо

igorcds
Offline
Зарегистрирован: 03.12.2013

опечатался в коде передатчика - строка 22 должно быть {,

и в 5 строке датчик sw 12 пин

igorcds
Offline
Зарегистрирован: 03.12.2013

Вот такой код может помочь? ставим после строки 47

if(number == 'z c 1 1')      // так отображается в мониторе порта
	      {
      digitalWrite(LedPin1, HIGH);	        
              } else {


if(number == 'z c 0 0')  
               {
      digitalWrite(LedPin2, HIGH);
               }}

 digitalWrite(LedPin1, LOW);
 digitalWrite(LedPin2, LOW)

И почему отображается не три единицы и три нуля, а две цифры?

igorcds
Offline
Зарегистрирован: 03.12.2013

помогло вот так if(number =  111)

                                   {

                  .......................

                                     }

В условии надо без ковычек одинарных. В коде передатчика наверное команду на передачу надо делать в millis(), потому что если отправляешь к примеру информацию о состоянии 2-3 датчиков, все выполняется с некоторой задержкой, т.к все работает последовательно..... и приемник тоже надо наверное делать с millis()...