Arduino Communication Protocols

In this tutorial, we are going to learn:

The Arduino Uno pinout guide includes information you need about the different pins of the Arduino Uno microcontroller and their uses: power supply, analog and digital pins and ICSP. The guide also discusses different communication protocols used by the Arduino and a detailed diagram of the Arduino Uno board. Today we will be discussing arduino communication protocols. Devices need to communicate with each other to relay information about the environment, express changes in their states, or request auxiliary actions be performed. Few microcontroller applications are as pervasive and practical and as Communication.Our ICS3U curriculum introduces ACES to a subset of 6 Arduino-compatible Communication Protocols (Wi-Fi, for one, is left to you to explore at home as the RSGC firewall does not make it easy to investigate).

  • Communication between two Arduino - Overview
  • Communication between two Arduino via Ethernet/WiFi
  • Example application: A button/switch connected to Arduino #1 controls an LED connected to Arduino #2 via Ethernet/WiFi
  • How to connect two Arduino via Internet

Hardware Required

2×Arduino UNO or Genuino UNO
2×USB 2.0 cable type A/B
2×Arduino Ethernet Shield 2
2×Ethernet Cable

You can alse use PHPoC WiFi/Ethernet Shield instead of Ethernet Shield. PHPoC WiFi/Ethernet Shield supports both WiFi and Ethernet.

Please note: These are affiliate links. If you buy the components through these links, We may get a commission at no extra cost to you. We appreciate it.

Communication between two Arduino - Overview

Let's consider a specific case: Arduino #1 communicates with Arduino #2. There are many methods to enable communication between two Arduino. We can choose one of them depending on the communication range. The below table shows some methods and their communication range.

Methods Range
I2C very short
SPI very short
UART (TTL) very short
UART (RS-232/485/422) short
Bluetooth short
LoRa long
Ethernet/WiFi unlimited(*)

※ NOTE THAT:

(*):

Arduino Communication Protocols

  • If two Arduino are connected to the Internet, the communication range is unlimited
  • If two Arduino are not connected to the Internet, but they are connected in the same LAN network, they can still communicate with each other. The communication range is limited within the LAN network.

Among the above methods, this tutorial uses Ethernet/WiFi to enable communication between two Arduino because it allows two Arduino to communicate over the unlimited distance.

Communication between two Arduino via Ethernet/WiFi

Two Arduino can communicate with each other via Ethernet/WiFi if:

  • Two Arduino in the same LAN network, the Internet connectivity is NOT required
  • Two Arduino in the different LAN networks, the Internet connectivity is required

No matter two Arduino connects with each other within a local LAN network or via the Internet, there are two types of communication:

  • Two Arduino communicate directly to each other
  • Two Arduino communicate through a centralized server (e.g MQTT server).

In the case of communicating directly, in most cases, one Arduino plays the role of TCP client, the other plays the role of TCP server.

In the case of communicating through a centralized server, in most cases, both Arduino play the role of TCP client.

Depending on the application, We need to choose an application protocol for communicating between two Arduino. Below are some of the application protocols we can use:

  • Self-defined protocol over raw TCP (directly)
  • Modbus TCP (directly)
  • HTTP (directly)
  • Telnet (directly)
  • SSH (directly)
  • MQTT (via a centralized server)

※ NOTE THAT:

It does NOT matter if:

Protocols
  • Both of Arduino uses Ethernet
  • Both of Arduino uses WiFi
  • One Arduino uses Ethernet, the other use WiFi

UDP protocol is beyond the scope of this tutorial.

Example Application

Let's realize the following application: A button/switch connected to Arduino #1 controls an LED connected to Arduino #2 via Ethernet/WiFi.

This tutorial uses two Arduino Ethernet Shield 2. You can use another WiFi Shield or Ethernet Shield instead. If you use another shield it just needs to modify the code a little bit.

As mentioned above, there are some application protocols we can use. In this example, to make it simple, we will define a protocol by ourself (a self-defined protocol)

Self-defined Protocol

Let's define a simple protocol:

  • A TCP connection is created between Arduino #1 and Arduino #2
  • Arduino #1:
    • Act as TCP client, actively makes TCP connection request to Arduino #2
    • When the switch is switched to ON, Arduino #1 sends a byte (command) with value 1 to Arduino #2.
    • When the switch is switched to OFF, Arduino #1 sends a byte (command) with value 0 to Arduino #2.
  • Arduino #2:
    • Act as TCP server, listens to TCP connection request from Arduino #1
    • If the received byte is 1, Turn ON LED
    • If the received byte is 0, Turn OFF LED

