I started out on this project by reverse engineering the signal and protocol used by the Maverick ET732 thermometer. I've described that process in detail in another project, so I won't really go into it here.

The next step was to figure out how best to decode that data and send it to a website. I considered using an Arduino with one of the web shields, but I decided that because I was already familiar with PIC microcontrollers I would rather find a PIC board with internet connectivity. This was back in 2012, before great parts like the CC3200 and ESP8266 were around, so I decided to start with the Dangerous Prototypes Web Platform. I had a Radiometrix BiM-433-F lying around that I had used when decoding the Maverick's protocol, so I soldered that onto a Radio Shack perfboard, added a coil of wire for an antenna, and wired the /CD output to a free IO pin on the PIC. I tapped 3.3V and GND for the radio directly off the linear regulator on the Web Platform board. And, because I was feeling too lazy to drill 8 holes in a piece of plywood that day, I asked Alex Rich to print me out a base on which to mount the boards.

Figure 1 - BBQ Thermometer PCBs

Now that I had the hardware hooked up and working, the next step was to get the PIC to decode temperature data from the Maverick. I took the approach of using an Input Capture interrupt to first decode the incoming Manchester coded data into an array of ones and zeroes. Once an entire message was captured, it would be parsed into an array of nibbles (stored inefficiently in bytes). Because I hadn't yet figured out the checksum that the thermometer uses, I decided to implement error checking by simply comparing all four identical messages that are sent in each burst. If any of these four messages did not match, I would just throw out all the data. This has actually proven to be quite effective.

I then wrote a function to take the array of hex nibbles and return the Celsius temperature of a probe:

//Calculate probe temperature in celsius
signed int calc_probe_temp(char which_probe, char *rx_parsed)
   int i, offset, probe_temp;
   unsigned char rx_quart[5];
   if(which_probe == 1)
      offset = 8;
      offset = 13;
   //Parse data to quaternary
         case 0x05:
            rx_quart[i] = 0;
         case 0x06:
            rx_quart[i] = 1;
         case 0x09:
            rx_quart[i] = 2;
         case 0x0A:
            rx_quart[i] = 3;
   probe_temp = 0;
   probe_temp += rx_quart[0] * 256;
   probe_temp += rx_quart[1] * 64;
   probe_temp += rx_quart[2] * 16;
   probe_temp += rx_quart[3] * 4;
   probe_temp += rx_quart[4] * 1;
   probe_temp -= 532;

   return probe_temp;

Once this was working, I had to figure out how to send this data to the internet. I decided to try using Cosm (now Xively), which had some neat graphing functionality and appeared to do most of what I wanted. By modifying the GenericTCPClient files in the Web Platform firmware, I was able to get my data (consisting of two temperatures and a timestamp of when they were received) sent to a Cosm page. However, I quickly decided that Cosm wouldn't meet my needs. The graphing didn't offer all the functionality I wanted, and there wasn't much flexibility to customize how the data was displayed. I decided that I would need to just build my own site.

Which brings us to my site: http://www.bobblake.me/bbq/.

Figure 2 - Bob's BBQ Site

Data is sent to it from the Web Platform in more or less the same way it was sent to Cosm. My site displays the current temperature of both probes, and displays a graph of the entire session using the awesome Flot Javascript library. It also supports viewing historical sessions, and can export all the data for each session to a CSV file. Importantly, it displays well on a mobile device, so it's easy for me to check the temperature of my smoker when I'm away – which was the whole reason for this wacky project in the first place.

I don't barbeque very much these days since I've downsized to apartment living – but I still consider this project a work in progress. Some things...

Read more »