ESP32 Data Logging to Google Sheets with Google Scripts

Google Sheets for IoT Sensor Data

Nowadays many household appliances are IoT-enabled from light bulbs to washing machines. Even though we may be able to control them over the local area network easily but to control them or store and retrieve their data over the internet, we must use an IoT cloud service. There are plenty of different IoT cloud services and protocols available but these services are limited in one way or another. Some are free, while others are paid. The free services will have a limit on how much data you can collect at a time or how many devices you can attach at a time while with the paid services, you have to pay a large sum depending on your data cluster. This will not only be a huge financial burden but if you develop a product that depends on a particular third-party service, that will be a huge risk.

That’s where the Google Sheets come to play as these are free, familiar, and most importantly reliable. It has a lot of functionalities and built-in integration with many other Google services and APIs. We can use this for many IoT applications from simple data logging to live monitoring and management of IoT devices.

Here are some of the benefits of using Google sheets for IoT applications:

  • Data Logging is pretty simple and robust and doesn’t need any third-party services.
  • Easy manipulation and analysis of collected data with functions.
  • Supports both desktop and mobile access.
  • Easy to use custom sheet functions and google apps integration through Google scripts.
  • Conditional formatting will make the data monitoring and analysis much easier.

Arduino Data Logging to Google Sheet

There are multiple methods to push data to the Goggle sheets. Some use third-party services like IFTTT to push the data to Google sheets. Since we want to eliminate any third party, we are going to use the direct approach, with the help of Google scripts. For this, all we need is a Google account. You can either use your existing account or create a new one. Either way login into the Google account and follow the given steps.

Setup the Google Sheet for Data Logging

The first step is to go to Google Sheets and create a new sheet. Name the sheet whatever you want and keep in mind that the first row of the sheet is very important. We will use this row to name each column and these names will be used as pointers to push the data. The column title should be one word and no upper case is allowed. If you want to use multiple words for the title, then add a hyphen in between each word instead of space.

For example, if you want to populate column A with dates and column B with the sensor value, then add the word date to column A's first row and sensor to column B's first row. Similarly, add titles to any other column where you want to populate the data.

Once the Sheet is created and renamed, make note of the sheet name (not the document name but the sheet name!) and the sheet ID. You can find the Sheet ID from the Sheet URL.

For example, in the following URL, the Sheet ID is the part that’s bold https://docs.google.com/spreadsheets/d/1BdQzuTeYr4Tf4zwT-LP1f45rfk63oWZTrQ_cIDfgWfgD/edit#gid=0. Do not share this ID with anyone else.

Setup Google Sheet

Creating Google script

Now that our Google sheet is set up, let’s create a Google app script. This script will enable us to push data from our ESP to the Google sheets. To create the Google script, go to Extensions -> Apps Script (previously this option was under Tools -> Script Editor). Then copy-paste the following code into it.

var sheet_id = "YOUR SHEET ID";
var sheet_name = "NAME OF YOUR SHEET";
function doGet(e){
var ss = SpreadsheetApp.openById(sheet_id);
var sheet = ss.getSheetByName(sheet_name);
var sensor = Number(e.parameter.sensor);
var date = Number(e.parameter.date);
sheet.appendRow([sensor,date]);
}

Replace YOUR SHEET ID and NAME OF YOUR SHEET with your sheet id and sheet name. Once done, save the script and click on the Deploy button and select new deployment. In the new deployment window, click on the Select type and select Web app as the type. Now google will present the option to set the description and permissions. Give anything in the description field and set the Who can access option to Anyone and click on deploy. Then click on Authorize access. Select your google account from the prompt and click on Allow when prompted. This will deploy the web app and will give you the Deployment ID and web app URL. Please copy these and save them somewhere safe. If you get This app isn’t verified error while authorizing, click on advanced and click on ‘Go to your ‘Script_name’(unsafe).

Creating Google Script

To test if it's working or not, simply copy and paste the web app URL to any browser and add ?sensor=35&date=1103 to the URL after exec.

So, the URL will look something like this https://script.google.com/macros/s/AKfycdsafrbg34f524245vv245If7bPy0T0hMmM42X19peNrpxU-lIi-5dghyhnh7gKb47g/exec?sensor=35&date=1103 and press enter. This will give you a web page that looks like this.

Google Script

Then open the Google Sheets, and you can see that the value you have passed has been added to the sheet.

Create Google Script

 

Arduino Code for Sending Data to Google Sheets