Wiring Diagram

※ NOTE THAT:

you need to add a resistor for LED if LED does not have a built-in register. You can learn more in Arduino - LED and Arduino - Button tutorials

Arduino Code for Arduino #1

Arduino Communication Protocols Software

/* * Created by ArduinoGetStarted.com * * This example code is in the public domain * * Tutorial page: https://arduinogetstarted.com/tutorials/communication-between-two-arduino */// ARDUINO #1: TCP CLIENT + A BUTTON/SWITCH#include <ezButton.h>#include <SPI.h>#include <Ethernet.h>constint BUTTON_PIN = 7;constint serverPort = 4080;ezButtonbutton(BUTTON_PIN); // create ezButton that attach to pin 7;byte mac[] = {0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x03};IPAddress serverAddress(192, 168, 0, 180);EthernetClient TCPclient;voidsetup() {Serial.begin(9600);button.setDebounceTime(50); // set debounce time to 50 millisecondsSerial.println('ARDUINO #1: TCP CLIENT + A BUTTON/SWITCH');// Initialize Ethernet Shield:if (Ethernet.begin(mac) 0)Serial.println('Failed to configure Ethernet using DHCP');// connect to TCP server (Arduino #2)if (TCPclient.connect(serverAddress, serverPort))Serial.println('Connected to TCP server');elseSerial.println('Failed to connect to TCP server');}voidloop() {button.loop(); // MUST call the loop() function firstif (!TCPclient.connected()) {Serial.println('Connection is disconnected'); TCPclient.stop();// reconnect to TCP server (Arduino #2)if (TCPclient.connect(serverAddress, serverPort))Serial.println('Reconnected to TCP server');elseSerial.println('Failed to reconnect to TCP server'); }if (button.isPressed()) { TCPclient.write('1'); TCPclient.flush();Serial.println('- The button is pressed, sent command: 1'); }if (button.isReleased()) { TCPclient.write('0'); TCPclient.flush();Serial.println('- The button is released, sent command: 0'); }}

Arduino Code for Arduino #2

/* * Created by ArduinoGetStarted.com * * This example code is in the public domain * * Tutorial page: https://arduinogetstarted.com/tutorials/communication-between-two-arduino */// ARDUINO #2: TCP SERVER + AN LED#include <SPI.h>#include <Ethernet.h>constint LED_PIN = 7;constint serverPort = 4080;byte mac[] = {0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02};EthernetServer TCPserver(serverPort);voidsetup() {Serial.begin(9600);pinMode(LED_PIN, OUTPUT);Serial.println('ARDUINO #2: TCP SERVER + AN LED');// Initialize Ethernet Shield:if (Ethernet.begin(mac) 0)Serial.println('Failed to configure Ethernet using DHCP');// Print your local IP address:Serial.print('TCP Server IP address: ');Serial.println(Ethernet.localIP());Serial.println('-> Please update the serverAddress in Arduino #1 code');// Listening for a TCP client (from Arduino #1) TCPserver.begin();}voidloop() {// Wait for a TCP client from Arduino #1:EthernetClient client = TCPserver.available();if (client) {// Read the command from the TCP client:charcommand = client.read();Serial.print('- Received command: ');Serial.println(command);if (command '1')digitalWrite(LED_PIN, HIGH); // Turn LED onelseif (command '0')digitalWrite(LED_PIN, LOW); // Turn LED offEthernet.maintain(); }}

