Graphing Temperatures from the MAX6675 on PIC32

Turns out graphing temp data is pretty simple.

Using the standard Graphics Library from Microchip just to display the output right now. Ultimately it’s working pretty much as necessary to show temperature graphically. I need to be able to adjust the top/bottom a little better using some formulas to come up with a scaling percentage dynamically to make it fit the minimum and maximum possible temperatures into the display without squishing it too much. Additionally I need to decide how quickly to scroll from left to right and possibly a way to redraw scrolling backwards to see starting graphs and archive the raw data to be reanalyzed later possibly zooming etc.

The input to the system is using a development board by Ryan J McLaughlin (dot com). The board was designed to be connected up to Arduino microprocessors but I figured out it could be plugged up directly to a PIC32 too. I decided I needed an easy to interface board with a thermocouple socket already on the board and this one fit the bill nicely.

image

Right now it blinks the status LED every time it makes a reading which is somewhere around 2-3 times per second.

MAX6675 with PIC32MX795F512L

As I mentioned earlier I’m using the USB Starter Kit II, the PIC32 Expansion Board, the SSD1926 PicTail Plus board, and a Truly 3.2″ 320×240 LCD display board to develop the roaster system. This has resulted in some “fun” trying to figure out which pins are really going where on the board and the PicTail cards that you can build your own circuits on. Occasionally some of the pins are not exactly labeled the right way or else there are a few pins that are wired together on the circuit boards making you unable to use one of the pins that are wired together or in some cases both cannot be used etc.

I’ve been working through various demos and trying to understand some of the libraries and still trying to identify all of the pins on the expansion board that are already attached to the LCD / graphics chip. So far I have not found any that involved the SPI1 Pins, which I’m sure is incorrect now.

I’ve now managed to get real time readings to occur while using SPI2 instead of SPI1. Originally I was using pins B2 (SS1), C4 (SDI1) , and D10 (SCK1). to communicate with the MAX6675 thermocouple. When the system launched it would begin to read temperatures from those pins properly but only while in animate debug mode. As soon as I would let it run in full speed to get to a break point later it would be partially or completely erroneous in the received readings. I’ve now switched it to the SPI2 pins and using G9 (SCK1), and G7 (SDI1). (The MAX6675 does not use the SDO pins since it only transmits readings and does not receive using SPI data)

I’m now opening the SPI port to communicate with the MAX6675 using 16bit word mode:
OpenSPI2(SPI_MODE16_ON | SPI_SMP_ON | SPI_CKE_ON | MASTER_ENABLE_ON | CLK_POL_ACTIVE_HIGH | SEC_PRESCAL_8_1 | PRI_PRESCAL_16_1, SPI_ENABLE);

[After I clean up all the “Dead code” that I’ve been testing various things with I’ll insert some additional SPI stuff HERE]

Which appears to work properly talking to the MAX6675. Further I’ve gotten the text to display on the screen of the current temperature where it runs a rolling average of the last 3 readings updating the screen after each additional reading. At the moment it flips on one of the starter kit’s LEDs based on the temperature when it needs to heat and turns it off when it’s reached a preset temperature.

I need to work more on getting the LCD display to show the activity that is going on in terms of heating/cooling and run a timer to begin estimating what stage the roast would be in based on temperatures and time-wise. Additionally I’ll need to figure out how to graph the temperature across the bottom of the screen too. I’m thinking screen real estate is somewhat limited so I may want to upgrade the LCD to the wider board to move some of the data to the side leaving a larger graph area to represent the roast curves.

I’m not dead… And finally having SPI progress.

So with all the holidays and other things going on I didnt get to spend much time working on the roaster. In addition due to the complications with the SPI not working all this time I wasn’t feeling very motivated.

Last night after spending hours over many days reading blogs of people who regularly participate on Microchip’s forums I finally managed to get the MAX6675 to start transmitting actual temperature data to the PIC32. I’m not entirely sure why it works now but need to emphasize that it only works OUTSIDE my prototype roaster programming. In other words it is literally a single purpose program that reads a single temperature value from the MAX6675 chip.

It seemed almost reliable by reporting similar temperatures most of the time for each reading for air temperatures and then goes up when I press the thermocouple against my hand and then drops significantly when I press it against a cold soda can. There was a rare spike to 120 plus degrees here and there but infrequently. Otherwise the temperatures appear to be pretty close.

