Marco in Discussions
上次活动时间: 2024-5-13

I isolated a var that I'm interested in, and I want to connect Node-RED to thingspeak to show the values on the graph. The problem is the node "mqttout": I connected it to the server mqtt3.thingspeak.com and the port 1883, and with the device with right username and password. It shows "connected", but the graph is still the same, I can not upload the varabiles. mqtt connection problem Have you created an MQTT device in ThingSpeak and given permissions for MQTT to write to the channel? See the instructions in the MQTT Basics. Yes I have it, I don't know why it doesn't work I reccomend troubleshooting using the desktop client. You can see instructions in the help link I send above. Also , a common casue of not seing data on the field plots is sending non numeric data by accident. Make sure to export the recent data in your channel to be sure its not there but in an unexpected format. mqtt connection node-red upload
Iva Jerabkova in MATLAB Answers
上次活动时间: 2024-1-18

I am making a sample project from Arduino Project Hub - Plant Communicator On TS I receive data only 2 times after I upload the sketch. I want to upload data every minute, the first two minutes are successful, after that my Serial monitor shows "message sent to cloud" but nothing new shows up on TS. I also tried with another sketch that just generates numbers and uploads them on TS to make sure that there is nothing wrong with the sensors that I use in this project. With the sketch that generates random numbers and sends them to TS, I get the same outcome: data is uploaded first and second time, after that nothing. (Both sketches compiled without errors. Instead of using WiFi I tried to make a hotspot from my phone - doesn't help either.) Thanks for any help! #include "arduino_secrets.h" #include <WiFi101.h> #include<WiFiSSLClient.h> #include <RTCZero.h> #include "ThingSpeak.h" const char* ssid = SECRET_SSID; // your network SSID (name) const char* password = SECRET_PSWD; // your network password WiFiClient ThingSpeakClient; unsigned long myChannelNumber = 10; const char * myWriteAPIKey = SECRET_WRITE_API; RTCZero rtc; // create RTC object /* Change these values to set the current initial time */ const byte seconds = 0; const byte minutes = 28; const byte hours = 17; /* Change these values to set the current initial date */ const byte day = 4; const byte month = 12; const byte year = 17; int lightPin = A0; //the analog pin the light sensor is connected to int tempPin = A1; //the analog pin the TMP36's Vout (sense) pin is connected to int moisturePin= A2; // Set this threeshold accordingly to the resistance you used // The easiest way to calibrate this value is to test the sensor in both dry and wet earth int threeshold= 800; bool alert_already_sent=false; bool email_already_sent=true; bool already_sent_to_cloud=true; void setup() { Serial.begin(9600); while(!Serial); delay(2000); Serial.print("Connecting Wifi: "); Serial.println(ssid); while (WiFi.begin(ssid, password) != WL_CONNECTED) { Serial.print("."); delay(1500); } Serial.println(""); Serial.println("WiFi connected"); rtc.begin(); // initialize RTC 24H format rtc.setTime(hours, minutes, seconds); rtc.setDate(day, month, year); rtc.setAlarmTime(17, 30, 0); // Set the time for the Arduino to send the email ThingSpeak.begin(ThingSpeakClient); rtc.setAlarmTime(0, 0, 0); //in this way the request is sent every minute at 0 seconds rtc.enableAlarm(rtc.MATCH_SS); rtc.attachInterrupt(thingspeak_alarm); } void loop() { if(!already_sent_to_cloud){ ThingSpeak.setField(1,get_light()); ThingSpeak.setField(2,get_temperature()); ThingSpeak.setField(3,get_average_moisture()); ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey); delay(1500); already_sent_to_cloud=true; delay(1500); Serial.println("message sent to cloud"); delay(1500); } } float get_temperature(){ int reading = analogRead(tempPin); float voltage = reading * 3.3; voltage /= 1024.0; // Print tempeature in Celsius float temperatureC = (voltage - 0.5) * 100 ; //converting from 10 mv per degree wit 500 mV offset // Convert to Fahrenheit float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0; return temperatureC; } int get_average_moisture(){ // make an average of 10 values to be more accurate int tempValue=0; // variable to temporarly store moisture value for(int a=0; a<10; a++){ tempValue+=analogRead(moisturePin); delay(1000); } return tempValue/10; } int get_light(){ int light_value=analogRead(A0); return light_value; } void thingspeak_alarm(){ already_sent_to_cloud=false; }
Desmond Hanan in Discussions
上次活动时间: 2023-7-26

I was testing some sensors using code that I've run before successfully on an Arduino device to update to thingspeak, but I keep getting the http error code -302. if true % code #include <SPI.h> #include <WiFi101.h> #include <Wire.h> #include <secrets_new.h> #include <ThingSpeak.h> #include <SD.h> char ssid[] = SECRET_SSID; // your network SSID (name) WiFiClient client; unsigned long myChannelNumber = SECRET_CH_ID; const char * myWriteAPIKey = SECRET_WRITE_APIKEY; int soil_moisture_2cm = 0; int soil_moisture_5cm = 0; int soil_temperature_2cm = 0; int soil_temperature_5cm = 0; void setup() { // put your setup code here, to run once: WiFi.setPins(8,7,4,2); Wire.begin(); delay(1000); Serial.begin(9600); if (WiFi.status() == WL_NO_SHIELD) { Serial.println("Communication with WiFi module failed!"); // don't continue while (true); } String fv = WiFi.firmwareVersion(); if (fv != "1.0.0") { Serial.println("Please upgrade the firmware"); } ThingSpeak.begin(client); } void loop() { if(WiFi.status() != WL_CONNECTED){ Serial.print("Attempting to connect to SSID: "); Serial.println(SECRET_SSID); while(WiFi.status() != WL_CONNECTED){ WiFi.begin(ssid); // Connect to WPA/WPA2 network. Change this line if using open or WEP network Serial.print("."); delay(5000); } Serial.println("\nConnected."); } soil_moisture_2cm = analogRead(A0); soil_moisture_5cm = analogRead(A1); soil_temperature_2cm = analogRead(A2); soil_temperature_5cm = analogRead(A3); ThingSpeak.setField(1, soil_moisture_2cm); ThingSpeak.setField(2, soil_moisture_5cm); ThingSpeak.setField(3, soil_temperature_2cm); ThingSpeak.setField(4, soil_temperature_5cm); int y = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey); if(y == 200){ Serial.println("Channel 2 update successful."); } else{ Serial.println("Problem updating channel 2. HTTP error code " + String(y)); } delay(30000); } end Can't update fields to thing speak Did you start experiencing this problem recently? Can you tell us more about the wifi shield you are using? We have recently upgraded our <https://www.mathworks.com/products/thingspeak/system-requirements.html system requirements> to require TLS 1.2. See the system requirements for additional details. Can you also try updating your channel in a browser address bar, just to make sure that works? Its a good basic step to limit out other problems. Many of the errors in the library have to do with connectivity. Can you restart your router and your Adruino device and try again? Hi Christopher, I am having similar problem my channel stopped recieving data from my devices starting from Dec 14th, before that it was working for years. I can update my channel through the browser though. Do you have information about the WiFi shield? Is it possible to upgrade its firmware? No idea, I use ESP8266 ESP12 module with WIFI embedded. It is from 6 years ago it worked as it is during this period. WOW thank god, I'm not the only one here!!! I've been struggling for more than a week now, banging my head for answers in hope for finding someone with the same problem as me! Yesss indeed the last msg I got from my sensors on the field was on the 13th of December. I tried everything I even opened a complaint ticket with my M2M GSM provider hoping the problem is from their end. On a separate test device, I managed to get the problem fixed by removing the SSL from the HTTP request I send from the GSM module (sim800L) then it worked fine ... I'm not that concerned about security since this is a research project for the University, however, I would really not prefer to drive all across Jordan (it's a big desert in case you don't know) to update the code on every device I have on the field. Please help us fix this!!! I was hesitant to open a new discussion regarding this topic but since I'm not the only one facing the problem ill open a new discussion and post a sample code thanks armen for sharing your experience, i hope changing the SSL works for you as well To be clear, Armen's code does not appear to be using WiFiClientSecure and HTTPS with SSL/TLS. This is unlikely to be related to any changes we made on ThingSpeak. Ghaith, can you share the code on your device? Is the SIM800L module doing the SSL/TLS handshakes? What versions of SSL/TLS do those modules support? Ahaa I didn't check armens code actually, but i was so happy to see someone with the same problem date as me. To give you a clear picture: Im using arduino pro mini with SIM800L and Im collecting weather data remotely using GPRS HTTPS posts to Thingspeak's API (writing bulk csv data). tens of these devices were functioning seamlessly for the past 3 years until the 14th of December, when they all went silent. This is a simple code that had been working before the 14th (or the release i read about <https://www.mathworks.com/matlabcentral/discussions/thingspeak/731230-is-the-thingspeak-site-updated-today/2418060#reply_2418060 here> ) #include <SoftwareSerial.h> SoftwareSerial mySerial(8, 7); // RX, TX Pins #define GSMswitch 9 // select the pin for the switch to turn the GSM on/off void setup() { pinMode(GSMswitch, OUTPUT); digitalWrite(GSMswitch, HIGH); Serial.begin(9600); Serial.println("Salamzzz"); mySerial.begin(9600); delay(8000); } void loop() { gsm_sendhttp(); } void gsm_sendhttp() { mySerial.println("AT"); delay(500); ShowResponse(); Serial.println(""); mySerial.println(F("AT+SAPBR=3,1,Contype,GPRS")); delay(100); ShowResponse(); Serial.println(""); mySerial.println(F("AT+SAPBR=3,1,APN,m2ms.orange.jo")); //change according to network - Umniah "mySerial.println(F("AT+SAPBR=3,1,APN,net"));" - Zain "mySerial.println(F("AT+SAPBR=3,1,APN,zain"));" delay(100); ShowResponse(); Serial.println(""); mySerial.println(F("AT+SAPBR =1,1")); delay(100); ShowResponse(); Serial.println(""); mySerial.println(F("AT+SAPBR=2,1")); delay(5000);//absolute minumum 1000ms ShowResponse(); Serial.println(""); // wdt_reset(); mySerial.println(F("AT+HTTPINIT")); delay(100); ShowResponse(); Serial.println(""); mySerial.println("AT+HTTPSSL=1"); delay(100); ShowResponse(); Serial.println(""); mySerial.println(F("AT+HTTPPARA=CID,1")); delay(100); ShowResponse(); Serial.println(""); mySerial.println(F("AT+HTTPPARA=URL,https://api.thingspeak.com/channels/******/bulk_update.csv")); //to change channel simply replace the 6-digit number between "channels/" and "/bulk_update.csv" delay(200); while(mySerial.available()>0){ Serial.write(mySerial.read());delay(1);} Serial.println(""); mySerial.println(F("AT+HTTPPARA=CONTENT,application/x-www-form-urlencoded")); delay(200); ShowResponse(); Serial.println(""); ShowResponse(); Serial.println(""); mySerial.println(F("AT+HTTPDATA=400,2000")); //absolute minumum 1000ms delay(200); ShowResponse(); Serial.println(""); mySerial.print(F("write_api_key=******************&time_format=relative&updates=1,1,2,3")); delay(2000); //absolute minumum 1000ms ShowResponse(); Serial.println(""); mySerial.println(F("AT+HTTPACTION=1")); delay(500); //absolute minumu 5000ms mySerial.println(F("AT+HTTPREAD")); delay(100); //absolute minumu 5000ms ShowResponse(); Serial.println(""); } void ShowResponse(){ while(mySerial.available()>0){ Serial.write(mySerial.read()); delay(20); } } for this same code to work again now i have to omit the AT+HTTPSSL=1 part and use HTTP instead of HTTPS I will check the Product Identification (ATI command) for the SIM800L modules I have, and check what firmware is installed then get back to you on that. I guess I should update the firmware. is that right? thanks Vinod Based on Google searches and the app note <https://www.simcom.com/product/SIM800.html here>, I think you need to add this AT command to enable TLS 1.2 on the SIM800 module: +SSLOPT=1,1. I believe you may also need to update the firmware on the SIM800L module so it can do HTTPS over TLS1.2. Earlier versions of TLS are vulnerable to attacks and are no longer supported when making secure connections to ThingSpeak. Hi @Christopher I tried restarting all of the devices including wifi router, no luck. Should I update firmware of my ESP8266? Here is my code sending and recieving data to Thingspeak: if true % code endbool sendDataToThingspeak(int fieldID, int workingTimeRemaining) { if(WiFi.status() == WL_CONNECTED) { // Use WiFiClient class to create TCP connections WiFiClientSecure client; if (!client.connect(host, httpsPort)) { SERIAL_PRINTLN("connection failed"); return false; } // We now create a URI for the request String url = "/update?api_key="; url += writeAPIKey; url += String("&field") + fieldID + "="; url += workingTimeRemaining; SERIAL_PRINT("Requesting URL: "); SERIAL_PRINTLN(url); // This will send the request to the server client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); delay(1000); // Read all the lines of the reply from server and print them to Serial while(client.available()){ String line = client.readStringUntil('\r'); SERIAL_PRINT(line); } SERIAL_PRINTLN(); SERIAL_PRINTLN("closing connection"); return true; } return false; } bool getIntFromThingspeak(int fieldID, int & value) { if(WiFi.status() == WL_CONNECTED) { // Use WiFiClient class to create TCP connections WiFiClientSecure client; if (!client.connect(host, httpsPort)) { SERIAL_PRINTLN("connection failed"); return false; } // We now create a URI for the request String url = "/channels/79666/fields/"; url += fieldID; url += "/last.json?api_key="; url += readAPIKey; SERIAL_PRINT("Requesting URL: "); SERIAL_PRINTLN(url); // This will send the request to the server client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); delay(100); value = 0; // Read all the lines of the reply from server and print them to Serial String findString = String("\"field") + fieldID + "\":\""; if(client.find(findString.c_str())) { String line = client.readStringUntil('\"'); value = line.toInt(); SERIAL_PRINT(line); } SERIAL_PRINTLN(); SERIAL_PRINTLN("closing connection"); return true; } return false; } Ditto Galiath, thanks for sharing. I am also glad to hear I am not the only one with the problem :). Was you able to solve the issue rather than removeing the SSL? Secure channel is not crucial in my case either. I am just curious to know whether there is a final solution for this. My code stnippet sending and recieveing data from Thingspeak is following: bool sendDataToThingspeak(int fieldID, int workingTimeRemaining) { if(WiFi.status() == WL_CONNECTED) { // Use WiFiClient class to create TCP connections WiFiClientSecure client; if (!client.connect(host, httpsPort)) { SERIAL_PRINTLN("connection failed"); return false; } // We now create a URI for the request String url = "/update?api_key="; url += writeAPIKey; url += String("&field") + fieldID + "="; url += workingTimeRemaining; SERIAL_PRINT("Requesting URL: "); SERIAL_PRINTLN(url); // This will send the request to the server client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); delay(1000); // Read all the lines of the reply from server and print them to Serial while(client.available()){ String line = client.readStringUntil('\r'); SERIAL_PRINT(line); } SERIAL_PRINTLN(); SERIAL_PRINTLN("closing connection"); return true; } return false; } bool getIntFromThingspeak(int fieldID, int & value) { if(WiFi.status() == WL_CONNECTED) { // Use WiFiClient class to create TCP connections WiFiClientSecure client; if (!client.connect(host, httpsPort)) { SERIAL_PRINTLN("connection failed"); return false; } // We now create a URI for the request String url = "/channels/79666/fields/"; url += fieldID; url += "/last.json?api_key="; url += readAPIKey; SERIAL_PRINT("Requesting URL: "); SERIAL_PRINTLN(url); // This will send the request to the server client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); delay(100); value = 0; // Read all the lines of the reply from server and print them to Serial String findString = String("\"field") + fieldID + "\":\""; if(client.find(findString.c_str())) { String line = client.readStringUntil('\"'); value = line.toInt(); SERIAL_PRINT(line); } SERIAL_PRINTLN(); SERIAL_PRINTLN("closing connection"); return true; } return false; } Yes, definitely upgrade the firmware when you can. Be sure you update the libraries and board files before programming as well. Since you appear to be writing directly from the ESP8266, you could probably benefit greatly from using the <https://github.com/mathworks/thingspeak-arduino ThingSpeak library> in your code as well. @Christopher I have updated the code to match to the latest Tingspeak examples. Please see the code below. Also Updated NodeMCU ESP8266 module with the latest firmware. I still get folloiwing error when it tries to read an integer filed: >>Problem reading channel. HTTP error code -301 I have also tried with a different WIFI device (My phone's hotspot), the same result. It can connect to the router but can't send/recieve data from Thingspeak. bool sendIntToThingspeak_T(int fieldID, int value) { if(WiFi.status() == WL_CONNECTED) { // Write to ThingSpeak. There are up to 8 fields in a channel, allowing you to store up to 8 different // pieces of information in a channel. Here, we write to field 1. int x = ThingSpeak.writeField(homeSweetHomeChannelNumber, fieldID, value, readAPIKey); if(x == 200) { Serial.println("Channel update successful."); } else Serial.println("Problem updating channel. HTTP error code " + String(x)); } return false; } bool getIntFromThingspeak_T(int fieldID, int & value) { if(WiFi.status() == WL_CONNECTED) { // Use WiFiClient class to create TCP connections float valueOut = ThingSpeak.readLongField(homeSweetHomeChannelNumber, fieldID, readAPIKey); // Check the status of the read operation to see if it was successful int statusCode = ThingSpeak.getLastReadStatus(); if(statusCode == 200) { value = valueOut; SERIAL_PRINTLN("VentBot remainting: " + String(valueOut)); return true; } else SERIAL_PRINTLN("Problem reading channel. HTTP error code " + String(statusCode)); } return false; } An update: it started to work normally when I changed WiFiClientSecure to WiFiClient. I think it is the same case as Ghaith also shared, there must be something changed/broken in the secure connection. I'd recommend using secure connections. See <https://www.mathworks.com/matlabcentral/discussions/thingspeak/733560-writing-to-field-with-ssl-https-443/2421920#reply_2421920 the instructable linked here> for what you need to do to update the firmware on your esp8266. I also meet the same question. Could you tell me how to change WiFiClientSecure to WiFiClient? Simply renaming declaration of WiFiClientSecure to WiFiClient will do the work, but I suggest to make the secure connection work if it is important for your application. @Vinod provided the instructions. arduino upload
rene in Discussions
上次活动时间: 2022-12-5

hello, i buy a license for upload images to channel and ESP32CAM, after compile and upload the example code, then reset the esp32. https://la.mathworks.com/help/thingspeak/write-image-to-thingspeak-from-esp32-camera-board.html the serial monitor only show Brownout detector was triggered ets Jun 8 2016 00:22:57 rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 0, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:1 load:0x3fff0018,len:4 load:0x3fff001c,len:1216 ho 0 tail 12 room 4 load:0x40078000,len:10944 load:0x40080400,len:6388 entry 0x400806b4 i have another code working for esp32cam and send image to telegram... maybe any can show why works there and not here please. esp32cam upload image, example dont work It looks like in your more recent MATLAB answer, you were able to get an image up to ThingSpeak. Can you update this discussion and let us know what the problem was, if you were able to fix it? hi, after compare two codes, i can say this in void setup, activate the cam. WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); but i think is the programer to esp32cam maybe, i have a FT232RL. in the example option here show another. btw here is the code working for me with a magnetic sensor door in pin 2, when sensor is open image upload, or you can delete in the void loop. esp32cam image upload license
Walter Diego Spaltro in Discussions
上次活动时间: 2022-3-31

Hi all, don't upload data to Thingspeak (sorry my english) I'm build this counter geiger <https://www.electronics-lab.com/project/new-improved-geiger-counter-now-wifi/> but not upload data, only appear this to my channel: 29T23:17:58Z","entry_id":112,"field1":null},{"created_at":"2022-03-29T23:22:58Z","entry_id":113,"field1":null},{"created_at":"2022-03-29T23:27:58Z","entry_id":114,"field1":null},{"created_at":"2022-03-29T23:32:58Z","entry_id":115,"field1":null},{"created_at":"2022-03-30T18:43:09Z","entry_id":116,"field1":null},{"created_at":"2022-03-30T19:00:19Z","entry_id":117,"field1":null},{"created_at":"2022-03-30T19:05:19Z","entry_id":118,"field1":null},{"created_at":"2022-03-30T19:10:19Z","entry_id":119,"field1":null}]} The code I'm use is there <https://www.electronics-lab.com/project/new-improved-geiger-counter-now-wifi/> sorry it does not allow me to upload it because it is long Don't upload data to Thingspeak That's a neat demo, thanks for sharing, I think Ill make one! Are you sure there is data coming from the detector? Can you see data on the serial monitor? Try hardcoding a number in your code instead of using a variable. If the hard coded number works, then the problem is the data in your variable. Also, I cant really see in the code where it handles the POST to ThingSpeak. Can you show that part of the code? (just the HTTP post part, and possible where the data is formed) ok found the code <https://github.com/pra22/GC-20/blob/master/src/main.cpp here> . In the section below, replace all the variables with string numbers, for example: String(averageCount) --> "22.34" and so on. Then watch your ThingSpeak channel and see if those numbers show up. that will help isolate the problem. if (deviceMode) // deviceMode is 1 when in monitoring station mode. Uploads CPM to thingspeak every 5 minutes { currentUploadTime = millis(); if ((currentUploadTime - previousUploadTime) > 300000) { previousUploadTime = currentUploadTime; if (client.connect(server, 80)) { String postStr = channelAPIkey; postStr += "&field2="; postStr += String(averageCount); postStr += "\r\n\r\n"; char temp[50] = "X-THINGSPEAKAPIKEY:"; strcat(temp, channelAPIkey); strcat(temp, "\n"); client.print("POST /update HTTP/1.1\n"); client.print("Host: api.thingspeak.com\n"); client.print("Connection: close\n"); client.print(temp); client.print("Content-Type: application/x-www-form-urlencoded\n"); client.print("Content-Length: "); client.print(postStr.length()); client.print("\n\n"); client.print(postStr); Serial.println(postStr); } client.stop(); } Did you export only field 1 above by the way? The code that I found writes to field 2. Make sure field 2 is enabled. Hi Christopher, thanks for your answer, I solved it with your answer of activating "field2", and now it works fine, but it restarts after I turn it off and I have to reprogram it to make it work again. Tell me what is the problem? Thanks a lot!!! geiger upload data
Yam Schuster in MATLAB Answers
上次活动时间: 2020-2-20

Hey, (sorry about my english) since yesterday I got , during CSV Upload, the Error message : "The file was not uploaded because it contains invalid location fields" My investigation, what is wrong with the csv-file, was not helpfull, I found nothing (for me) obvious wrong. The upload procedure I have done a lot of times in the past, w/o any issue!!! but now ????? (I double checked the file with Excel, notepad++, textpad... deleted rows in the file, added manualy some field values in an row,.... reduced a dummy file to only 10 rows.... ==> some times it worked, sometimes not.) What is the KEY Reason for this error massage? a certain coding? after checking since hours, trying different minor/major changes, I have no glue what is wrong. I need a simple hint in what direction or on what "Point (?)" I have to check?!?! .... The File I wants to upload is from TS downloaded -> deleted some (faulty) rows -> upload again. The Upload procedure I make 1000 of times in the past.... but since yesterday, I was not lucky. :-((( cheers & thanks in advance Joachim
Roger Farmer in MATLAB Answers
上次活动时间: 2019-10-22

I'm trying to change a single value in a Thingspeak graph, but no results... First I exported the data, changes the value and uploaded the file again, but the error says 'timestamp already exists'. True ofcourse, I trying to change that specific value. It this at all possible? If so, how? Thanks

关于 ThingSpeak

The community for students, researchers, and engineers looking to use MATLAB, Simulink, and ThingSpeak for Internet of Things applications. You can find the latest ThingSpeak news, tutorials to jump-start your next IoT project, and a forum to engage in a discussion on your latest cloud-based project. You can see answers to problems other users have solved and share how you solved a problem.