For sending data to Google Sheets, we will use the HTTPClient library. We will create a URL with the Google Script ID and the data. And when we establish an HTTP request with this URL, the Google Scripts will grab the data from the URL and POST it into the Google Sheets. Here is the Arduino code example, in which the ESP32 will send a count and UTC time continuously to the Google Sheets.

//Include required libraries
#include "WiFi.h"
#include <HTTPClient.h>
#include "time.h"
const char* ntpServer = "pool.ntp.org";
const long  gmtOffset_sec = 19800;
const int   daylightOffset_sec = 0;
// WiFi credentials
const char* ssid = "SKYNET 4G";         // change SSID
const char* password = "jobitjos";    // change password
// Google script ID and required credentials
String GOOGLE_SCRIPT_ID = "AKfycby-snBh-5j0jsiQBWfC-XB1FWy38lks4VHcxLBIGNadeCVcSzUoozHzvazIWv9EcA6a";    // change Gscript ID
int count = 0;
void setup() {
  delay(1000);
  Serial.begin(115200);
  delay(1000);
  // connect to WiFi
  Serial.println();
  Serial.print("Connecting to wifi: ");
  Serial.println(ssid);
  Serial.flush();
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  // Init and get the time
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
}
void loop() {
   if (WiFi.status() == WL_CONNECTED) {
    static bool flag = false;
    struct tm timeinfo;
    if (!getLocalTime(&timeinfo)) {
      Serial.println("Failed to obtain time");
      return;
    }
    char timeStringBuff[50]; //50 chars should be enough
    strftime(timeStringBuff, sizeof(timeStringBuff), "%A, %B %d %Y %H:%M:%S", &timeinfo);
    String asString(timeStringBuff);
    asString.replace(" ", "-");
    Serial.print("Time:");
    Serial.println(asString);
    String urlFinal = "https://script.google.com/macros/s/"+GOOGLE_SCRIPT_ID+"/exec?"+"date=" + asString + "&sensor=" + String(count);
    Serial.print("POST data to spreadsheet:");
    Serial.println(urlFinal);
    HTTPClient http;
    http.begin(urlFinal.c_str());
    http.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS);
    int httpCode = http.GET(); 
    Serial.print("HTTP Status Code: ");
    Serial.println(httpCode);
    //---------------------------------------------------------------------
    //getting response from google sheet
    String payload;
    if (httpCode > 0) {
        payload = http.getString();
        Serial.println("Payload: "+payload);    
    }
    //---------------------------------------------------------------------
    http.end();
  }
  count++;
  delay(1000);
} 

 

Code Explanation

In the first lines, we have included the required libraries and declared the global variables.

//Include required libraries
#include "WiFi.h"
#include <HTTPClient.h>
#include "time.h"

Here we will use the WiFi library for WiFi connection and the HTTPClient library for HTTP requests. And the Time.h library is used to grab the current time from any NTP time servers. In the following part, we have declared our preferred NTP server and the GMT time offset in seconds.

const char* ntpServer = "pool.ntp.org";
const long  gmtOffset_sec = 19800;
const int   daylightOffset_sec = 0;

In the WiFi credentials area, populate it with your own WiFi SSID and password. And in the GOOGLE_SCRIPT_ID add your Google Script ID, which we have already copied while deploying the Script.

// WiFi credentials
const char* ssid = "Your WiFi SSID";         // change SSID
const char* password = "Your WiFi password";    // change password
// Google script ID and required credentials
String GOOGLE_SCRIPT_ID = "AKfycby-snBh-5j0jsiQBWfC-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx-Wv9EcA6a";    // change Gscript ID with yours
int count = 0;

The setup() function will initialize the serial communication and will establish the WiFi connection with the credentials we have already added. It will also initialize an instance named configTime for grabbing the time from the NTP server.

void setup() {
  delay(1000);
  Serial.begin(115200);
  delay(1000);
  // connect to WiFi
  Serial.println();
  Serial.print("Connecting to wifi: ");
  Serial.println(ssid);
  Serial.flush();
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }  // Init and get the time
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
}

