Приемник 433 мгц
- Войдите на сайт для отправки комментариев
Пнд, 01/02/2016 - 17:09
Добрый день всем, помогите кто знает, пожалуйста, в arduino новичок.
Делаю проект - по датчику движения включается LED лента(с помощью полярного транзистора) , включается музыка на mp3 и передается сигнал на другую Arduino nano ( приемник + тоже led лента), где после приема сигнала включается лента, после одинаковой задержки везде свет выключается.
Так вот : почему то связь не стабильная ( хотя в пределах метра) и сигнал не всегда проходит.. поэтому решил подавать несколько сигналов одинаковых.
Но он зацикливается и свет включается 2 раза (даже если отослать 10 сигналов)
Вот скетч приеника :
int a; void setup() { vw_set_ptt_inverted(true); vw_set_rx_pin(12); vw_setup(2000); pinMode(3, OUTPUT); // управление лентой Serial.begin(9600); vw_rx_start(); } void loop() { uint8_t buf[VW_MAX_MESSAGE_LEN]; uint8_t buflen = VW_MAX_MESSAGE_LEN; a=0; if (vw_get_message(buf, &buflen)) // если есть сообщение { if(buf[0]=='w') // и сообщение равно 'w' { a=1; } if (a==1) { for (int i=0; i<=224; i++) //включаем ленту { analogWrite(3,i); delay(20); } delay(13000); for (int i=224; i>=0; i--) //выключаем ленту { analogWrite(3,i); delay(20); } a=0; } } }
Как сделать так чтобы даже , если много сигналов пришло, то он выполнил только один раз, a=0 ставил в разных мсетах, а он все равно в любом случае , если пришло больше одного сигнала, то проигрывает 2 раза и не прерывается.
А это передатчика:
int val; int pir = 8; // движение char *sms; // переменна для сообщения void setup() { Serial.begin (9600); mp3_set_serial (Serial); mp3_set_volume (18); vw_set_ptt_inverted(true); vw_setup(2000); vw_set_tx_pin(12); pinMode(3,OUTPUT); // управление полевым транзистором } void loop() { val = digitalRead(pir); // считываем значение датчика движения if (val == HIGH) // если есть движение { sms="w"; // формируем сообщение vw_send((uint8_t *)sms, strlen(sms)); vw_wait_tx(); delay(1); vw_send((uint8_t *)sms, strlen(sms)); vw_wait_tx(); delay(1); vw_send((uint8_t *)sms, strlen(sms)); vw_wait_tx(); delay(1); for (int i=0; i<=224; i++) // плавно включаем ленту { analogWrite(3,i); delay(20); } mp3_play (1); delay (13000); for (int i=224; i>=0; i--) // плавно выключаем ленту { analogWrite(3,i); delay(d); } delay(5000); } }
В коде передатчика у вас сообщение отправляется три раза. У моих модулей связь была на большем расстоянии (на одном была надпись FS1000A). Через две стены на 10м, при напряжении питания 5В. Приемник рассчитан на 5в, передатчик от 3 до 12В, но лучше на передатчик не давать более 9в. При напряжении питания передатчика 9в дальность была 16м. Когда подал 12в, дальность увеличилась значительно, но минут через 5 он сдох и теперь на прямой видимости не более 8 метров. В качестве антенн использовал провода длиной 17см. Получилось реализовать радиоджойстик(два джойстика плюс кнопки).
Когда подал 12в, дальность увеличилась значительно, но минут через 5 он сдох и теперь на прямой видимости не более 8 метров. В качестве антенн использовал провода длиной 17см. Получилось реализовать радиоджойстик(два джойстика плюс кнопки).
Тобишь, получается, что дохлый передатчик это не обязательно полностью неработающий, а может и работающий процентов на 30 всего? У меня один на 12В уже месяца 4 пашет...
работают они на 12в, проблем особых нет, но спалить при желании можно все.
На первый взгляд задачка показалась пустяковой. Но вот уже два дня тоже не могу решить эту проблему, пытался ради интереса. Дело в какой-то мелочи или наоборот что-то сложное.
Как альтернатива - передавать на радиомодуль значения выхода управления светодиодной лентой
Скетч передатчика:
Скетч приемника:
Но в этом случае другая проблема, при пропадании радиосвязи в принимающей Ардуине сохраняется последнее принятое значение, и лента может загораться и гаснуть не полностью. Тогда нужно будет загрубить крайние значения, например:
If ( i <= 16) { i = 0}
if ( i >= 212 ) { i = 224}