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();
}
}
}