User Tools

Site Tools


google_calendar_and_mbed_controller

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
google_calendar_and_mbed_controller [2012/06/17 10:54] – created tomgeegoogle_calendar_and_mbed_controller [2012/06/17 11:05] (current) tomgee
Line 1: Line 1:
 {{:2012-06-17_105123.jpg|}} {{:2012-06-17_105123.jpg|}}
 +
 +
 +===== mBed - Google API source code =====
 +A few people have asked me to post the source code. Here it is. Even though I have been programming for years in various database and IBM mainframe languages, I've never done much C, so feel free to send me a few tips. I'm not sure why, for example, it works only when ctTime and buffer[21] are declared outside of the subroutine they're used in??
 +
 +
 +All the libraries used can all be found on the mbed website.
 +
 +
 +   #include "mbed.h"
 +   #include "DS18B20.h"
 +   #include "DS18S20.h"
 +   #include "OneWireDefs.h"
 +   #include "EthernetNetIf.h"
 +   #include "HTTPClient.h"
 +   #include "NTPClient.h"
 +
 +   #define THERMOMETER DS18S20
 +   #define HOSTNAME "mbed"
 +   string calendar = "<<< YOUR CALENDAR PRIVATE ADDRESS >>>";
 +
 +   EthernetNetIf eth(HOSTNAME);
 +   HTTPClient http;
 +   NTPClient ntp;
 +   THERMOMETER device(true, false, false, p21);
 +
 +   DigitalOut led1(LED1, "led1");
 +   DigitalOut led2(LED2, "led2");
 +   DigitalOut led3(LED3, "led3");
 +   DigitalOut led4(LED4, "led4");
 +
 +   DigitalOut heater(p10);
 +   time_t ctTime;
 +   char buffer[21];
 +   int targetTemp = 0;
 +
 +   string getURL() {
 +    char url[256];
 +    char endTime[21];
 +    char startTime[21];
 +    ctTime = time(NULL);
 +    strftime(buffer, 20, "%Y-%m-%dT%H:%M:00Z", localtime(&ctTime));
 +    strcpy(startTime,buffer);
 +    ctTime = time(NULL)+60;
 +    strftime(buffer, 20, "%Y-%m-%dT%H:%M:00Z", localtime(&ctTime));
 +    strcpy(endTime,buffer);       
 +    //printf("start %s\n",startTime);
 +    //printf("end   %s\n",endTime);
 +    sprintf(url, "%s?start-min=%s&start-max=%s", calendar, startTime, endTime);
 +    //printf("url   %s\n",url);
 +    return url;
 +    }
 +
 +    string getPage(char url[256]) {
 +    printf("\nQuery Google API... \n");
 +    HTTPText txt("text/html",5000);
 +    HTTPResult r = http.get(url, &txt);
 +   
 +    if (r==HTTP_OK) {
 +       printf("Result Ok\n");
 +       led2 = 0;
 +       return txt.gets();
 +    } else {
 +       printf("Error %d\n",r);
 +       led2 = 1;
 +       return "FAIL";
 +    }
 +    }
 +
 +    void getAPI() {
 +    string testres;
 +    string results;
 +    char to[3];
 +    char url[256];
 +    strcpy(url,(char*)getURL().c_str());
 +    results = getPage(url);
 +    //printf("results API %s\n",results);
 +    
 +    if (results == "FAIL") {
 +       printf("%s\n","Bad Result");
 +       // Make no changes to the target temperature
 +    } else {
 +       testres = strstr(results.c_str(),"<title type='html'>");
 +       //printf("\n\n\n%s\n",testres);
 +       if (testres == "") {
 +          // no temperature set for this time
 +          printf("%s\n","No calendar entry for this time");
 +          targetTemp = 0;
 +          led3 = 0;
 +       } else {
 +          // grab the temperature (this assumes I've entered a 2 digit int in the event title)
 +          strncpy(to, testres.c_str()+19, 2);
 +          printf("result: %s\n", to);
 +          targetTemp = atoi(to);
 +          led3 = 1;
 +       }
 +    }
 +   }
 +
 +   void getNTP() {
 +    ctTime = time(NULL);
 +    printf("Current time is (UTC): %d %s\n", ctTime, ctime(&ctTime));
 +    printf("NTP setTime...\n");
 +    Host server(IpAddr(), 123, "pool.ntp.org");
 +    printf("Result : %d\n", ntp.setTime(server));
 +    ctTime = time(NULL);
 +    printf("Time is now (UTC): %d %s\n", ctTime, ctime(&ctTime));
 +   }
 +
 +   void checkTemperature() {
 +    float temp = device.readTemperature();
 +    if (temp > (targetTemp+0.5)) {
 +       heater = 0;
 +       led4 = 0;
 +    } 
 +    if (temp < targetTemp) {
 +       heater = 1;
 +       led4 = 1;
 +    }
 +   }
 +
 +   int main() {
 +    EthernetErr ethErr;
 +    int count = 0;
 +    do {
 +        printf("Setting up %d...\n", ++count);
 +        ethErr = eth.setup();
 +        if (ethErr) printf("Timeout\n", ethErr);
 +    } while (ethErr != ETH_OK);
 +
 +    printf("Connected OK\n");
 +    const char* hwAddr = eth.getHwAddr();
 +    printf("HW address : %02x:%02x:%02x:%02x:%02x:%02x\n",
 +           hwAddr[0], hwAddr[1], hwAddr[2],
 +           hwAddr[3], hwAddr[4], hwAddr[5]);
 +
 +    IpAddr ethIp = eth.getIp();
 +    printf("IP address : %d.%d.%d.%d\n", ethIp[0], ethIp[1], ethIp[2], ethIp[3]);
 +    printf("Check router DHCP table for name : %s\n", eth.getHostname());
 +
 +    getNTP();
 +    getAPI();
 +    
 +    Timer pollTemp;
 +    pollTemp.start();
 +    Timer pollAPI;
 +    pollAPI.start();
 +    Timer pollNTP;
 +    pollNTP.start();
 +    Timer lookAlive;
 +    lookAlive.start();
 +    
 +    while (true) {
 +        if (lookAlive.read() > 1) {
 +           led1 = !led1;
 +           lookAlive.start();
 +        }
 +        if (pollTemp.read() > 10) {
 +            checkTemperature();
 +            pollTemp.start();
 +        }
 +        if (pollAPI.read() > 30) {
 +            getAPI();
 +            printf("Target Temp: %i\n",targetTemp);
 +            pollAPI.start();
 +        }
 +        if (pollNTP.read() > 21000) {
 +            pollNTP.start();
 +            getNTP();
 +        }
 +    }
 +   }
google_calendar_and_mbed_controller.1339944850.txt.gz · Last modified: 2012/06/17 10:54 by tomgee