When I return to my roaster program there appears to be something significantly wrong with the speed it communicates with a potential “shift” to the left. If I drop off several of the rightmost (0) bits the resulting numbers are what they are supposed to be with a random wrong bit mixed in. About 60% of the time the results are completely erroneous no matter what. I’m pretty sure now that there is a setting somewhere affecting the communication speed that I’ve lost track of that is disrupting things.

I’ve found that adding some longer delays around the CS changes seems to make the temperatures returned significantly more stable eliminating the 100 plus degree spikes and need to try them out in the roaster code too.

Progress on I2C

So I previously had tried to get things working using a PIC24 and had both the thermocouple and a battery backed real time clock interfaced and communicating as well as some other items over SPI and I2C. Over time I decided I needed to focus on the PIC32 due to the memory, speed, and ease of interfacing with an LCD. I thus ordered the development kits for the PIC32 and a series of other parts and started this blog about them since I had to start over.

I have so far had tremendous problems with the I2C on the PIC32 hardware. In addition I seemed to show slightly more success with the other sensors over the RTC chip in particular. The RTC was provided by SparkFun as a breakout board. It does not have the pull up resistors on the break out board so it can be chained on to something that already has them… or else you need to insert your own resistors and power between the holes on the breakout board and the microprocessor pins.

After digging through an old box full of parts scavenged off of computers and an old 32 Port Audio Mixer that was destroyed while I was moving due to falling off the lift gate as I was finishing moving out of an old house I lived in. I’ve managed to create an I2C bus using a ribbon cable with some connectors pressed into it close together. I was then able to use a female header socket with some long pins and plug the DS1307 breakout into it for SDA and SCL. On the second connector I inject power into the other side of a header (the resistors are too thin to make contact in the normal connector for some reason). I then connect the third connector to the PIC32 pins using Female to Male jumper wire. Due to the length of the pins on the female header connectors I am able to clip the probes for a Logic Analyzer to the system.

After trying and trying and changing resistor values etc I was getting nowhere. I measure 5 volts on the I2C pins and with other sensors I could get confirmation of the bus going from on to off occasionally. With the RTC chip I was stuck at on. I had no idea what was happening and finally after several days of banging my head I yanked the backup battery out of the RTC.

Sparkfun claims that they have pre-programmed the time on the RTC and they are thus ready to be used/read etc without requiring time to be placed on the chip to start the oscillator. They also comment somewhere in the pages about how it should last about 9 years on the lithium battery provided blah blah. Apparently this is not entirely accurate. I have stumbled across several people commenting on the system NOT being programmed on their boards. In my case it turns out that the RTC chip simply is “hung” possibly caused by a malfunction of the battery. Upon removing the battery I noticed that it had “exploded” in one of the corners like they typically do when they get old. There was some rusted/acid crusted bits and leakage on the surface of the battery AND on the circuit board. I plugged it in again and ran some testing to it and it appeared to be accepting programming from the PIC32. After going to Radio Shack looking for a new battery I cleaned up the board and installed the new battery. The programming seems to stick now and all is well having provided a new battery. The old battery is currently reporting .8V instead of the normal 3.3v and is generally rusted and fouled up.

Unfortunately this story does not have freedom from flaws. It turns out that while running the routines normally I get results of either 0x0000 or 0x00FF. When I force it to debug mode, however, things appear normal displaying hours/minutes/seconds/date/month/year/etc in the appropriate slots and upon returning form debug mode back to normal show in the spaces I forced it to display the text. Further when I try to program it into a demo program Microchip wrote it seems as if the year is actually the “date”, the date is the “day of the week”, the month is the correct month, the hours and minutes dont make any sense. I’m not sure what is going on there. Taking a wild guess I’m thinking the date/year thing being weird is coincidental and that in reality there is perhaps some sort of Hex vs BCD problem going on.

Since I have achieved some level of success at this point though I am going to do a commit to the SVN repository on my server at home to make sure I don’t lose this code. I can see, with the Logic Analyzer, that the SCL and SDA pins switch from 0 to 5v and 5v to 0v from time to time so I know the pull up is functioning. What is troublesome is that the SCL pin never appears to have a functioning clock signal. Immediately after applying a Start command it appears to register a bus collision. I cannot figure out why this is happening and it further baffles me that I could program AND read I2C data without a functional I2C bus.

