There are some great Arduino modules with integrated ESP-8266 wireless chips, some of the most popular of these modules are:
- Adafruit HUZZAH
- NodeMCU
- WeMos
Along with these modules comes some excellent libraries.
For Arduino to PC or Raspberry Pi communications that are a few options to choose from. A TCP client/server is simple and straightforward and it is excellent for sending single point information. For sending multiple data points take a look at MQTT (Message Queuing Telemetry Transport), it’s a common standard for IoT applications and it’s built into Node-Red.
Arduino TCP Client
The Arduino module can be a simple TCP client that can talk to either a Python or a Node-Red TCP server. Below is an example that sends a random integer to a TCP server every 5 seconds.
/* Test TCP client to send a random number */ #include <ESP8266WiFi.h> #include <ESP8266WiFiMulti.h> ESP8266WiFiMulti WiFiMulti; void setup() { Serial.begin(9600); // We start by connecting to a WiFi network const char * ssid = "your_ssid"; // your WLAN ssid const char * password = "your_password"; // your WLAN password WiFiMulti.addAP(ssid, password); Serial.println(); Serial.print("Wait for WiFi... "); while(WiFiMulti.run() != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); delay(500); } void loop() { const uint16_t port = 8888; // port to use const char * host = "192.168.0.123"; // address of server String msg; // Use WiFiClient class to create TCP connections WiFiClient client; if (!client.connect(host, port)) { Serial.println("connection failed"); Serial.println("wait 5 sec..."); delay(5000); return; } // Send a random number to the TCP server msg = String(random(0,100)); client.print(msg); Serial.print("Sent : "); Serial.println(msg); client.stop(); delay(5000); }
Node-Red TCP Server
Node-Red is an excellent visual programming environment that is part of the Raspberry Pi base install. Node-Red is a simple tool to create your own Internet of Things applications. The base Node-Red installation includes a TCP server and client.
To install the web dashboards enter:
sudo apt-get install npm cd ~/.node-red npm i node-red-dashboard
To start Node-Red either use the on-screen menus or from the command line enter:
node-red-start &
Once Node-Red is running the programming is done via the web interface at: //localhost:1880 or //your_Pi_ip_address:1880 .
To configure the TCP server, go to the Input nodes section and drag and drop the TCP in node. After the node is inserted double-click on it and edit the port and message settings.
To create a gauge Web dashboard, go to the dashboard nodes section and drag and drop the gauge node. After the node is inserted double-click on it and edit the dashboard group, labels and ranges.
For debugging and testing an output debug node is useful.
To access the Web dashboard enter: //localhost:1880/ui or //your_Pi_ip_address:1880/ui
TCP Python Server
The python TCP server will see the incoming Arduino message as a Unicode (UTF-8) text, so convert message to an integer use: thevalue = int(data.decode(“utf-8”)). Below is the full code.
import socket import sys HOST = '' # Symbolic name, meaning all available interfaces PORT = 8888 # Arbitrary non-privileged port s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) print ('Socket created') #Bind socket to local host and port try: s.bind((HOST, PORT)) except socket.error as msg: print ('Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]) sys.exit() print ('Socket bind complete') #Start listening on socket s.listen(10) print ('Socket now listening') #now keep talking with the client while True: #wait to accept a connection - blocking call conn, addr = s.accept() data = conn.recv(1024) print ('Connected with ' + addr[0] + ':' + str(addr[1]) + " " ) thevalue = int(data.decode("utf-8")) print ("Value: ", thevalue) s.close(
Summary
In our final application we mounted the Arduino module outside and we powered it with a small solar charger. We also include a humidity value with the temperature, and we used a QR code that linked to our web page.
2 thoughts on “Arduino talking TCP to Node-Red and Python”