Приемник 433 мгц

lacondeguy
Offline
Зарегистрирован: 01.02.2016

Добрый день всем, помогите кто знает, пожалуйста, в 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);

}
}

 

 

Navigator
Navigator аватар
Offline
Зарегистрирован: 26.01.2016

В коде передатчика у вас сообщение отправляется три раза. У моих модулей связь была на большем расстоянии (на одном была надпись FS1000A). Через две стены на 10м, при напряжении питания 5В. Приемник рассчитан на 5в, передатчик от 3 до 12В, но лучше на передатчик не давать более 9в. При напряжении питания передатчика 9в дальность была 16м. Когда подал 12в, дальность увеличилась значительно, но минут через 5 он сдох и теперь на прямой видимости не более 8 метров. В качестве антенн использовал провода длиной 17см. Получилось реализовать радиоджойстик(два джойстика плюс кнопки).

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Navigator пишет:

Когда подал 12в, дальность увеличилась значительно, но минут через 5 он сдох и теперь на прямой видимости не более 8 метров. В качестве антенн использовал провода длиной 17см. Получилось реализовать радиоджойстик(два джойстика плюс кнопки).

Тобишь, получается, что дохлый передатчик это не обязательно полностью неработающий, а может и работающий процентов на 30 всего? У меня один на 12В уже месяца 4 пашет...

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

работают они на 12в, проблем особых нет, но спалить при желании можно все.

Navigator
Navigator аватар
Offline
Зарегистрирован: 26.01.2016

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

Как альтернатива - передавать на радиомодуль значения выхода управления светодиодной лентой 

Скетч передатчика: 

#include <VirtualWire.h>
int val;
int x;
int pir = 8;     //  движение


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)                   // если есть движение

  {
    //mp3_play (1);
    int number = 1000; //переменная для передачи значения i, увеличенная на 1000
                        //для удобства выборки значения из массива на приемной стороне 
   
      for (int i = 0; i <= 224; i+=4)              // плавно включаем ленту
      // пришлось увеличить шаг в 4 раза, т.к. передача через радиомодуль тормозит программу
    {
      analogWrite(3, i);
      
      number = 1000+ i; 
      
      //далее формируем строку на передачу: "w_значение i_"
       String strMsg = "w";
        strMsg += " ";
     strMsg += number;
    char msg[255];
    strMsg.toCharArray(msg, 255);
    
    
     vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx();
   
      
    }
   

    delay (13000);

    for (int i = 224; i >= 0; i-=4)  // плавно выключаем ленту
    {
      analogWrite(3, i);
      
      
      x = i;
      x=224-x;
      
     number = 1224- x;
     String strMsg = "w";
     strMsg += " ";
     strMsg += number;
     strMsg += " ";
    char msg[255];
    strMsg.toCharArray(msg, 255);
     vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx();

     
    }
    
  }
     //mp3_play (0);
    delay(10);

  val == LOW;
}

Скетч приемника: 

#include <VirtualWire.h>
int x;

void setup()
{
  Serial.begin(9600);
  analogWrite(3, OUTPUT);
  vw_set_ptt_inverted(true); 
  vw_setup(2000); 
  vw_rx_start(); 
}

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] != 'w')
    {
      return; 
    }
    char command = buf[0]; // Кодовое слово "w" находится в индексе 0
    
    // Числовой параметр начинается с индекса 2
    i = 2; 
    int number = 0;
   
    // Поскольку передача идет посимвольно, то нужно преобразовать набор символов в число
    while (buf[i] != ' ')
    {
      number *= 10;
      number += buf[i] - '0';
      i++;
    }
    x= number-1000;
    analogWrite(3, x);
    Serial.print(command);
    Serial.print("     number = ");
    Serial.print(number);
    Serial.print("      x  =  ");
    Serial.println(x);
 
    
  }
   
}

 

Navigator
Navigator аватар
Offline
Зарегистрирован: 26.01.2016

Но в этом случае другая проблема, при пропадании радиосвязи в принимающей Ардуине сохраняется последнее принятое значение, и лента может загораться  и гаснуть не полностью. Тогда нужно будет загрубить крайние значения, например:

If  ( i <= 16)  { i = 0}

if ( i >= 212 )  { i = 224}