The purpose of this library is to make it easy for the everyday Arduino user working on projects with multiple Arduinos communicating with each other and sharing data. I had many people ask me for the code I used in my PS2X library example that sent PS2 Controller values wirelessly to my SAGAR robot. It got to be tiresome answering the questions and I had an idea to write a library to help the inexperienced with micro controller communications. This is a easy to use and no frills way to send data between two Arduinos.
In most of my own projects I define and write my own NMEA standard communication protocols. This makes communications human readable and easy to debug, but proves wasteful with bandwidth and processing power so it’s not right for every application. Binary communications is much more efficient and versatile, but requires careful handling. This library abstracts the finer points of packetized serial communication away from the user so it easy to use and understand.
To use the library, simple define all the data types you want to share inside a data structure. This keeps all the data stored together in memory.
struct SEND_DATA_STRUCTURE{
//put your variable definitions here for the data you want to send
//THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO
int blinks;
int pause;
};
When requested, the library will send all the binary data in the structure to another Arduino via serial with a checksum to avoid transfer errors.
void loop(){ //this is how you access the variables. [name of the group].[variable name] mydata.blinks = random(5); mydata.pause = random(5); //send the data ET.sendData(); delay(10000); }
The receiving Arduino will verify the checksum, and copy the new data onto a identical structure in it’s memory.
void loop(){ //check and see if a data packet has come in. if(ET.receiveData()){ //this is how you access the variables. [name of the group].[variable name] //since we have data, we will blink it out. for(int i = mydata.blinks; i>0; i--){ digitalWrite(13, HIGH); delay(mydata.pause * 100); digitalWrite(13, LOW); delay(mydata.pause * 100); } } delay(2500); }
It’s important to make sure the structure is the same on both Arduinos for this to work. Now sharing data between Arduinos is easy without having to define and program your own communications protocol and have to worry about syncing or transmit errors. EasyTransfer will do that for you.
Using Structures to hold the data allows for versatile communications by allowing any type and number of data points to be shared, as long as the whole structure is under 255 bytes. You could define int’s, arrays, longs, etc inside the structure and share the data. It’s also possible to create two way communications by defining two sets of structs on each end and creating two objects using the library. I will have an example of that up shortly.
You can download the library and example below. The example requires two Arduino boards to be connected to each other via their Uarts. One will create two random numbers and send the data to the other that will flash out a sequence of flashes based on those numbers. The first one will also flash out the same sequence.
Now it’s easier to pick which Serial port to use; Serial, Serial1, etc. AND support for the NewSoftSerial library for creating software serial ports on any pin. EasyTransfer is for hardware serial, SoftEasyTransfer is for software; each has there own set of examples. There’s also an example for two way communications using the library.
Source Code available on GitHub project pages.
Or Direct Download
UPDATE
Thanks to Kumy, there’s now an I2C version of EasyTransfer. There’s also an experimental VirtualWire version for use with those cheap low frequency radios. All are in the single download zip file above.
To install the Library, open the zip file and transfer the EasyTransfer folder into your Arduino ‘libraries’ folder. Then follow the examples to add the code to your project. If you have any problems or questions, let me know in the Support Forum.
Need Help?
Please use the Support Forum to ask for help. Don’t use the comments below.

This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
If you found this post interesting or helpful, please consider sending in a donation or disabling any ad-block plugin on my site. Proceeds go to my various education outreach efforts, towards repairing museum exhibits, or to my beer fund.







Trackbacks / Pingbacks
380 Comments.
Man, that’s awesome! I’m using your playstation controller library with EasyTransfer library with 2 xbees(one with arduino fio, the other with arduino mega), and it works perfect! thank you.
i don’t understand why does the EasyTransfer library when i install it on the library and import the library it wont appear and when i insert the example coding it said that ET does not declared.I want to use two Arduino Uno.
I found this processing example:
http://www.google.co.uk/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&cad=rja&ved=0CEQQFjAC&url=http%3A%2F%2Fforum.processing.org%2Ftopic%2Feasytransfer&ei=STxCUba5GsKc0AW_0YCADA&usg=AFQjCNHEeR9UTqFYhm_iqNsx3CTO5WB5rA&bvm=bv.43287494,d.d2k
I haven’t tested it.
Just posting it here for the people who have enquired.
Hi Bill,
Quick question, how do you send a string/char-array using the library?
Thanks..
Bill, lib works great using same struct with my uno’s
if I have a struct SEND_DATA_STRUCTURE and struct RECEIVE_DATA_STRUCTURE in an Uno
will ET.receiveData use RECEIVE_DATA_STRUCTURE
ET.sendData(); use SEND_DATA_STRUCTURE automatically or do I have to specify something.
Thanks wayne
Wayne, I think you would need to create a new instance of EasyTransfer…
IE:
EasyTransfer ETrx;
EasyTransfer ETtx;
then assign different struct’s to each and call the respective instances correctly in your code..
ETrx.begin(details(rxstruct), &Serial);
ETtx.begin(details(txstruct), &Serial);
You can of course just Easytransfer the same struct from one device to the other and vice versa tho the difficulty with this depends on what your trying to achieve.
Cheers
Josh
Perfect, i will try that.
Thanks soooo much Josh
wayne
Very helpful
made my work easy
Hello, I’m new to arduino. I’m trying to control an arduino with labview (I managed to do that already) and send two pwm values and two digital input values to another arduino through Serial. I tried modifying the LIFA base code that I am uploading in the labview controlled arduino and write a code on the receiver arduino using the Easy_transfer_RX and TX examples but I didn’t managed to make them communicate and I don’t understand what I’m doing wrong. I’m using a arduino mega for labview control and an arduino uno to receive data. The conection between arduinos is RX1-Tx and TX1-rx (I used serial1 to not interfere with labview communication). What can be the problem? sorry for mistakes in writing (my english is not the best)
I realized were I was wrong, thx for the libraries, they are very useful.
I am a new comer to arduino and the last couple of months have been a very steep learning curve.
I am working on a project that may require 3 or more arduino boards. I need to send data between this group of arduino boards. I understand that if I do not make one of the arduino master by using Wire.begin(). I can make all of them slave and they can be masters if they require to send data.
How can I send data to and from any arduino board to another eg slave to slave or master to slave. I am using I2C comms. Do I have to write it to the master first and then write to the slave I wish to address.
I2C is built around the premise a single master talks to less-powerful (usually just sensors) slaves. If you have multiple, ‘powerful’ Arduino cores trying to communicate with each other, why are you using I2C?
And yes, without getting into complicated multiple master configurations, your ‘master’ would have to route all traffic between ‘slaves’.
Your library makes it so much easier to communicate.
For this type of project, what form of comms would you suggest instead of I2C? It needs to be relatively quick. I will be using a SD card for data logging and incorporating a GPS device as well.
Quick is relative. I assume you are using a vanilla Arduino and only have one serial port? GPS tends to be slow so you could move that to a software serial port on an unused pin.
I am communicating between 3 x mega 2560. If not I2C. What would be a better/faster comms to communicate between boards? I am mainly concerned with the speed of comms between boards and have limited it to mostly boolean change of state and int quantities. To try and minimize the traffic – I am checking to make sure the boolean state or value has changed before sending to other boards.
Thank you for writing this library.
Works excellent and saves hours of work.
Hey Bill, Any chance of compatibility with Arduino Due?
Don’t know, Don’t have one to test. Depends on how much they changed the core Arduino code.
Great library! Setup for EasyTransferI2C was such a breeze. Thanks a bunch!
I have a question, I am planning to use the library but would like to know if what I am planning would work.
I have one Arduino that reads the joystick and some buttons that send out a serial signal.
I can use the library to send these to a other remote arduino, but can I have multiple arduino’s on the remote site. So I select camera 1 and remote arduino should be contacted via Myserial1 and when camera 2 is used Myserial2 should be used, I think I need to have multiple instances of the library running? is that so and if so if that possible.
Kind regards