I was reading on the Microchip forums about how they, apparently, recently changed the I2C Library on the PIC32 making it function different than the PIC24. This is causing significant problems for PIC32 users. It seems to have something to do with the Idle state not being checked on the PIC32 causing collisions or something like that. How exactly this applies to what I’m doing I’m not sure because while the symptoms are the same it does not seem to follow the same circumstances.

In addition this weekend I obtained some LCD screen protectors (typically used for GPS) and removed the original covering provided by Microchip and installed the new protector. It is a lot smoother and easier to read the screen. I should be able to record the video on the screen without it being distorted once I get the I2C (and some SPI) sorted out and working.

Let me tell you about the time….

So I’ve ordered a plethora of stuff lately. Yesterday the 5×7 magnifier came. I’m figuring out I have no place to work on this stuff properly so it’s sort of wedged on my desk, and then today a box from Mouser showed up. In it I’ve determined I purchased the wrong AC adapter…. so now I need to order another one but this is for a slightly later stage so it can wait a little. Plus I believe I have a power supply I used on a fan to keep the air moving in my indoor orchid tray and lights area that is not being used currently due to a different setup that I’ve already stripped the ends off that I could then use with the relay board I received from Bulgaria. I’ll probably find something else to use that power supply for later anyway.

Anyway, TODAY the Mouser box arrived. In it were a variety of 0603 sized capacitors. For those that don’t know what that means… they are .06 inches by .03 inches or approximately 1.5mm by .77mm give or take a few hundredths of a milimeter.

Today I learned that fluxes are awesome when soldering SMT devices. I managed to mount my 32.768 6pF crystal and some of the 11pF 0603 capacitors from the selection but it was an adventure. I’ve lost approximately 4-5 of them into the rug somewhere now. Two are now securely attached to the board. I got the first one out ok but lost the second one immediately. I got a third one out but it didnt make it to the table and went straight for the rug. I recovered one of them from the rug and then tried to get it soldered onto the board. Two of them blew away using the hot air system. Once I got a corner tacked down properly it went much smoother. After allowing things to cool off I mounted the USB II Microchip board back into the IO board and connected to my LCD and fired it up. Immediately the clock on the display started ticking off seconds.

I had quite a bit of difficulty getting the soldering stuff going. I looked up temperatures for things on Wikipedia and ended up grossly under heating things up. I ended up looking up the soldering station’s manual on the internet since I couldn’t actually find it right now due to the bags and bags and boxes of parts and shipping materials everywhere. Once I finished looking that over things melted much more easily and started acting more normally. Once I started packing the parts away into boxes I discovered the real manual buried in the pile.

As mentioned the timer is running just fine. I am waiting a few hours to see how far off the time is from my computer to get an idea of whether this has a slight or a significant drift. So far it looks quite good. Time will have to tell. ULTIMATELY being REASONABLY close over a few minutes is fine. In the final project I will be using a DS3232 I think it is as a time source to populate the microchip “RTCC” after powering the system down and then turning it back on. Microchip for whatever reason built a system that has marketing towards it having a Real Time Clock built in. The problem is it doesn’t keep time when you turn it off due to having no backup battery of any kind. As a result it needs to be set every time you apply power to the system and then take it away when you turn it off.

Since I intend to hook this to the internet / router eventually I will try to implement a NTP client to set time into the DS3232 and then from there into the Microchip PIC32 while it runs. I’ve now manually adjusted the clock to be in sync (visibly anyway) with an atomic clock synced clock I have here immediately next to it. I set it at 10:12 so I will check it again in a few hours. The longer it seems stable the less I’ll have to make it lookup from the Dallas chip…..

I believe tomorrow I will be getting some ambient temperature, humidity, and barometric pressure sensors as well as a few other sensors I may or may not be experimenting around with too in this and other projects. So far 10 minutes in the clocks still seem synced so we’ll see what happens over the next few hours and overnight.

Oh… and Microchip never replied to my “technical support” request to get an idea what they suggested. I think the details I’ve found on the internet meant several different options of crystal and capacitor combo were ok and what they DESIGNED it with was not very common to find. I managed to find what it sounded like it was designed for though and so far so good.

