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 = 111)
{
.......................
}
В условии надо без ковычек одинарных. В коде передатчика наверное команду на передачу надо делать в millis(), потому что если отправляешь к примеру информацию о состоянии 2-3 датчиков, все выполняется с некоторой задержкой, т.к все работает последовательно..... и приемник тоже надо наверное делать с millis()...