Quick Steps

  • Stack Ethernet Shields on Arduino #1 and Arduino #2
  • Wire a button/switch to Arduino #1
  • Wire an LED to Arduino #2
  • Open Arduino IDE (called Arduino IDE #1)
  • Install ezButton library on Arduino IDE
  • Connect Arduino #1 to PC via USB cable and select COM port of Arduino #1 on Arduino IDE #1
  • Open another Arduino IDE window (called Arduino IDE #2) by clicking on Arduino IDE icon on your PC (important!(**))
  • Connect Arduino #2 to PC via USB cable and select COM port of Arduino #2 on Arduino IDE #2
  • Copy Arduino #1 code, paste to Arduino IDE #1 and save it (named Arduino1)
  • Copy Arduino #2 code, paste to Arduino IDE #2 and save it (named Arduino2)
  • Upload Arduino #2 code to Arduino #2 first
  • Open Serial Monitor on Arduino IDE #2, get TCP Server IP address
  • ARDUINO #2: TCP SERVER + AN LED TCP Server IP address: 192.168.0.2 -> Please update the serverAddress in Arduino #1 code
    AutoscrollShow timestamp
    9600 baud
Arduino
  • Update TCP Server IP address in Arduino #1 code
  • Upload Arduino #1 code to Arduino #1
  • Open Serial Monitor on Arduino IDE #1
  • Press and hold the button on Arduino #1 → see LED's state on Arduino #2 (ON)
  • Release button on Arduino #1 → see LED's state on Arduino #2 (OFF)
  • Press, hold, and release the button several times.
  • See output on both Serial Monitors
    • Serial Monitor of Arduino #1
    • ARDUINO #1: TCP CLIENT + A BUTTON/SWITCH Connected to TCP server - The button is pressed, sent command: 1 - The button is released, sent command: 0 - The button is pressed, sent command: 1 - The button is released, sent command: 0 - The button is pressed, sent command: 1 - The button is released, sent command: 0
      AutoscrollShow timestamp
      9600 baud
  • Serial Monitor of Arduino #2
  • ARDUINO #2: TCP SERVER + AN LED TCP Server IP address: 192.168.0.2 -> Please update the serverAddress in Arduino #1 code - Received command: 1 - Received command: 0 - Received command: 1 - Received command: 0 - Received command: 1 - Received command: 0
    AutoscrollShow timestamp
    9600 baud

※ NOTE THAT:

  • (**): If you open Arduino IDE #2 window via 'File' → 'New' or 'Open' from Arduino IDE #2 window, you will NOT be able to open two Serial Monitors for two Arduino in the same PC at the same time.
  • There is an alternative to this self-defined protocol. It is the Modbus TCP. The Modbus protocol is standardized, it has many advantages over the self-defined protocol. See more in Arduino - Modbus tutorial
Protocols

Video Tutorial

We are considering to make the video tutorials. If you think the video tutorials are essential, please subscribe to our YouTube channel to give us motivation for making the videos.

How to connect two Arduino via Internet

There are two kinds of IP address: private IP address and public IP address. The IP address you are using in the home network is usually a private IP address.

Pc To Arduino Communication

You can easily identify the private IP address. The private IP address has three pattern: 10.x.x.x, 172.16.x.x, 192.168.x.x

It does NOT matter to use the private IP address in the following case:

  • If two Arduino are in the same LAN network, regardless of communicating directly or via a centralized server, regardless of your LAN network connects to the Internet or not.
  • If two Arduino are in the different LAN networks and communicating with each other via a centralized server

In the case of two Arduino are in the different LAN networks and communicating with each other directly. The Arduino TCP client can use the private IP address. However, the Arduino TCP server MUST use either:

Arduino Communication Protocols
  • A public IP address
  • A private IP address with 'Port Forwarding' on Router/AP

The process of doing 'Port Forwarding' is different from each router/AP. It is out of the scope of this tutorial.

The Best Arduino Starter Kit

Arduino Communication Protocols Example

  • See the best arduino kit for beginner

See Also

  • Arduino - IoT
  • Arduino Shield
  • Arduino - HTTP Request
  • Arduino - HTTPS Request
  • Arduino - IFTTT
  • Arduino - Send Email
  • Arduino - Make Voice Phone Call
  • Arduino - Send SMS Message
  • Arduino - Modbus
  • Arduino - Ethernet
  • Arduino - Ethernet Shield 2
  • Arduino - PHPoC Shield
  • Arduino - WiFi

※ OUR MESSAGES

  • We are AVAILABLE for HIRE. See how to hire us to build your project
  • If this tutorial is useful for you, please give us motivation to make more tutorials .
ArduinoGetStarted.com is a participant in the Amazon Services LLC Associates Program, an affiliate advertising program designed to provide a means for sites to earn advertising fees by advertising and linking to Amazon.com, Amazon.it, Amazon.fr, Amazon.co.uk, Amazon.ca, Amazon.de, Amazon.es and Amazon.co.jp

Multiple Arduino Communication

Copyright © 2020 ArduinoGetStarted.com. All rights reserved.

Comments are closed.