I should start mounting the header pins this weekend and start hooking things to some of the external sensors to start getting readings into the programming. Once that happens I can start porting my PIC24 code over making a few adjustments and then start programming the roast curve tracking portion.

More ordering

I have now ordered a series of parts from Mouser. This includes some lead free solder (ouch that stuff is expensive), flux, several different crystal oscillators and what I THINK to be matching capacitors, as well as a ton of headers for jumper cables. I entered a ticket for Microchip more than a week ago and have received no response whatsoever from them regarding the oscillator. Reading the instructions there was no mention of a type of crystal to use beyond 32khz. They mentioned 11pF capacitors of 0603 size. From what I can understand it SOUNDS LIKE in a properly designed board if you have a 6 or 7pF crystal you install an 11 to 14pF capacitor when it has short runs for the wiring etc. HOWEVER yesterday I found on the ethernet board they explicitly defined the crystal as a 12.5pF crystal. In my observations it appears that if you use 12.5pF crystals you should use 22-27pF capacitors, though.

The unfortunate problem is some people report using 11/12 capacitors with 12pF crystals and other report needing to use 27 etc. I’m thinking it MAY depend on the manufacturer of the crystal as to how sensitive it is and needing more or less power from the caps to be held up to trigger the oscillations of the crystals in addition to the variables of the individuals circuit layout. In other words some times it works no matter what and others it does not.

I still need to get some solder paste in addition to the rolled wire solder. I had issues identifying this on the Mouser website in the search except for a couple versions that had more than five tubes as a minimum. I do not have need for / ability to consume more than one syringe/tube right now so I need to find a vendor to procure some from that does one at a time. I stumbled across one a few nights ago that sells one at a time but I’ve not had time to dig through the browser history to find my way back there yet.

Once I have the solder paste and after the parts arrive mid week I can solder in the crystal and caps to see if they work for the timing functions and continue my efforts at programming the interface. Most of my programming is going to wrap around being able to gauge time changes happening so I need to wait for that to happen.

Currently I have a thermocouple breakout board that I will be attaching to some of the IO lines. I also have on order a relay board that has not arrived. Once the relay board arrives I can attach it to the development board and configure it to turn on the fan when the program run starts and not to turn it off until after the heat drops to a safe level. The heat will trigger on and off to maintain the desired ramp at this time. I will eventually replace it with a variable “dimmer” once I work out the other kinks in the system to give it finer control.

Early July Update. Observation on SR500.

Having been offered full time employment starting the middle of July after approximately 2 years of unemployment things are looking good for getting some progress on this project. LOL! While this may sound odd this is actually good due to the fact that I’m building (if all goes properly) a somewhat professional-esque coffee roasting computer. It takes a lot of money and resources to design this thing. I’m already into the project around $300-400 worth of circuit development kit gear and need a lot more stuff. In the end I’ll have a complete system that will be significantly cheaper to build but still have all the development kits to make other projects. I chose that route because of the “other projects” for down the road instead of only buying the things I need right now. While having full time employment will limit my available time it DOES however allow me money to keep purchasing all the parts.

Most projects you find on the internet for a coffee roaster use something like a Basic Stamp or some other very limited processor. It also usually involves hooking together a few things someone finds off eBay hooked together with some various wires and connectors salvaged off some old computer equipment and other devices abandoned in the garage. By the time it’s done you get a picture on the internet of some “finished” popcorn popper that looks like it’s about 30 seconds from taking out a corner of your house into a huge crater or like it’s some sort of industrial wiring project of conduit and electrical boxes.

I’m intending on making this thing as small as I can make it and sealing it up inside a electronics case with a single cord or perhaps a cord and a sensor wire that plugs into the back of the case that leads to the roaster. I don’t want 50 million little cords and sensors and clunky switches and other doo-dads spread across my counter. I also want to be able to pick the whole thing up and move it somewhere else without accidentally cracking off a wire and needing to re-solder it. I don’t know about you but I love my coffee. I don’t love having to re-solder the wiring just to roast some more or being unable to use my kitchen for anything else.

My Kitchen is not that big. It cannot accommodate a lot of “stuff” strewn around it. so the entire thing will need to be compact. As a result I intend on having a case that has a LCD touch screen installed. It will probably have a LED or two and at most probably a single power switch on the front edge or side. I will likely try to design the circuitry so that it fits onto one or more circuit boards stacked on top of one another. The LCD will be mounted on top with various connectors and other items stacked below it. I’m reasonably sure I can shrink the majority of this down into a space about 4″ by 6″ and about 1.5 to 2″ tall.

