Results for
I followed the instructions here: Bulk-Update Using an Arduino or an ESP8266
And came up the following code for GSM module:
const char apn[] = "www";
const char gprsUser[] = "";
const char gprsPass[] = "";const char simPIN[] = "";
const char server[] = "api.thinkspeak.com";
const int port = 80;char jsonBuffer[500] = "["; // Initialize the jsonBuffer to hold data
// TTGO T-Call pins
#define MODEM_RST 5
#define MODEM_PWKEY 4
#define MODEM_POWER_ON 23
#define MODEM_TX 27
#define MODEM_RX 26 #define SerialMon Serial
#define SerialAT Serial1
#define TIMEOUT 5000
// Configure TinyGSM library
#define TINY_GSM_MODEM_SIM800 // Modem is SIM800
#define TINY_GSM_RX_BUFFER 1024 // Set RX buffer to 1Kb #include <TinyGsmClient.h>
#ifdef DUMP_AT_COMMANDS
#include <StreamDebugger.h>
StreamDebugger debugger(SerialAT, SerialMon);
TinyGsm modem(debugger);
#else
TinyGsm modem(SerialAT);
#endifTinyGsmClient client(modem);
#define IP5306_ADDR 0x75
#define IP5306_REG_SYS_CTL0 0x00 /* Collect data once every 15 seconds and post data to ThingSpeak channel once every 2 minutes */
unsigned long lastConnectionTime = 0; // Track the last connection time
unsigned long lastUpdateTime = 0; // Track the last update time
const unsigned long postingInterval = 60L * 1000L; // Post data every 2 minutes
const unsigned long updateInterval = 15L * 1000L; // Update once every 15 seconds void setup() {
SerialMon.begin(115200); // Set modem reset, enable, power pins
pinMode(MODEM_PWKEY, OUTPUT);
pinMode(MODEM_RST, OUTPUT);
pinMode(MODEM_POWER_ON, OUTPUT);
digitalWrite(MODEM_PWKEY, LOW);
digitalWrite(MODEM_RST, HIGH);
digitalWrite(MODEM_POWER_ON, HIGH); // Set GSM module baud rate and UART pins
SerialAT.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX);
delay(3000); SerialMon.println("Initializing modem...");
modem.init();// Configure the wake up source as timer wake up
SerialMon.print("Connecting to APN: ");
SerialMon.print(apn);
if (!modem.gprsConnect(apn, gprsUser, gprsPass)) {
SerialMon.println(" fail");
}
else {
SerialMon.println(" OK"); SerialMon.print("Connecting to ");
SerialMon.print(server);
if (!client.connect(server, port)) { SerialMon.println(" Fail");
}
else {
SerialMon.println(" OK");
}
}}
void loop() {
// If update time has reached 1 second, then update the jsonBuffer
if (millis() - lastUpdateTime >= updateInterval) {
updatesJson(jsonBuffer);
}}
// Updates the josnBuffer with data
void updatesJson(char* jsonBuffer){
/* JSON format for updates paramter in the API
* This examples uses the relative timestamp as it uses the "delta_t". You can also provide the absolute timestamp using the "created_at" parameter
* instead of "delta_t".
* "[{\"delta_t\":0,\"field1\":-70},{\"delta_t\":3,\"field1\":-66}]"
*/
// Format the jsonBuffer as noted above
strcat(jsonBuffer,"{\"delta_t\":");
unsigned long deltaT = (millis() - lastUpdateTime)/1000;
size_t lengthT = String(deltaT).length();
char temp[4];
String(deltaT).toCharArray(temp,lengthT+1);
strcat(jsonBuffer,temp);
strcat(jsonBuffer,",");
int h = hallRead();
strcat(jsonBuffer, "\"field1\":");
lengthT = String(h).length();
String(h).toCharArray(temp,lengthT+1);
strcat(jsonBuffer,temp);
strcat(jsonBuffer,"},");
// If posting interval time has reached 2 minutes, update the ThingSpeak channel with your data
if (millis() - lastConnectionTime >= postingInterval) {
size_t len = strlen(jsonBuffer);
jsonBuffer[len-1] = ']';
httpRequest(jsonBuffer);
}
lastUpdateTime = millis(); // Update the last update time
} // Updates the ThingSpeakchannel with data
void httpRequest(char* jsonBuffer) {
/* JSON format for data buffer in the API
* This examples uses the relative timestamp as it uses the "delta_t". You can also provide the absolute timestamp using the "created_at" parameter
* instead of "delta_t".
* "{\"write_api_key\":\"YOUR-CHANNEL-WRITEAPIKEY\",\"updates\":[{\"delta_t\":0,\"field1\":-60},{\"delta_t\":15,\"field1\":200},{\"delta_t\":15,\"field1\":-66}]
*/
// Format the data buffer as noted above
char data[500] = "{\"write_api_key\":\"XXXXXXXXXXXXXXXX\",\"updates\":"; // Replace YOUR-CHANNEL-WRITEAPIKEY with your ThingSpeak channel write API key
strcat(data,jsonBuffer);
strcat(data,"}");
// Close any connection before sending a new request
client.stop();
String data_length = String(strlen(data)+1); //Compute the data buffer length
Serial.println(data);
// POST data to ThingSpeak
if (client.connect(server, 80)) {
client.println("POST /channels/1300373/bulk_update.json HTTP/1.1"); // Replace YOUR-CHANNEL-ID with your ThingSpeak channel ID
client.println("Host: api.thingspeak.com");
client.println("User-Agent: mw.doc.bulk-update (ESP8266)");
client.println("Connection: close");
client.println("Content-Type: application/json");
client.println("Content-Length: "+data_length);
client.println();
client.println(data);
String answer=getResponse();
Serial.println( answer );
}
else {
Serial.println("Failure: Failed to connect to ThingSpeak");
}
delay(250); //Wait to receive the response
client.parseFloat();
String resp = String(client.parseInt());
Serial.println("Response code:"+resp); // Print the response code. 202 indicates that the server has accepted the response
jsonBuffer[0] = '['; //Reinitialize the jsonBuffer for next batch of data
jsonBuffer[1] = '\0';
lastConnectionTime = millis(); //Update the last conenction time
} String getResponse(){
String response;
long startTime = millis(); delay( 200 );
while ( client.available() < 1 && (( millis() - startTime ) < TIMEOUT ) ){
delay( 5 );
} if( client.available() > 0 ){ // Get response from server.
char charIn;
do {
charIn = client.read(); // Read a char from the buffer.
response += charIn; // Append the char to the string response.
} while ( client.available() > 0 );
}
client.stop(); return response;
}The Response code I was getting initially was "0" Upon consulting the forum I added a new function to get response and here is the message it produced:
HTTP/1.1 405 Not Allowed Server: nginx Date: Wed, 17 Feb 2021 06:27:54 GMT Content-Type: text/html Content-Length: 8911 Connection: close ETag: "5e5304fb-22cf" X-DIS-Request-ID: 82c8c8535e18295aaeec025d18d14375 Set-Cookie: dis-remote-addr=1.39.31.10 Set-Cookie: dis-timestamp=2021-02-16T22:27:54-08:00 Set-Cookie: dis-request-id=82c8c8535e18295aaeec025d18d14375 X-Frame-Options: sameorigin
Please help me understand this error and rectify the code. P.S. I was able to run the code using WiFi module of the ESP32, so is this something to do with 256 limit? If so, how do I rectify it?
After I give the commands I get a response like this
AT+CIPSTART="TCP","api.thingspeak.com","80" OK
CONNECT OK AT+CIPSEND > GET https://api.thingspeak.com/update?api_key=Q03CA55P7NVGA8S8&field1=23 SEND OK
CLOSED
But the field charts are not updated in the website. And the data widget shows "no data available to show". And the number of entries remains 0. kindly help me out why I didn't get the values.
I have an Esp8266 weather station and I want the graphs in thingspeak to display customary units instead of metric. How do I do it?
Hello,
I would like to share a channel with some users, but when I do it, they can see the channel in "Channels share with me" but when they open the channel the can not see the data inside. There is a message saying: You don't have permission to view that channel! Do you know why is that? Thank you.
Hi there, my PI submitted some (3) wrong values to my channel. I didn't find am opportunity to remove them. Can anoyone help or give me a hint? Those 3 wrong values are killing my statistic and let the chart look very wrog due to those peaks Thanx to you
ok I want to extract all those rows in a table where one column has strings in which it shall contain the word "change" specifically after the word "terms" . text is : May not be redeemed for cash or combined with any other offer or coupon. Not valid on clearance (merchandise ending in .98). May not be applied to taxes, previous purchases, or the purchase of gift cards. Non-transferable. Terms are subject to change at any time. Product styles are subject to availability. See store associate for details.
Hello, I am interested in creating an IoT academic project, but I have encountered two difficulties: 1- It is necessary that in the ThingSpeak interface you can see a live camera. I have not found documentation or any information on how to do it. Yes, I know that you can import data from other websites (copy XPath), but I have not achieved it with traffic cameras from local websites. 2- I also need to act remotely on actuators, is this possible in ThingSpeak?
I would appreciate an honest answer, since in case of not being able to implement these solutions, I will have to find another platform or method to carry out this. Regards!
Hi,
I would like to export data from my channel. My channel receives data every 15 minutes but I would like to export the data similar to what I can see when I change the chart/field's timescale to 60 minutes.
Thanks!
Hi everyone,
I have been using Thingspeak for quite some time now for monitoring data for my wife‘s greenhouse. She accesses those data via the public view of the channel. So far, so good.
Now someone has used the „feature“ to add a comment to that view. Nothing serious, but my wife isn‘t happy. Therefore she asked me to remove the comment, and to set things up in such a way that comments can no longer be added.
Thus my two questions: 1. How can I delete the comment? 2. How can I disable comments made by not signed on users?
The channel in question is https://thingspeak.com/channels/971602
With best regards
Volker Bandke
I'm presently working on an Air Quality monitor to be able to check the status of my environment and remote environments on ThingSpeak. I was planning on using the BME680 sensor. Does anyone have any experience with this or other air quality sensors? I'm looking probably for CO2 and the like (Volatile Organics), not so much particle sensors, though a combination may be best.
Hi,
I set at the Chart Options Results on 40320, what should be one week. But the graph shows only 36 hours (and some minutes). I also try to set it results on 7 day, but still I get only 36 hours.
Why it is not showing 7 days graph?
Frank
https://thingspeak.com/channels/1222127
Happy New Year, everyone! We hope you enjoyed the Cody contest in 2020, learned new MATLAB skills, and made a friend or two. While the 2020 contest has concluded, the fun and learning never end.
Please take the 1-minute survey to talk about your experience (only 2 required questions). Our goal is to make future contests better and more appealing to you, so your feedback is critical to us.
Thank you in advance and hope to see you again in the 2021 contest.
Right now ThingSpeak supports up to 8 fields of data plus the status and three position fields. If you could have more fields, how many would you want? I have one channel of control settings for a project that I would have used up to 12, but no more than that.
Did you know you can change your user id? We went through a short time where everyone was auto assigned a long user id with 'mwa' and a bunch of numbers that couldn't be changed. You can now make it something more relevant to your actual IoT persona. Click on your user picture or icon on the upper right. Select 'My Profile' and click the Edit button under username. Share your interesting IoT themed names here.
We are excited to announce that Cody Contest 2020 starts today! Again, the rule is simple - solve any problem and rate its difficulty. If you have any question, please visit our FAQs page first. Want to know your ranking? Check out the contest leaderboard .
Happy problem-solving! We hope you are a winner.
Below are some FAQs for the Cody contest 2020. If you have any additional questions, ask your questions by replying to this post. We will keep updating the FAQs.
Q1: If I rate a problem I solved before the contest, will I still get a raffle ticket?
A: Yes. You can rate any problem you have solved, whether it was before or during the contest period.
Q2: When will I receive the contest badges that I've earned?
A: All badges will be awarded after the contest ends.
Q3: How do I know if I’m the raffle winner?
A: If you are a winner, we will contact you to get your name and mailing address. You can find the list of winners on the Cody contest page .
Q4: When will I receive my T-shirt or hat?
A: You will typically receive your prize within a few weeks. It might take longer for international shipping.
Q5: I'm new to Cody. If I have some questions about using Cody, how can I get help?
A: You can ask your question by replying this post. Other community users might help you and we will also monitor the threads. You might also find answers here .
Q6: What do I do if I have a question about a specific problem?
A: If the problem description is unclear, the test suite is broken, or similar concerns arise, post your question(s) as a comment on the specific problem page. If you are having a hard time solving a problem, you can post a comment to your solution attempt (after submitting it). However, do not ask other people to solve problems for you.
Q7: If I find a bug or notice someone is cheating/spamming during the contest, how can I report it?
A: Use Web Site Feedback . Select "MATLAB Central" from the category list.
Q8: Why can't I rate a problem?
A: To rate a problem, you must solve that problem first and have at least 50 total points.
- matrix1, matrix2, matrix3, matrix4, ...
- test_20kmh, test_50kmh, test_80kmh, ...
- nameA, nameB, nameC, nameD,...
- Slow
- Buggy
- Security Risk
- Difficult to Work With
- Obfuscated Code Intent
- Confuses Data with Code
- Code Helper Tools do not Work
- Magically Making Variables Appear in a Workspace is Risky
- Indexing into Cell Array or ND-Array
- Non-scalar Structures (with Indexing)
- Dynamic Field-Names in a Structure
- load into a Structure, not into the Workspace
- save the Fields of a Scalar Structure
- Use a table or timetable Array
- Use more Efficient Ways to Pass Variables Between Workspaces