Now let’s look at the loop function. In the loop function, if the WiFi connection is active the ESP32 will grab the time from the NTP server. Then it will assemble this grabbed time info and the value of the variable count into a URL along with the Google Script ID. After that, the ESP32 will establish an HTTP connection to this URL with the help of the HTPPClient library. Once the connection is established, the ESP32 will print out the HTTP status code. Meanwhile, Google Scripts will grab the data from this HTTP request and it will POST the data to the Google Sheets. Then a one-second delay is added and the count is increased. The process will repeat and the time and the variable value will be posted to the Google Sheets continuously. By this method, we can log any amount of data to the google sheets. Here is the real-time view of the Google Sheets and the serial monitor.

 ESP32 Data Logging to Google Sheet

 

Getting Data from Google Sheets

Now let’s look at how we can read from the Google Sheets. For that too we are going to use Google Scripts. Let’s see how to read a value from a cell on the Google Sheets. For that, we need to create and deploy Google Scripts. Follow the above example, and create and deploy a new script with the following scrips.

var sheet_id = "1AsnVD1ZQL5LG6Yxxxxxxxxxxxxxxxt99SVRdThfQf4g";
var ss = SpreadsheetApp.openById(sheet_id);
var sheet = ss.getSheetByName('ESP_DATA');
function doPost(e) {
  var val = e.parameter.value;
  if (e.parameter.value !== undefined){
    var range = sheet.getRange('A2');
    range.setValue(val);
  }
}
function doGet(e){
  var read = e.parameter.read;
  if (read !== undefined){
    return ContentService.createTextOutput(sheet.getRange('B2').getValue());
  }
}

Replace the Sheet ID and sheet name with your own. Once it’s deployed note down the Script ID. This script will return the value in cell B2 when it’s called.

 

Arduino Code for Reading Data from Google Sheets

//Include required libraries
#include "WiFi.h"
#include <HTTPClient.h>
// WiFi credentials
const char* ssid = "Your WiFi SSID";         // change SSID
const char* password = "Your WiFi password";    // change password
// Google script ID and required credentials
String GOOGLE_SCRIPT_ID = "AKfycby-snBh-5j0jsiQBWfC-XB1FWxxxxxxxxxxxxxxxxxxxxxxxxxzIWv9EcA6a";    // change Gscript ID
void setup() {
  delay(1000);
  Serial.begin(115200);
  delay(1000);
  // connect to WiFi
  Serial.println();
  Serial.print("Connecting to wifi: ");
  Serial.println(ssid);
  Serial.flush();
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
}
void loop() {
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    String url = "https://script.google.com/macros/s/" + GOOGLE_SCRIPT_ID + "/exec?read";
    Serial.println("Making a request");
    http.begin(url.c_str()); //Specify the URL and certificate
    http.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS);
    int httpCode = http.GET();
    String payload;
    if (httpCode > 0) { //Check for the returning code
      payload = http.getString();
      Serial.println(httpCode);
      Serial.println(payload);
    }
    else {
      Serial.println("Error on HTTP request");
    }
    http.end();
  }
  delay(1000);
}

 

Code Explanation

WiFi setup and everything is similar to the first example. So, let’s discuss the Loop function in which how the ESP32 requests the data from the Google Sheets.

if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    String url = "https://script.google.com/macros/s/" + GOOGLE_SCRIPT_ID + "/exec?read";
    Serial.println("Making a request");
    http.begin(url.c_str()); //Specify the URL and certificate
    http.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS);
    int httpCode = http.GET();
    String payload;
    if (httpCode > 0) { //Check for the returning code
      payload = http.getString();
      Serial.println(httpCode);
      Serial.println(payload);
    }
    else {
      Serial.println("Error on HTTP request");
    }
    http.end();
  }
  delay(1000);

In the loop function if the WiFi is connected the ESP32 will create an HTTP instance with the HTTPClient Library. Then a request is made to the Google Sheets with the script URL which has our Google Script ID. Once the request is made the ESP will use the HTTP Get method to get the data from the Google sheets. This Data is then printed into the serial monitor. Here in the demonstration video, you can see that as soon as I change the content of cell C2, the data ESP32 receives also changes.

ESP32 Google Sheet Data Logging

I hope this article was helpful. If you have any doubt, please feel free to ask in the comment section below.

Code

//Include required libraries

#include "WiFi.h"

#include <HTTPClient.h>

#include "time.h"

const char* ntpServer = "pool.ntp.org";

const long  gmtOffset_sec = 19800;

const int   daylightOffset_sec = 0;

// WiFi credentials

const char* ssid = "SKYNET 4G";         // change SSID

const char* password = "jobitjos";    // change password

// Google script ID and required credentials