As mentioned I recently purchased the PIC32 development gear. At the moment I’ve been working on the GUI. This is a lot more complicated programming than I’m used to. Additionally I’m having a few “weird” situations where LED’s on the starter kit are lit that I don’t seem to understand why. When I turn on an LED that is normally off things work fine but then when I programmatically turn that one off the LCD turns off too though they shouldn’t be connected at all. The other LED works fine turning it on and off the same way. One of these LEDs simply stays on all the time no matter what.

At the moment I now have a “splash screen” functioning. I touch the screen and it continues to a “Home” menu. From there it offers several buttons to run the manual or the automatic roasting menu. There is also a provision for a Setup menu. I am still waiting for the ethernet to arrive that will allow me to download roasting data out of the system or pre-configure a roast from a web page. It currently draws temperature onto the screen from some “made up numbers” I have the thermocouple and the chip that will convert the sensor reading to numbers but need to solder it to a board that I can connect to the processor. I also need to do the same with the clock chip that I have as well. The processor has built in clock routines but they only work while the system is turned on. As soon as you cut power that clock loses it’s data. As a result I will program the system to read the clock chip every time the system turns on.

Over the next few days I will program the roasting screens to change certain display areas based on the simulated temperature numbers and then integrate the “control” portion where it then stops the increase in temperature and then tries to increase it appropriately. I still need to figure out the timer stuff… it doesnt seem to run on the demo and I was thinking it had to do with an oscillator being missing but this seems to be related to USB stuff in the documentation for the starter kit. This doesnt seem right though. I need to figure that out and then the next step is to start ordering all the pin headers and not included on some of the other boards. I’ll try to figure out a few more of the parts that I’ll need and order those in the next few days as well so I can keep working on this. Assuming I’m right that the crystal is required apparently Microchip decided to save 83 cents by not including the oscillator.

Also as a side note. Due to the job offer I completed a move to Northern California from Central California which has kept me from messing with the coffee much until now. A variety of coffee that I roasted here with the Fresh Roast +8 took approximately 6 minutes to hit second crack. Using a SR500 where I used to live took about 6 minutes as well while running the fan at half speed for the first two minutes. To do the same thing here with the SR500 appears to take around 7-8 minutes with a lot more slowing down the fan to around the 25% setting once movement starts to flow more easily and first crack was reached.

Roast temperature probe sweet spot in Fresh Roast

As I mentioned previously there appears to be a “donut” shaped sweet spot in the roast.  I had been testing my SR500 with a K type thermocouple in various spots.  Most of the time people run their roasters with the thermocouple shoved straight down the middle in a lot of the photos I’ve seen.  With the SR500 I’ve found this region to be very sparse with beans due to the high flow of air up the middle.

As shown in this diagram the center portion at the bottom shoots up the middle in the air column grabbing beans on the edges of the two green zones.  They are then tossed outward in the orange circular zone represented on top.  The beans that sit out on the purple areas on the bottom tend to burn due to low circulation.  Ultimately I would expect some sort of triangular slanted chute sealed to the edge would allow beans to be directed away from this burn zone and closer to an area where movement would be possible will help improve this.

I have not written much lately because I’m currently not at home using my roaster.  Prior to leaving I did some testing of the sweet spot ultimately getting pretty close to the middle of that sweet spot.  No matter which beans I roasted and the length the beans were being roasted I always noticed, while adjusting fan and temperature settings on the controls, that the beans always had first crack at the expected temperature +/- 1 degree Fahrenheit.    The same with second crack seemed to hold true as well.

Based on those readings and the reproducibility of that it is my opinion that the ideal thermocouple position in the SR500 and probably the SR300 is as I described earlier.  The height seems to be just below the surface of where 120 grams of beans fills the roasting chamber to for the tip.  This keeps it from the bottom where the heat is somewhat higher and allows it to be centered in contact with the main mass of beans once they expand slightly and begin to float more easily in the air column above his position.

Regarding the coffee’s I’ve roasted.  I previously mentioned some by name and certain characteristics of the roast as I was roasting them.  I had decided until I can track the actual temperatures and accurate times to share it was probably best not to continue posting the resulting curves as I roasted them.

