ThingSpeak is an application platform for the Internet of Things (IoT). ThingSpeak allows you to build an application around data collected by sensors. Features of ThingSpeak include: real-time data collection, data processing, visualizations, apps, and plugins.
Before start,you have to sign-up ThingSpeak, visit: https://thingspeak.com/ to register, creat channel, get API Key. You can also try it using web browser.
Connection, refer to last post of "Arduino Due + ESP8266 + DHT11, to update dweet.io".
Arduino code, Due8266Client_ThingSpeak.ino
/*
Arduino Due + ESP 8266 WiFi Module
- As STA to Join AP
- Connect to thingspeak.com as client,
to update my thing of Humidity and Temperature
(read from DHT11)
Serial (Tx/Rx) communicate to PC via USB
Serial3 (Tx3/Rx3) connect to ESP8266
Tx3 - ESP8266 Rx
Rx3 - ESP8266 Tx
ESP8266 CH_PD Connect to ESP8266 VCC
DHT11 connect to pin 2 of Arduino Due
for firmware:
"v0.9.5.2 AT Firmware"
(http://goo.gl/oRdG3s)
AT version:0.21.0.0
SDK version:0.9.5
*/
#define ESP8266 Serial3
#include "DHT.h"
#define DHTTYPE DHT11
#define DHTPIN 2 //pin 2 connect to DHT11
DHT dht(DHTPIN, DHTTYPE, 30); //30 for Arduino Due
String SSID = "TestAP";
String PASSWORD = "12345678";
int LED = 13;
boolean FAIL_8266 = false;
#define BUFFER_SIZE 1024
char buffer[BUFFER_SIZE];
void setup() {
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW);
delay(300);
digitalWrite(LED, HIGH);
delay(200);
digitalWrite(LED, LOW);
delay(300);
digitalWrite(LED, HIGH);
delay(200);
digitalWrite(LED, LOW);
do{
//Serial.begin(9600);
//ESP8266.begin(9600);
Serial.begin(115200);
ESP8266.begin(115200);
//Wait Serial Monitor to start
while(!Serial);
Serial.println("--- Start ---");
ESP8266.println("AT+RST");
delay(1000);
if(ESP8266.find("ready"))
{
Serial.println("Module is ready");
ESP8266.println("AT+GMR");
delay(1000);
clearESP8266SerialBuffer();
ESP8266.println("AT+CWMODE=1");
//ESP8266.println("AT+CWMODE=3");
delay(2000);
//Quit existing AP, for demo
Serial.println("Quit AP");
ESP8266.println("AT+CWQAP");
delay(1000);
clearESP8266SerialBuffer();
if(cwJoinAP())
{
Serial.println("CWJAP Success");
FAIL_8266 = false;
delay(3000);
clearESP8266SerialBuffer();
//Get and display my IP
sendESP8266Cmdln("AT+CIFSR", 1000);
//Set multi connections
sendESP8266Cmdln("AT+CIPMUX=1", 1000);
//sendESP8266Cmdln("AT+CIPMUX=0", 1000);
Serial.println("Setup finish");
}else{
Serial.println("CWJAP Fail");
delay(500);
FAIL_8266 = true;
}
}else{
Serial.println("Module have no response.");
delay(500);
FAIL_8266 = true;
}
}while(FAIL_8266);
digitalWrite(LED, HIGH);
//set timeout duration ESP8266.readBytesUntil
ESP8266.setTimeout(1000);
dht.begin();
}
void loop(){
float valHumidity;
float valTemperature;
do{
valHumidity = dht.readHumidity();
valTemperature = dht.readTemperature();
}while(isnan(valHumidity) || isnan(valTemperature));
Serial.println("Humidity=" + String(valHumidity));
Serial.println("Temperature=" + String(valTemperature));
/*
AT+CIPSTART=id,"type","addr",port
id = 0
type = "TCP"
addr = "www.example.com"
port = 80
*/
String TARGET_ID="0";
String TARGET_TYPE="TCP";
String TARGET_ADDR="184.106.153.149"; //ThingSpeak IP Address
String TARGET_PORT="80";
String cmd="AT+CIPSTART=" + TARGET_ID;
cmd += ",\"" + TARGET_TYPE + "\",\"" + TARGET_ADDR + "\"";
cmd += ","+ TARGET_PORT;
Serial.println(cmd);
ESP8266.println(cmd);
delay(1000);
//Assume OK
//display and clear buffer
clearESP8266SerialBuffer();
/*
POST /update?key=<API KEY>&field1=xx.xx&field2=xx.xx HTTP/1.1\r\n
Host: api.thingspeak.com\r\n\r\n
*/
String ThingSpeakMethod = "POST"; //GET should also work
String ThingSpeakHost = "/update";
String ThingSpeakApiKey = "42WKM35W3FR0OJUG";
String ThingSpeakField1 = "field1";
String ThingSpeakField2 = "field2";
String ThingSpeakHttp = "HTTP/1.1";
String ThingSpeak_2ndLine = "Host: api.thingspeak.com\r\n\r\n";
String HTTP_RQS = ThingSpeakMethod;
HTTP_RQS += " " + ThingSpeakHost;
HTTP_RQS += "?key=" + ThingSpeakApiKey;
HTTP_RQS += "&" + ThingSpeakField1 + "=" + valHumidity;
HTTP_RQS += "&" + ThingSpeakField2 + "=" + valTemperature;
HTTP_RQS += " " + ThingSpeakHttp + "\r\n";
HTTP_RQS += ThingSpeak_2ndLine;
String cmdSEND_length = "AT+CIPSEND=";
cmdSEND_length += TARGET_ID + "," + HTTP_RQS.length() +"\r\n";
ESP8266.print(cmdSEND_length);
Serial.println(cmdSEND_length);
Serial.println("waiting >");
if(!ESP8266.available());
if(ESP8266.find(">")){
Serial.println("> received");
ESP8266.println(HTTP_RQS);
Serial.println(HTTP_RQS);
boolean OK_FOUND = false;
//program blocked untill "SEND OK" return
while(!OK_FOUND){
if(ESP8266.readBytesUntil('\n', buffer, BUFFER_SIZE)>0){
Serial.println("...");
Serial.println(buffer);
if(strncmp(buffer, "SEND OK", 7)==0){
OK_FOUND = true;
Serial.println("SEND OK found");
}else{
Serial.println("Not SEND OK...");
}
}
}
if(OK_FOUND){
delay(1000);
//Dummy display received data
while (ESP8266.available() > 0) {
char a = ESP8266.read();
Serial.write(a);
}
}
}else{
Serial.println("> NOT received, something wrong!");
}
//Close connection
String cmdCIPCLOSE = "AT+CIPCLOSE=" + TARGET_ID;
ESP8266.println(cmdCIPCLOSE);
Serial.println(cmdCIPCLOSE);
delay(5000);
}
boolean waitOKfromESP8266(int timeout)
{
do{
Serial.println("wait OK...");
delay(1000);
if(ESP8266.find("OK"))
{
return true;
}
}while((timeout--)>0);
return false;
}
boolean cwJoinAP()
{
String cmd="AT+CWJAP=\"" + SSID + "\",\"" + PASSWORD + "\"";
ESP8266.println(cmd);
return waitOKfromESP8266(10);
}
//Send command to ESP8266, assume OK, no error check
//wait some time and display respond
void sendESP8266Cmdln(String cmd, int waitTime)
{
ESP8266.println(cmd);
delay(waitTime);
clearESP8266SerialBuffer();
}
//Basically same as sendESP8266Cmdln()
//But call ESP8266.print() instead of call ESP8266.println()
void sendESP8266Data(String data, int waitTime)
{
//ESP8266.print(data);
ESP8266.print(data);
delay(waitTime);
clearESP8266SerialBuffer();
}
//Clear and display Serial Buffer for ESP8266
void clearESP8266SerialBuffer()
{
Serial.println("= clearESP8266SerialBuffer() =");
while (ESP8266.available() > 0) {
char a = ESP8266.read();
Serial.write(a);
}
Serial.println("==============================");
}
Hello !
ReplyDeleteWhy have this erorr ?
sketch_aug24a:23: error: 'Serial3' was not declared in this scope
Not all Arduino board support 'Serial3'. it you are using Arduino Due, you have to select correct board.
DeleteCongratulations for video.
ReplyDeleteIs it possible the thingspeak send command to esp8266?
Thank you, good week.