String GOOGLE_SCRIPT_ID = "AKfycby-snBh-5j0jsiQBWfC-XB1FWy38lks4VHcxLBIGNadeCVcSzUoozHzvazIWv9EcA6a";    // change Gscript ID

int count = 0;

void setup() {

  delay(1000);

  Serial.begin(115200);

  delay(1000);

  // connect to WiFi

  Serial.println();

  Serial.print("Connecting to wifi: ");

  Serial.println(ssid);

  Serial.flush();

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {

    delay(500);

    Serial.print(".");

  }

  // Init and get the time

  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

}

 

 

 

void loop() {

   if (WiFi.status() == WL_CONNECTED) {

    static bool flag = false;

    struct tm timeinfo;

    if (!getLocalTime(&timeinfo)) {

      Serial.println("Failed to obtain time");

      return;

    }

    char timeStringBuff[50]; //50 chars should be enough

    strftime(timeStringBuff, sizeof(timeStringBuff), "%A, %B %d %Y %H:%M:%S", &timeinfo);

 

    String asString(timeStringBuff);

    asString.replace(" ", "-");

    Serial.print("Time:");

    Serial.println(asString);

    String urlFinal = "https://script.google.com/macros/s/"+GOOGLE_SCRIPT_ID+"/exec?"+"date=" + asString + "&sensor=" + String(count);

   

    Serial.print("POST data to spreadsheet:");

    Serial.println(urlFinal);

    HTTPClient http;

    http.begin(urlFinal.c_str());

    http.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS);

    int httpCode = http.GET(); 

    Serial.print("HTTP Status Code: ");

    Serial.println(httpCode);

    //---------------------------------------------------------------------

    //getting response from google sheet

    String payload;

    if (httpCode > 0) {

        payload = http.getString();

        Serial.println("Payload: "+payload);    

    }

    //---------------------------------------------------------------------

    http.end();

  }

  count++;

  delay(1000);

}

....................................................................................................

//Include required libraries

#include "WiFi.h"

#include <HTTPClient.h>

 

// WiFi credentials

const char* ssid = "SKYNET 4G";         // change SSID

const char* password = "jobitjos";    // change password

// Google script ID and required credentials

String GOOGLE_SCRIPT_ID = "AKfycby-snBh-5j0jsiQBWfC-XB1FWy38lks4VHcxLBIGNadeCVcSzUoozHzvazIWv9EcA6a";    // change Gscript ID

 

void setup() {

  delay(1000);

  Serial.begin(115200);

  delay(1000);

  // connect to WiFi

  Serial.println();

  Serial.print("Connecting to wifi: ");

  Serial.println(ssid);

  Serial.flush();

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {

    delay(500);

    Serial.print(".");

  }

 

}

 

 

 

void loop() {

  if (WiFi.status() == WL_CONNECTED) {

    HTTPClient http;

    String url = "https://script.google.com/macros/s/" + GOOGLE_SCRIPT_ID + "/exec?read";

    Serial.println("Making a request");

    http.begin(url.c_str()); //Specify the URL and certificate

    http.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS);

    int httpCode = http.GET();

    String payload;

    if (httpCode > 0) { //Check for the returning code

      payload = http.getString();

 

      Serial.println(httpCode);

      Serial.println(payload);

    }

    else {

      Serial.println("Error on HTTP request");

    }

    http.end();

  }

  delay(1000);

}

320 Comments

A lot of thanks for all of your efforts on this site. Betty takes pleasure in carrying out investigation and it's really simple to grasp why. A lot of people notice all about the compelling mode you convey priceless thoughts through your web site and inspire contribution from people on the content and my child is without a doubt understanding a whole lot. Have fun with the remaining portion of the year. You have been conducting a brilliant job.

An impressive share, I just given this onto a colleague who was doing just a little evaluation on this. And he actually purchased me breakfast because I discovered it for him.. smile. So let me reword that: Thnx for the deal with! However yeah Thnkx for spending the time to discuss this, I really feel strongly about it and love reading extra on this topic. If possible, as you turn into expertise, would you thoughts updating your weblog with more details? It's highly useful for me. Large thumb up for this weblog submit!

I must show my respect for your generosity supporting people that need assistance with your area. Your very own dedication to getting the message all-around appears to be certainly advantageous and has without exception permitted people just like me to reach their goals. Your own invaluable report can mean a lot a person like me and especially to my fellow workers. Thanks a ton; from each one of us.