Experimenting with a thermocouple.

So now that I have a faster responding thermocouple I’m finding that the  sensor works better closer to the edges of the roaster.   When thinking of the bean mass on the SR300 and SR500 you probably need to consider the bean mass as if it is a donut at the bottom of the chamber.  You want to get the tip of the probe centered in the middle of the donut and not the middle of the chamber.

Most modifications people have shown put the probe drilled straight down the middle.  This has the advantage of clearing the “chaff grate” on the sides down a natural hole in the roaster.  The problem with this is that the very center is actually a sort of “fountain” of beans and hot air.   The probe has very little contact with any of the roasted beans and is mostly picking up the air put out by the roaster.

Many people who have sensored this middle area report temperatures in the 420 to 425 degree range.  At the very end all of the beans are very fluid and filling almost the entire chamber area moving freely.  Once this finally happens the temperature readings then reach the 440-450 range showing a typical second crack area that coincides with actual second crack occuring.  Often second crack ACTUALLY happens while the probe is showing 400 degrees when placed in the middle.  This is likely due to the bean mass thermic reaction being hotter than the air rushing up from below and only a few minutes later does the air column catch up.

I’m starting to get low on beans from the samplers  with only a pound or two left of all the varieties.  I’m feeling that the probe placement I used initially in the middle helped stall a few roasts due to inaccurate temperatures of the bean mass that I responded to.  I’m testing a roast where the probe was moved closer to the “donut” range to see what sort of tastes develop but this one is pretty close to a standard roast.

My feelings are there is a “donut” sweet spot.  In the diagram below there is a Orange region [1] that is the normal plume of bean being pulled from the middle area on the bottom and [2] tossed up on top to the left and right.  As you descend into that area you enter part of the sweet spot [Green].  In the far left and right corners [Purple] you have a “burn” zone due to very low circulation of the beans.  This is caused by the more central area of the donut [3] falling towards the middle and then being jetted to the top [1] repeating the cycle.  Only when the beans have sufficiently roasted does the bean mass begin to rise above the initial [Yellow] fill line.  As the mass makes it above the silver metalic band there is enough movement to cause beans to leave the “Burn Zone” and make it easily into the column.  This initial burn area is where the stray first cracks are likely to originate and the uneven roast occurs.

Freshroast "Sweet Spot" created in roasting chamber.

I would thus interpret the space where the D on the left donut and the t on the right donut would be the approximate ideal locations to sample bean mass temperatures due to the piling on of beans from the fountain [1] above it.

Freshroast SR500 apparent “safety” mechanism. Adding new thermocouple.

Due to the microprocessor installed and the sensor mounted at the top of the roaster base where you install the roasting chamber.

NTC Thermistor mounting

It appears that when you turn the roaster on to High and lower the fan knob to the lowest setting the roaster will reach (unloaded) 430 degrees.  At that point the fan automatically revs up slightly (possibly due to the heater being off)  and the heat stops climbing at 433 degrees.  Occasionally it drops sooner but always between 430 and 433.  It then drops from 430ish degrees down to approximately 420 degrees and then resumes climbing again.  The heat appears to always stop at 420 and then goes back up.  The highest it stops dropping at is 422.

Temperatures were measured with a new K type thermocouple mounted approximately where the center of the bean mass would be.  I obtained this at OSH (Orchard Supply Hardware) since I needed some sort of multimeter for the moment.  They had one inexpensive “Craftsman” model with the ranges I need for measurements with the Digital Multimeter side with an included K type thermocouple mode.  I’m expecting the thermocouple to not last very long due to the temperature rating they put on it.  I will likely get one from eBay or something that is compatible with the K thermocouple sensors in the meter.  I’m guessing the protective covering they put on the tip end insulation area to keep the insulation from unraveling is not able to withstand the high temperature for very long but the insulation looks like it can take a lot more.   I’m going to probably get some high temperature silicone and put a little dab right at the end above the tip to hold the insulation better so it won’t fray.

Ultimately I’ll source out a thermocouple that can do more properly as I get further into this.   I’m going to switch to using the previous thermometer as a timer (was a secondary feature… you get one or the other on screen at any point in time) and the thermocouple as the new temperature sensor since it actually responds faster on temperature changes.