315Mhz RF примник и передатчик
- Войдите на сайт для отправки комментариев
Доброго время суток.
Помогите разобраться с 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++;
Спасибо
опечатался в коде передатчика - строка 22 должно быть {,
и в 5 строке датчик sw 12 пин
Вот такой код может помочь? ставим после строки 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)И почему отображается не три единицы и три нуля, а две цифры?
помогло вот так if(number = 111)
{
.......................
}
В условии надо без ковычек одинарных. В коде передатчика наверное команду на передачу надо делать в millis(), потому что если отправляешь к примеру информацию о состоянии 2-3 датчиков, все выполняется с некоторой задержкой, т.к все работает последовательно..... и приемник тоже надо наверное делать с millis()...