I would like to show some thanks to the writer for rescuing me from this type of trouble. Just after surfing through the internet and seeing strategies which were not beneficial, I assumed my entire life was well over. Being alive without the strategies to the problems you've fixed all through this article is a serious case, as well as the kind that could have in a wrong way damaged my career if I had not come across your blog. Your actual training and kindness in handling all the pieces was very helpful. I am not sure what I would have done if I had not encountered such a thing like this. I can at this point look forward to my future. Thanks a lot very much for your professional and amazing help. I will not hesitate to suggest the blog to any person who would need tips about this problem.

Good post. I study one thing more challenging on different blogs everyday. It would always be stimulating to read content material from different writers and apply just a little something from their store. I抎 choose to make use of some with the content material on my weblog whether or not you don抰 mind. Natually I抣l give you a hyperlink in your net blog. Thanks for sharing.

My husband and i were absolutely glad that Peter managed to carry out his reports out of the precious recommendations he gained through your site. It's not at all simplistic just to choose to be giving away thoughts which often the others may have been selling. And we fully understand we need the website owner to thank for that. The main explanations you made, the simple site navigation, the friendships your site give support to instill - it's most terrific, and it's really aiding our son and the family imagine that that topic is awesome, which is certainly exceptionally vital. Thank you for the whole thing!

I would like to express my gratitude for your generosity for men and women that actually need help on in this area of interest. Your real dedication to getting the solution all over turned out to be astonishingly significant and has without exception encouraged regular people just like me to attain their targets. The insightful publication entails a lot a person like me and a whole lot more to my office colleagues. Warm regards; from everyone of us.

A lot of thanks for your own efforts on this website. My mother delights in conducting research and it is easy to understand why. Most people know all relating to the dynamic tactic you provide effective techniques through the website and therefore attract participation from people on the article while our own simple princess is undoubtedly discovering a lot of things. Have fun with the rest of the year. You're the one conducting a superb job.

A powerful share, I just given this onto a colleague who was doing slightly analysis on this. And he the truth is purchased me breakfast because I found it for him.. smile. So let me reword that: Thnx for the treat! However yeah Thnkx for spending the time to debate this, I feel strongly about it and love reading extra on this topic. If attainable, as you turn into experience, would you mind updating your weblog with more details? It is highly helpful for me. Large thumb up for this weblog submit!

I wanted to send you the bit of note to finally thank you so much over again for all the wonderful advice you've contributed here. This has been particularly generous with people like you to allow extensively all that a number of us could possibly have sold as an e-book in making some profit for themselves, primarily considering the fact that you might have tried it if you ever considered necessary. The concepts likewise acted to be the good way to understand that other people online have the same desire really like my personal own to grasp a good deal more in respect of this problem. I'm sure there are thousands of more pleasurable instances ahead for individuals who discover your blog post.

Youre so cool! I dont suppose Ive learn something like this before. So good to search out somebody with some original thoughts on this subject. realy thank you for starting this up. this website is something that's wanted on the net, somebody with a little bit originality. helpful job for bringing something new to the internet!

I enjoy you because of your entire labor on this site. Betty loves doing research and it's easy to see why. Many of us notice all relating to the dynamic tactic you make great information by means of your website and as well strongly encourage participation from other individuals on this concern and our princess is always becoming educated a great deal. Have fun with the remaining portion of the year. You're the one doing a splendid job.

I would like to show thanks to you for rescuing me from this type of instance. Just after exploring through the internet and getting solutions which are not powerful, I believed my entire life was done. Living devoid of the strategies to the issues you have sorted out by way of the short post is a critical case, as well as the ones that would have in a negative way damaged my career if I had not noticed your website. Your own training and kindness in touching all the stuff was valuable. I don't know what I would've done if I had not encountered such a thing like this. I'm able to at this moment relish my future. Thanks very much for the reliable and sensible guide. I will not be reluctant to suggest your site to anybody who should get guide about this subject matter.

Could you please share me code related
K-type thermocouple data (temperature data )
Use esp 32 wroom need google script code and arduino code

Thank you for your whole work on this blog. Debby really likes working on research and it's easy to see why. We all learn all concerning the lively mode you produce very important suggestions via your web blog and as well as strongly encourage response from the others on the area plus my simple princess is now studying a great deal. Take pleasure in the remaining portion of the year. You're performing a useful job.

I have to express my appreciation for your generosity supporting women who really need help with this concept. Your special commitment to getting the solution across came to be surprisingly effective and has always encouraged people like me to realize their aims. The warm and friendly guidelines means a whole lot a person like me and even more to my mates. Warm regards; from each one of us.

