передача данных по беспроводному каналу 433MHz

передача данных по беспроводному каналу 433MHz

Сообщение gnomert » 17 янв 2015, 19:46

Здравствуйте! Я организовал связь между Arduino mega2560, на котором стоит приемник, и UNO,на котором стоит передатчик. В свою очередь UNO просто передает на Mega через каждые 5 секунд цифру+1. Mega принимает эти данные и при условии, если принятая цифра меняется, записывает ее на флешку в текстовый файл. у меня частично получилось это сделать при следующей конфигурации :

Передатчик
Код: Выделить всё
#include <VirtualWire.h>
#include <EasyTransferVirtualWire.h>
#include <EEPROM.h> // эта библиотека нужна для работы с энерго-независимой памятью

const int led_pin = 13;
const int transmit_pin = 2;
unsigned int unique_device_id = 0;
unsigned int count = 1;

//create object
EasyTransferVirtualWire ET;

struct SEND_DATA_STRUCTURE{
  //наша структура данны. она должна быть определена одинаково на приёмнике и передатчике
  //кроме того, размер структуры не должен превышать 26 байт (ограничение VirtualWire)
  unsigned int device_id;
  unsigned int destination_id;   
  unsigned int packet_id;
  byte command;
  int data;
};

//переменная с данными нашей структуры
SEND_DATA_STRUCTURE mydata;

//ниже пару функций для записи данных типа unsigned int в EEPROM


void setup()
{
  // блок инициализации
  pinMode(led_pin, OUTPUT);

  ET.begin(details(mydata));
  vw_set_tx_pin(transmit_pin); //установка пина, к которому подключен data-вход передатчика
  vw_setup(2000);        //скорость передачи
  Serial.begin(9600);
  randomSeed(analogRead(0));
}

void loop()
{
  mydata.device_id = 12348;
  mydata.destination_id = 11111;
 
  mydata.command = 0;
  mydata.data = count;

  digitalWrite(led_pin, HIGH); // включаем светодиод для отображения процесса передачи
  Serial.print(" device id ");   
  Serial.print(mydata.device_id);   
  Serial.print(" data: ");
  Serial.print(mydata.data);
  Serial.print(" ... ");
  ET.sendData(); // отправка данных
  digitalWrite(led_pin, LOW);
  Serial.println("DONE");
  delay(5000);
  count = count + 1;
}


Приемник
Код: Выделить всё
#include <VirtualWire.h>
#include <EasyTransferVirtualWire.h>

#include <SD.h>
const int led_pin = 13;
const int receive_pin = 3;
unsigned int unique_device_id = 0;
const int i = 1;
File myFile;

EasyTransferVirtualWire ET;
char buf[120];

struct SEND_DATA_STRUCTURE{

  unsigned int device_id;
  unsigned int destination_id; 
  unsigned int packet_id;
  byte command;
  int data;
};


SEND_DATA_STRUCTURE mydata;

void setup()
{
    pinMode(led_pin, OUTPUT);
    Serial.begin(9600);

    ET.begin(details(mydata));

    vw_set_rx_pin(receive_pin);
    vw_setup(2000);     
    vw_rx_start();     
 
}

void loop()
{
    if(ET.receiveData())
    {
        if (mydata.destination_id == 11111) {
        digitalWrite(led_pin, HIGH);
        Serial.print("Got: ");
        Serial.print("Device ID: ");
        Serial.print(mydata.device_id);
        Serial.print(" Destination ID: ");
        Serial.print(mydata.destination_id);       
        Serial.print(" Command: ");
        Serial.print(mydata.command);
        Serial.print(" Data: ");
        Serial.print(mydata.data);
        Serial.println();
        digitalWrite(led_pin, LOW);
        digitalWrite(4,HIGH); // выключили SD
digitalWrite(10,LOW); // включили W5100

 
      }
     
        else {
          Serial.print(" Data: ");
        }
    }
             if(SD.begin(4))
        myFile = SD.open("test.txt", FILE_WRITE);
        myFile.println("12345");
        myFile.println(mydata.destination_id);
        myFile.println(mydata.data);
       myFile.close();
   digitalWrite(10,HIGH);

digitalWrite(4,LOW);     
               
 }


Но тогда у меня получается такая канитель:

Код: Выделить всё
12345
11111
1
12345
11111
1
12345
11111
1
12345
11111
1
12345
11111
1
12345
11111
1
12345
11111
2
12345
11111
2
12345
11111
2
12345
11111
2
12345
11111
2
12345
11111
2
12345
11111
2


подскажите пожалуйста, что можно с этим сделать?
gnomert
 
Сообщения: 1
Зарегистрирован: 17 янв 2015, 19:32
programming: C#

Re: передача данных по беспроводному каналу 433MHz

Сообщение noonv » 19 янв 2015, 12:23

Процедуру записи в файл нужно внести в блок
Код: Выделить всё
 if(ET.receiveData()) {
// выводим в последовательный порт принятую инфу
//...

// сохраняем в файл
//...
}
Аватара пользователя
noonv
Администратор
 
Сообщения: 532
Зарегистрирован: 05 май 2011, 15:44
Откуда: Калининград
programming: С++


Вернуться в Коммуникации

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

© 2009-2016 |  О проекте