In Previous post, we have seen how we can initialise CGI server on Raspberry Pi 3 and use it as Gateway for Node-Gateway IoT Architecture.
Here, I will demonstrate, how we can send live temperature data to ThinkSpeak server using Node-Gateway IoT architecture and observe the real-time Temperature vs Time graph on https://thinkspeak.com
Recommended Internet of Things (IOT) Courses:
- Udemy: Complete Guide to Build IOT Things from Scratch to Market
- LinkedIn: IoT Foundations: Fundamentals
- edX: Introduction to the Internet of Things (IoT)
- edureka: IoT Certification Training on Azure
- Coursera: An Introduction to Programming the Internet of Things (IOT) Specialization
- Eduonix: Internet Of Things (IOT) Bundle
NodeMCU (ESP8266) will be used as Node and RPi3 will be used as Gateway.
Description:
In this program,Analog Temperature sensor (LM35) is connected to the NodeMCU 1.0 (ESP-12E Module) (ESP8266MOD) board and Its output will be sent to Gateway (Raspberry Pi 3).
- A C-Program (NodeMCU_to_RPi3_Temp-APDaga.ino) is written and uploaded on NodeMCU ESP8266, which will collect real-time room temperature using LM35 Sensor. and will then send that temperature data to RPi3 (Gateway).
- In order to send the data to RPi3 (Gateway), Above mentioned C-Program will trigger a python script "ts.py" kept in /cgi-bin/ folder on RPi3 using CGI Server
- This "ts.py" script, will log the received temperature data into a text file "TS_Out.txt" and then send the same data to thinkspeak server where we can see the graph between temperature vs time.
NOTE:
1. Internal 10 bit ADC (A0) is used to read the Analog output of the Temperature Sensor.2. Temperature data shown on thinkspeak server grapth will be subset of Logged temperature data in text file on RPi3.
(Because free version of thinkspeak server accept data with the gap of 16 sec interval)
Steps to configure Arduino IDE to connect to NodeMCU ESP8266 are given Here.
Physical Connections:
Steps for Execution:
For Better understanding you can watch demonstration video given below:
Downloads:
Download link is given in the Description of the YouTube video shown below.
Demonstration:
NodeMCU_to_RPi3_Temp-APDaga.ino: (To be uploaded on NodeMCU)
/************************** *CHANGE FOLLOWING THINGS: * ip of RPi3 * ssid * password * path for ts.py python script (if needed) **************************/ #include <ESP8266WiFi.h> const char* host = "192.168.0.35"; // ip of RPi3 //String ApiKey = "FHLRDWDK7GXTF83S"; // Not needed String path = "/cgi-bin/ts.py?field1="; // ts.py is the name of python script running on RPi3 const char* ssid = "SuiteUp"; // ssid_name const char* pass = "welcome@10"; // password int sensor = A0; // LM35 Analog Output float tempc; float svoltage; void setup(void){ // Function to Connect to Wi-Fi Serial.begin(115200); Serial.println(""); WiFi.begin(ssid, pass); // Wait for connection while (WiFi.status() != WL_CONNECTED) { delay(100); Serial.print("."); } Serial.println(""); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); } void loop() { float xval = analogRead(sensor); // Read Analog output from LM35 Temperature Sensor svoltage = (xval*3100.0)/1023; // value in mili volt tempc = svoltage/10; // value in degree celcius Serial.println(tempc); // display on serial monitor WiFiClient client; const int httpPort = 8000; if (!client.connect(host, httpPort)) { // connect to RPi3 CGI server with port no. 8000 Serial.println("connection failed"); return; } // send temperature data to RPi3 CGI server client.print(String("GET ") + path + String(tempc) + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: keep-alive\r\n\r\n"); // Format of the string for temp=25.4 is: // GET /cgi-bin/ts.py?field1=25.4 HTTP/1.1\r\nHost: 192.168.0.35\r\nConnection: keep-alive\r\n\r\n delay(10000); // wait for 1 sec }
ts.py: (To be kept in /cgi-bin/ on RPi3)
#!/usr/bin/env python ########################## #CHANGE FOLLOWING THINGS: # api_key (from step 3) ########################## # importing libraries import cgi import httplib, urllib import time sleep = 20 api_key = '7O4GGQFQGGPLYGF5' # Thinkspeak API_key def thermometer(val): # Function to send data to thinkspeak server using API temp = val params = urllib.urlencode({'field1': temp, 'key':api_key }) # set parameter for post/update request of thinkspeak server headers = {"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain"} # set header for post/update request of thinkspeak server conn = httplib.HTTPConnection("api.thingspeak.com:80") # connect to thinkspeak server try: conn.request("POST", "/update", params, headers) # Send post / update request to Thinkspeak server response = conn.getresponse() # read response from thinkspeak server print temp # print temperature print response.status, response.reason # print response from thinkspeak server data = response.read() conn.close() # close connection except: print "connection failed" # print error #break if __name__ == "__main__": # main function start here # while True: form = cgi.FieldStorage() # received form from Arduino val = form.getvalue('field1') # Temp data from Arduino f=open("TS_Out.txt",'a') # Open file in append mode f.write(str(val)+' \n') # write temperature data in the file f.flush() # copy from buffer to file f.close() # Close file thermometer(val) # Function to send data to thinkspeak server using API # time.sleep(sleep) # wait for desired amount of time
Click here to see more codes for Raspberry Pi 3 and similar Family.
&
Click here to see more codes for NodeMCU ESP8266 and similar Family.
&
Click here to see more codes for Arduino Mega (ATMega 2560) and similar Family.
Click here to see more codes for NodeMCU ESP8266 and similar Family.
&
Click here to see more codes for Arduino Mega (ATMega 2560) and similar Family.
Feel free to ask doubts in the comment section. I will try my best to solve it.
If you find this helpful by any mean like, comment and share the post.
This is the simplest way to encourage me to keep doing such work.
Thanks and Regards,
-Akshay P. Daga
Is this wifi communication between R-pi and ESP based on MQTT protocol?
ReplyDeleteThis is HTTP communication. But you can find MQTT protocol in next blogs. Use Top-Right search bar.
Delete