Using Arduino with Ethernet is a great option for connecting your Arduino board to the Internet in a few minutes. It provides a fastest and reliable connectivity to your IoT devices. There are Ethernet shields that can extend Arduino features, like the Arduino Ethernet Shield for standard Arduinos, or the Arduino MKR ETH Shield for MKR devices. There are also external modules that can be plugged to any microcontroller, like the ENC28J60 module.
In this documentation we cover how to connect devices over Ethernet by using both approaches, the default Arduino Ethernet Shields, and the external ENC28J60 module.
Arduino Portenta H7 Ethernet
Portenta H7 simultaneously runs high level code along with real time tasks. The design includes two processors that can run tasks in parallel. For example, is possible to execute Arduino compiled code along with MicroPython one, and have both cores to communicate with one another. The Portenta functionality is two-fold, it can either be running like any other embedded microcontroller board, or as the main processor of an embedded computer.
H7's main processor is the dual core STM32H747 including a Cortex® M7 running at 480 MHz and a Cortex® M4 running at 240 MHz. The two cores communicate via a Remote Procedure Call mechanism that allows calling functions on the other processor seamlessly.
#defineTHINGER_SERIAL_DEBUG#include<ThingerMbedEth.h>#include<ThingerPortentaOTA.h>#include"arduino_secrets.h"ThingerMbedEththing(USERNAME,DEVICE_ID,DEVICE_CREDENTIAL);ThingerPortentaOTAota(thing);voidsetup() { // configure LED_BUILTIN for outputpinMode(LED_BUILTIN, OUTPUT); // open serial for debuggingSerial.begin(115200); // pin control example (i.e. turning on/off a light, a relay, etc)thing["led"] <<digitalPin(LED_BUILTIN); // resource output example (i.e. reading a sensor value, a variable, etc)thing["millis"] >>outputValue(millis()); // start thinger on its own taskthing.start(); // more details at http://docs.thinger.io/arduino/}voidloop() { // use loop as in normal Arduino Sketch // use thing.lock() thing.unlock() when using/modifying variables exposed on thinger resourcesdelay(1000);}
In case of problems when connecting over secure TLS connections, you can try updating the WiFi firmware by flashing the WiFiFirmwareUpdater example sketch.
Arduino Opta Ethernet
The Arduino Opta is designed for industrial automation, offering robust performance and reliability. It features a dual-core STM32H747 microcontroller, which includes a Cortex® M7 running at 480 MHz and a Cortex® M4 running at 240 MHz. This configuration enables the Opta to handle complex real-time tasks and high-level code execution concurrently.
With its versatile architecture, the Opta supports running Arduino sketches alongside MicroPython, allowing developers to leverage the strengths of both programming environments. The dual-core setup facilitates inter-core communication via Remote Procedure Call, ensuring smooth and efficient coordination between the two processors. This capability makes the Arduino Opta ideal for advanced automation systems, where precise control and rapid response are crucial.
Additionally, the Arduino Opta is equipped with industrial-grade features, such as enhanced I/O capabilities and robust connectivity options. It can be seamlessly integrated into existing industrial networks, providing a reliable solution for monitoring and control applications. Whether used as a standalone microcontroller or as part of a larger embedded system, the Opta's performance and versatility make it a valuable asset in any industrial setting.
// enable debug output over serial#defineTHINGER_SERIAL_DEBUG// define private server instance#defineTHINGER_SERVER"acme.aws.thinger.io"#include<ThingerMbedEth.h>#include<ThingerPortentaOTA.h>#include"arduino_secrets.h"ThingerMbedEththing(USERNAME,DEVICE_ID,DEVICE_CREDENTIAL);ThingerPortentaOTAota(thing);voidsetup() { // open serial for debuggingSerial.begin(115200); // configure leds for outputpinMode(LED_D0, OUTPUT);pinMode(LED_D1, OUTPUT);pinMode(LED_D2, OUTPUT);pinMode(LED_D3, OUTPUT);pinMode(LEDR, OUTPUT);pinMode(LED_BUILTIN, OUTPUT); // configure relays for outputpinMode(D0, OUTPUT);pinMode(D1, OUTPUT);pinMode(D2, OUTPUT);pinMode(D3, OUTPUT); // example for controlling relays and status ledthing["relay_d0"] << [](pson& in){if(in.is_empty()){ in = (bool) digitalRead(D0); }else{digitalWrite(D0, in ? HIGH : LOW);digitalWrite(LED_D0, in ? HIGH : LOW); } };thing["relay_d1"] << [](pson& in){if(in.is_empty()){ in = (bool) digitalRead(D1); }else{digitalWrite(D1, in ? HIGH : LOW);digitalWrite(LED_D1, in ? HIGH : LOW); } };thing["relay_d2"] << [](pson& in){if(in.is_empty()){ in = (bool) digitalRead(D2); }else{digitalWrite(D2, in ? HIGH : LOW);digitalWrite(LED_D2, in ? HIGH : LOW); } };thing["relay_d3"] << [](pson& in){if(in.is_empty()){ in = (bool) digitalRead(D3); }else{digitalWrite(D3, in ? HIGH : LOW);digitalWrite(LED_D3, in ? HIGH : LOW); } }; // example for controlling ledthing["led"] <<digitalPin(LED_BUILTIN);thing["led_r"] <<digitalPin(LEDR); // resource output example (i.e. reading a sensor value, a variable, etc)thing["millis"] >>outputValue(millis()); // start thinger on its own taskthing.start(); // more details at http://docs.thinger.io/arduino/}voidloop() { // use loop as in normal Arduino Sketch // use thing.lock() thing.unlock() when using/modifying variables exposed on thinger resourcesdelay(1000);}
In case of problems when connecting over secure TLS connections, you can try updating the WiFi firmware by flashing the WiFiFirmwareUpdater example sketch.
Arduino with Ethernet Shield
The following example will allow connecting your Arduino device with the Ethernet Shield to the cloud platform in a few lines. Just modify the arduino_secrets.h file with your own information.
#defineTHINGER_SERIAL_DEBUG#include<ThingerEthernet.h>#include"arduino_secrets.h"ThingerEthernetthing(USERNAME,DEVICE_ID,DEVICE_CREDENTIAL);voidsetup() { // open serial for debuggingSerial.begin(115200);pinMode(2, OUTPUT); // pin control example (i.e. turning on/off a light, a relay, etc)thing["led"] <<digitalPin(2); // resource output example (i.e. reading a sensor value, a variable, etc)thing["millis"] >>outputValue(millis()); // more details at http://docs.thinger.io/arduino/}voidloop() {thing.handle();}
The ENC28J60 is a very cheap Ethernet controller that can be used with our Arduinos to extend its connectivity. The main advantage of this controller is that it is inexpensive, as you can find this module for a few dollars. The bad news is that all the TCP/IP stack, DNS features, and so on, must run in the microcontroller itself, so there is no enough space in stock Arduinos for building our program. This way, for integrating the thinger.io libraries in the sketch, it would be necessary to disable the DHCP protocol (that uses UDP under the hood), and assign a manual IP address. If this is OK for your project, or you have a compatible microcontroller with more resources (like ESP8266, Teensy, STM32F, etc), then this module can be a great option.
There are some libraries for managing this boards, but we will use UIPEthernet, as it provides an standard interface that is compatible with the stock Thinger libraries.
The following example will allow connecting a device using the ENC28J60 interface to the cloud platform in a few lines using the WiFi interface. Just modify the arduino_secrets.h file with your own information.
// Install UIPEthernet for ENC28J60// https://github.com/UIPEthernet/UIPEthernet#defineTHINGER_SERIAL_DEBUG#include<ThingerENC28J60.h>#include"arduino_secrets.h"ThingerENC28J60thing(USERNAME,DEVICE_ID,DEVICE_CREDENTIAL);voidsetup() { // open serial for debuggingSerial.begin(115200); // ENC28J60 using fixed IP Address. DHCP is too big for the sketch.uint8_tmac[6] = {0x00,0x01,0x02,0x03,0x04,0x05};Ethernet.begin(mac,IPAddress(192,168,1,125));pinMode(LED_BUILTIN, OUTPUT); // pin control example (i.e. turning on/off a light, a relay, etc)thing["led"] <<digitalPin(LED_BUILTIN); // resource output example (i.e. reading a sensor value)thing["millis"] >>outputValue(millis()); // more details at http://docs.thinger.io/arduino/}voidloop() {thing.handle();}