I抦 impressed, I need to say. Actually not often do I encounter a blog that抯 each educative and entertaining, and let me tell you, you've gotten hit the nail on the head. Your idea is excellent; the problem is one thing that not sufficient persons are talking intelligently about. I am very completely satisfied that I stumbled throughout this in my search for something referring to this.

I must point out my admiration for your kindness giving support to folks that should have help on your issue. Your real dedication to getting the solution all-around turned out to be particularly significant and has in every case empowered girls like me to realize their targets. Your amazing warm and friendly hints and tips implies much to me and further more to my office colleagues. Thank you; from all of us.

I intended to post you that very little remark to say thanks again considering the breathtaking guidelines you have discussed at this time. This has been quite wonderfully open-handed with you to convey freely what exactly many individuals would have offered for an e-book to make some bucks on their own, specifically now that you might have tried it in the event you wanted. The thoughts also acted to be a great way to be sure that other people online have a similar interest like my personal own to know lots more with reference to this condition. I am certain there are numerous more pleasurable occasions ahead for folks who scan through your blog.

I'm writing to make you be aware of of the superb encounter my princess had studying your blog. She realized so many details, with the inclusion of what it's like to have a wonderful teaching mood to let other people easily gain knowledge of certain very confusing topics. You truly did more than my expectations. I appreciate you for presenting these important, dependable, revealing and in addition cool thoughts on your topic to Evelyn.

I as well as my guys have been going through the best things found on your website and then at once I had an awful feeling I never expressed respect to the site owner for those strategies. Most of the boys became for this reason happy to read through all of them and have in effect quite simply been having fun with these things. We appreciate you actually being really helpful and then for obtaining this form of incredible subjects millions of individuals are really eager to learn about. Our own honest regret for not expressing appreciation to you sooner.

I抦 impressed, I have to say. Actually rarely do I encounter a weblog that抯 both educative and entertaining, and let me let you know, you may have hit the nail on the head. Your concept is excellent; the issue is something that not sufficient individuals are talking intelligently about. I am very glad that I stumbled across this in my seek for something relating to this.

Thank you so much for providing individuals with such a superb chance to check tips from here. It's usually so cool plus stuffed with a lot of fun for me personally and my office peers to visit your site at minimum 3 times in 7 days to read the latest guides you have. And of course, I'm also usually happy concerning the superb solutions you give. Selected 3 areas on this page are completely the very best I have had.

I needed to compose you a tiny word to finally say thank you the moment again for your stunning ideas you've discussed in this case. It was quite strangely generous of people like you to give without restraint what exactly many of us could have offered for sale for an e book in making some dough for their own end, precisely since you could possibly have done it if you considered necessary. The strategies also served to become a easy way to understand that other people online have the same dream really like my own to see a good deal more on the topic of this condition. I am sure there are many more fun occasions ahead for individuals that scan through your blog.

I really wanted to compose a brief remark to say thanks to you for all the lovely tips and tricks you are giving at this website. My time intensive internet look up has finally been compensated with incredibly good details to write about with my family and friends. I 'd assume that many of us readers are really lucky to be in a useful network with very many wonderful professionals with great opinions. I feel somewhat grateful to have discovered your entire webpages and look forward to some more fun times reading here. Thanks once again for everything.

My spouse and i felt so relieved that Albert could carry out his inquiry through the ideas he obtained while using the weblog. It is now and again perplexing to just choose to be giving away steps that many men and women might have been trying to sell. And we already know we've got you to be grateful to for this. All the illustrations you made, the straightforward site navigation, the relationships you help to instill - it's many spectacular, and it's assisting our son and our family know that that idea is awesome, and that is truly mandatory. Thanks for all the pieces!

I抦 impressed, I must say. Actually hardly ever do I encounter a weblog that抯 both educative and entertaining, and let me let you know, you might have hit the nail on the head. Your idea is outstanding; the problem is something that not sufficient people are speaking intelligently about. I am very pleased that I stumbled throughout this in my search for one thing regarding this.

this was an interesting idea.
what if using an ethernet shield on arduino, which library can be use to send or get data from spreadsheet?
i hope that u can help.
Thanks

Add new comment

The content of this field is kept private and will not be shown publicly.

Plain text

  • No HTML tags allowed.
  • Lines and paragraphs break automatically.
  • Web page addresses and email addresses turn into links automatically.