Arduino roaster controller with zero crossing dimmer

With all the time I’ve put into the Pic32 roaster I’ve always had this nagging worry that any of my sensors may have had damage during testing. When you try to get something working and keep getting gibberish you need to find a way to rule that out. As a result I decided to purchase an Arduino a few months back to confirm everything works. Turns out (so far) that everything IS actually working and I didn’t damage any sensors.  In the months I’ve been working with the Arduino I’ve actually learned a few reasons why some of the sensors didnt work on the PIC32 the way I had programmed them because learning to program an Arduino is sooooooooooooooooo much easier and better documented for “average people” to figure out compared to reading the hundreds of pages of technical manual for the PIC32 that isn’t ACTUALLY even finished being written yet.  There is a ton of code out there to test every single sensor I’ve purchased so far on Arduino. In addition I decided it would be a great way to start the dimmer using zero crossing detection in a system that runs outside the PIC32 before I convert it.

My intention is to get basic functions working on Arduino, then get the PIC to talk to the Arduino to send it commands to switch power by itself while the PIC reads all the sensors and logs data and then decides what to do as it comes from the Arduino.  Finally it will eventually be migrated entirely to PIC32 when I learn more about the interrupts on PIC32. At the moment I’ve put together a board that takes in 120VAC and uses Q4015L5 Triacs and MOC3052 drivers to control power to two receptacles. It reads the zero cross on my power using a H11AA1 and gets an interrupt used to trigger power switching. During my initial testing I confirmed the zero cross detection circuit worked and switching the triacs manually on or off worked without  regard to the zero cross state. It unfortunately didn’t seem to actually switch automatically for some reason when I wanted it to dim.  After a few days of testing I realized the Arduino Mega and the Uno had the interrupt timer pins in different places.

Since this is the first mains power circuit I’ve worked on I started running it with a variac out in the garage (and then fed that out into the driveway at the end of an extension cord…) and gradually turned the power up from 0 to 120VAC testing each section as I built it to ensure nothing arced or got hot or burnt up.  During late November I hooked it to the Arduino and got it to begin adjusting fan and heater under PC control as well as using two separate knobs.  Later in December and January I got it to begin logging to SD memory and following a programmed profile.  After that I added a bunch of additional environmental sensors and mounted it in a RadioShack project case.

 

First working prototype in Radioshack Project Case

I’m now at a stage where I’m looking to consolidate the various sensor cards either down onto a circuit board or attached to a set of pins directly.  I’ve grown tired of accidentally unplugging random wires carrying it back and forth from the garage to my office area and out to the kitchen stove / vent at various stages.  My hope is to shrink it down to a much less complicated arrangement being mostly on a single circuit board and interfaced by a few short cables to the Arduino.  It’s a bit complicated currently and getting worse.

Jumble of Arduino stuff

For the Arduino I’m using the MEGA 2560.  It is attached to the power control box pictured above via the DB25 cable.  At this time the box only controls power but I’ve mapped out pins on the DB25 to use for future boards to allow sensor breakout boards from a variety of DIY electronics companies to plug into them.   I’ll break this out to various header pins that match various breakout boards so they can be directly attached.  I’ll probably also design positions for eventually soldering chips directly to a board later once I order them when I’m further along and jumper the headers into those sections.  This will let me test a circuit on the board while still ensuring it actually works with the breakout board first.  The board will be designed to replace the items in the RadioShack box using SMD parts in some cases where cheaper and more convenient to shrink the board down smaller.  I hope to have it all shrunk down and consolidated to a single board with a DB25 connector to get to an Arduino I’ll be mounting inside an Arduino Crib case.

Ordered Free Day items – Sensors, Valves, and Buttons OH MY!

Retailer Sparkfun has a sort of annual event.  They offer free stuff to people in the form of a code they can use on a future purchase for solving puzzles/trivia or other challenges as they decide from year to year.  This year I managed to come home for lunch with the contest still running and won $100 of free stuff from Sparkfun instead of eating lunch.  It took almost my entire lunch hour but eventually I managed to get a captcha correct at the right moment and won a $100 code.

As luck would have it one of the items I wanted rapidly sold out that same day so by the time I got home from work I couldn’t place my order.  So after a few days the item finally went back in stock and I placed my order.  So far they haven’t shipped the order which is kind of a frown maker but I figure they’ll get to it eventually.  Unfortunately this means I won’t get it until sometime next week but hey… it’s free!

Items for the coffee roaster project:

1 Crib for Arduino + Ethernet Faceplate – I’m hoping to mount a DB25 on the back of it and run that to a new PCB I want to get made.
1 RHT03 temp/humidity sensor module to try out for possible ambient sensing instead of the existing sensor due to soldering complexity
2 Current Sensors, jacks, and breakout for the jacks so I can breadboard them for now. – Two so I can sense total input vs only the amount going to the heater.  I intend to monitor this for statistical purposes/energy tracking, control options, and
Several PCB mount potentiometers for the next phase when I have a PCB made.
Momentary pushbutton switches for a control button panel.  To be wired to a single pin using analog sensing to figure out which buttons are pressed based on voltage/resistance readings.

For other projects:

2 solenoid controlled valves to shut off water.
Thumb joysticks… just because…
More Momentary pushbutton switches

I’m hoping to use some of the parts with one of the “pro” arduino boards or eventually figure out a smaller method using chips individually, a text LCD, a flow meter to monitor water gallons and tie it to the solenoid valves.  In pursuit of better water quality I have what is effectively a low level commercial high flow reverse osmosis water system.  It can produce around 700 gallons of reverse osmosis water per day.  It has a rather large faucet and my intention is to plug a flow meter like they use on some water cooling computer projects to track the rate the water is coming out and then turn it off with the solenoid after a defined amount of time or a specific number of gallons flows through the flow sensor.  I’ve had too many “accidents” where the 5 gallon water bottle overflows out the garage and down the driveway when I step away and get distracted.

I get told all the time… just set a timer.  I say why set a timer when you can engineer a circuit to do it automatically for you!

I figure I’ll modify or make a Total Dissolved Solids monitoring circuits to feed the water purity info to the controller, perhaps let me run water for a few moments to get the sensor reading cleaner water since it starts off spiked high.  It often does this during the first 20-60 seconds when I haven’t used it in a week or two.  Finally it then starts tracking gallons for this run and possibly remember “lifetime” gallons for filter life monitoring too since my last replacement.  To control it I’ll set the size bottle by the number of gallons it holds or a length of time to run on an LCD readout and using some buttons, press start, and wait for it to filter that much water.  Once that happens the valve will disengage closing the water off since they fail closed.

As long as the water pressure is enough out of the output line this should work out reliably enough to have it stop short and then have a “spurt” setting button to pulse smaller amounts of water out to top off.  My hope was to close off the input line AND the output line just to be sure it’s off in case something doesn’t work well.  Worst case is the input line has more than enough pressure to work and I’d need to follow-up with a spurt and then close an output valve manually to keep the membranes completely wet.

 

FreshRoast SR500 Teardown – Part 3

Continuing the series of taking a Fresh Roast SR500 apart leads us to the internal heat / air mechanisms.  At this stage you have reached the components critical to any modifications of your roaster.  I’m updating this post in December with photos taken back in October when I stripped the roaster down the rest of the way and began building my modifications.

Part 1 we started with the external screws to gain access to the internals.  In Part 2 we separated the electronics between the high and low voltage and then lifted the high voltage board out with the heater/fan.  This left us here:

Heater / Fan and Power board assembly

We have now reached the point where we unplug the old roaster boards and start looking at attaching alternate controls.  At this point you are going to separate the metal connectors from the board (assuming you are replacing any of these parts or modifying it in some way)  You will have a black plastic cover from the top, a metal cone underneath that funnels the hot air towards the vented top, and a black plastic pan with a fan sticking to the bottom.  The pan will have three screws.  You see one of the locations to the left side and another to the right.  The third one is not visible in this photo due to it being on the back side of everything you see.  If you remove the phillips screws from these locations it will allow the top plastic piece to be separated.  The top metal piece is sandwiches between these plastic pieces and held in place with the screws mentioned above.  The metal piece is sealed to the heater mechanisms inside the bottom black plastic pan using silicone sealant.

Once you lift the top covers off and break the silicone seal you see this:

and this:

The fan is firmly connected to the bottom and up into the blades.  The fan is a straight sheet of metal leading from the middle out to the edges with a flat disc on top.  It is not apparently simple to separate and seems quite “stuck” in place.  The middle “axle”/hub of the fan does not appear to have an obvious way to disconnect it though I’m sure there is a way to do so.

Looking back at the heating area you will see the bimetallic switch and a temperature sensitive fuse.

In the center there are two bolts/nuts .  These anchor the top part of the funnel to the heater coil.  You will notice 4 spots that look like staples above.  These are how several supports made of the same material that the fuse and switch are riveted to.  There is a metal ring holding this all in place with a “washer” made out of the same material again.  This material is a high temperature material often used in heat guns, hair dryers, and popcorn poppers.  It is designed not to burn and to cool off quickly.  There is no point in disconnecting the nuts  you see and you are likely to damage something in the process when you try.  Immediately under the center part is a small heater coil that connects to the fan.  This coil always generates heat whether the system is on or in “cool”.  It is used to lower the voltage from 120 volts to somewhere close to around 20 volts DC using resistance and the resulting energy given off by the coil.  The remaining electricity leads out from the system to the “black box” rectifier on the bottom of the fan motor.  The outer coil is on the opposite side of the slit and continues all the way around providing the majority of the heat.  You can see the outer cool quite clearly in the photo below.

In the photo above and below you clearly see the temperature fuse.  This device is called a ThermoDisc Microtemp thermal cutoff.  There is a PDF that discusses the features of this particular device http://www.thermodisc.com/uploads/PDF-ecombro.pdf.  It also has a diagram of the inner mechanisms that make this work.

It is a Thermodisc G4A01216C 216*C Cutoff.  Once the red stuff melts (at 216 degrees Celcius) there is a spring inside that is released and it mashes the wire outside of the housing and no longer makes contact to allow the electric to flow.  Once it fails the only way to repair it is to bypass it or to put a new one in.  Since the mechanisms are anchored with a rivet they are not the easiest to source and replace but it is possible to do.

The last mechanism is a Klixon YS10 46b-s x9ab.  This is a Klixon YS10 Series 150*C Beryllium Copper Arm, Standard Length Terminal (31.5).  Normally once it triggers at 150 Celcius it then has to cool before it works again.  The reset is set to 90 degrees normally and some models has a different offset.  YS10 specifies the type, 46 is the temperature (150 degrees) b specifies Beryllium Copper (the bimetalic switch material) -s for standard.  In the X9ab position this would possibly be where a different temperature reset amount would be specified.  It does not clarify the numbers used there.  It appeared in the PDF linked above as (XX) in the part number.  This MIGHT be that it needs a 9 degree temperature drop on the switch before it engages again assuming it uses an X as a place holder rather than using a 0.  Since it is not in parentheses this might simply be some sort of a plant number or production date rather than a temperature offset.

 

Modification:

Many modifiers like to disconnect both the fuse and the bi-metallic switch.  I do not advise this unless you are absolutely sure what you are doing.  If you wish to use the center heat coil separately or with the main coil together this is up to you.  You will need to disconnect the white wire that leads to the fan by prying open the brass clip (under the heat shrink) and supplying your own transformer to around 20 volts AC to independently control the fan.

At the moment I’ve been using an Arduino to control a Q4015L5 triac with a MOC3052 and a H11AA1 as a zero crossing detector. There are two triacs each used to separately power the fan and the heat circuits. Each side’s gate is triggered with a MOC3052 opto-isolator by a single pin on the Arduino to a resistor through the moc’s infrared led and on to the ground pin. The H11AA1 works the opposite way triggering a led on the high voltage side and it measures the fall of the 60hz sine wave of US electric.  Each fall signals the Arduino on another pin that is connected to a hardware interrupt on the processor. The interrupt sequence compares the fan and heat potentiometers to a map and then uses the lookup value to set the length of a processor timer. The timer then comes back and fires the fan or heat pin that fires the MOC3052 linking the triac and connecting power from the input side.

I disconnected the white wire from the fan and routed it with the primary heater coil so that they both run at the same time. On the fan side I connected it to a transformer from Radioshack that outputs 25VAC. This appears to adequately run the fan and delivers more air flow than normal due to the fan being “overdriven” from it’s normal voltages. While this is not good for long term use this could be useful if properly triggered in the programming for cooling and drying or initial heat up. In other words turn heat on at 70%. Start fan at 120% Gradually drop fan to 100%. Increase heat to 100% while dropping fan to 60%. Etc…

While running the system from a variac and through a watt/amp monitor I found the fan consuming approximately 50 watts at the original 100% air flow on through the new maximum around 70 watts for a 125 to 130% flow rate. Once I turned on the heater I found the original wattage level use set at 80 to 85% heat and what seemed like a normal heat output felt by hand in front of the output. Lately I had been getting around 1520 watts with momentary flutters up to 1580 at high and full fan before bypassing the controls. Now at 100% it was showing upper 1600 to 1750 watts for the brief few seconds before I turned it down.

I’m pretty certain this is not designed to run like this and would likely melt something if left to run this way on it’s own without some sort of “safety” override in the programming. What I would expect to be necessary is to mandate original 100% air flow before the heat can be turned past the usual level and the fan cannot be lowered until a specific number of seconds after the heat is dropped to a normal number. Additionally there should be a limit on the duration of this heat overdrive. This would be used to help drive the roast in a way many home roasters like to use to try reserving some heat until towards the end to drive it to second crack or some other nuance.

This should be thought of as some sort of reserved “afterburners” to a skilled pilot used only when necessary or someone pushing a nitrous injection button on a race car or turning on some super charger.

Once heat has been disabled it clearly cools off much faster than before. As of 10/10/11 I’m waiting to more firmly mount all the controls and switch to the new potentiometers before testing a roast. I also have a few buttons for start/stop and a microSD logger to setup first before I start this because I want to track thermocouple readings vs each of the percent settings etc so I can review it later after my first test. If anyone has a way I can sense the wattage use and feed it to the Arduino too please let me know. I’ve seen a few very LARGE devices intended for whole house sensing but I’m looking for something small….

FreshRoast SR500 Teardown – Part 1

This article will explain how to teardown a FreshRoast SR500 roaster and probably an SR300 as well. If you are looking to modify an SR500 the following content will be useful as well. It will include technical information about the components that make the SR500 work and suggestions of where modifications will need to take place if you wish to split fan and heater control to external dimmers, VARIAC devices, or otherwise control your SR500 with a Microchip PIC, Arduino, or other microcontroller or PID controller device.

Now that I’ve finally obtained a spare SR500 base I’m a little more comfortable with tearing down the roaster to see what is inside.  This process has confirmed my initial memory of the roaster being simple to open up.

On SweetMarias’ forum there was a question by a user that I replied to about how to open the SR500 to clean it. I made reference to the FreshRoast SR500 being pretty easy to open up to clean it out inside if you felt it had clogged in any way but did not have the ability to just pop one open nor did I have enough notes about it.  The user managed to clean his through the holes in the roaster using compressed air through the various openings due to having difficulty removing the screws and getting the bottom off.  I suspect he missed taking out the screws in the middle labeled as 7 and 8 below.

This article will be the first part explaining how to teardown a SR500 roaster and probably a SR300 as well.  If you are looking to modify an SR500 the later parts will be much more useful though everyone will need to know how to open it up to do most things.

Opening a FreshRoast SR500 Coffee Roaster

You will need:

  • A phillips screwdriver.
  • A SR500 Base (SR300 may be similar except for changes to the microcontroller board)
  • A baggie or small tray to hold screws
  • A clean area to work
  • Optional: Vacuum and/or compressed air to clean chaff from interior of the roaster base

Step 1:  Unplug your SR500 from the wall.

There is serious electrical voltage at levels that can kill you inside the SR500. DO NOT OPEN THE ROASTER BECAUSE YOU WILL VOID YOUR WARRANTY AND YOU WILL GET ELECTROCUTED AND BURN DOWN YOUR HOUSE.  (No really…)

Step 2: Place your SR500 base in a clean work area.

Remove the roast chamber, chaff collector, and lid so that all that is left is a base.

FreshRoast SR500 Base

SR500 Control Panel

Step 3: Since you apparently do not mind getting electrocuted, burning your house down, or voiding your warranty it’s not my fault if you continue further.

When you electrocute yourself and end up dead don’t come crying to me about it…. or haunting me either. I also don’t want to hear from your spouse, parents, kids, lawyer, or the fire department either.  I will smudge stick , holy water, and exorcise this house at the drop of a hat should your “ghost” come to haunt me… don’t tempt me. By continuing further you have indicated your agreement that you are willing to get electrocuted at your own risk and void your warranty and risk burning your house down. You also agree that you will not haunt me afterwards because this is what you wanted to do at your own risk. Now that we have the formalities covered you may (if desired) continue to Step 4.

Step 4: Turn the roaster over.

FreshRoast SR500 Bottom

Step 5: Remove the 8 screws from the bottom.

FreshRoast SR500 Screws (8)

Numbered Screw positions for SR500 Roaster

Step 6: Loosen and remove the bottom plate.

The bottom plate should be VERY loose at this point and could simply fall off.  In addition be aware the top ring of the roaster will be very loose now too.

FreshRoast SR500 Bottom Plate and Screws

Step 7: Bag up your loose screws so that you do not lose them.

Better to be safe than sorry.  Store the loose screws in a tray or sandwich bag.  There will be additional screws later if you remove the micro control board later.  Also be aware

Step 8: Inspect the interior.

From top to bottom in the picture below you have AC Power cord entering the roaster base, power control board, blower fan in the middle as well as the heater assembly around the fan, and the main logic micro control board at the bottom.

To the right you have the fan potentiometer wiring leading from the round potentiometer leading to the right side of the power control board.  On the left you have the main logic board wiring leading to the middle of the power control board.  In the middle the blower fan and the heater have black and white wiring that lead to the power control board.  Out of the side of the heater assembly are two small wires that are not visible in this photo.  Those are the NTC sensor wiring.

FreshRoast SR500 Interior

Step 9:  If you are interested in cleaning the roaster you certainly can do so now.

Compressed air and/or vacuuming can be done at this time.  With a narrow crevice tool you can probably get access next to the motor in the middle.  There are many small blades as part of the blower inside the black housing shown above.  If you are more adventurous you will need to disassemble further and this will get you closer to the intake around the motor assembly.

Step 10:  Further Disassembly.

If you are disassembling the roaster further you will need to remove the power board, the lower housing from the upper housing, and disconnect the “microcontroller board” from the power board.  These will be explained in Part 2.

FYI I’ve taken a tiny break…

So as some of you may have guessed with the gaps between postings I have way too many hobbies.  One of them includes aquariums.  I only do freshwater stuff but I do more than “a goldfish in a bowl”.  Really I mainly focus on plants, shrimp, and a few not really extreme fish that are deemed compatible with the shrimp.  The plants need lots of light to make them grow which is why most people can’t keep aquarium plants alive.  The shrimp pick at the base of the plants pulling away the dead parts and look cool.

Several months ago I had some setbacks with some shrimp and some illnesses that came in with them.  I’ve decided to start over and build a setup that is designed to keep all of the conditions very solid that was hard to do in the “nano tank” that I had been using.  This resulted in ordering a new tank that came with a matching size stand that was unfinished.  I had to sand, finish, and assemble a stand and I’ve been throwing together a bunch of automated controllers that monitoring a variety of probes and adjust things…. not much different than controlling conditions in a coffee roaster.  Eventually I’ll be building my own control system for it and I’ll be selling off the existing control system that I’m installing just to get it running.

There is obviously value in “get it done now” vs building it yourself.  There is always a cost to results ratio that needs met to justify buying something or doing it yourself.  I think a lot of the coffee roasting world in the DIY arena operates in this world.  For people who cannot do it themselves and insist on programmability etc there are 800-900 dollar roaster systems.  For everyone else there is 150-500 dollar roasting setups.  Finally for those that want to make a 900 dollar roasting system on their own there’s Arduino and other micro controllers and the $9.99 Poppery roaster to the $200 random brand entry level roaster.

Anyway, I’m at a stage with the roaster that I need to hook up relays to cycle the heating systems on and off.  I’m probably going to order a second SR500 base from a site I found on the internet to take apart completely and splice these relays into it for the microcontroller to cycle.  I’m pondering the 3 stages of heat from the selector switch and actually cycling the power to the heater element.  I need to check some voltage readings from inside the roaster once I take it apart and decide if I want my controller sending signals in place of the switch to vary the desired heat status or just control the heater.  It might be easier to try controlling the fan speed first from my controller and then come back to the heater later.

For the moment I need to finish the fish tank stuff.  This weekend I’m trying to finish the under tank plumbing and then get the tank up on the stand.  The tank is an 18x18x18 25 gallon glass tank (no plastic, only a silicone seal between the glass).  I’m using a Neptune System Apex Controller underneath and am running all the sensors into the plumbing underneath.  The light on top is a 70 watt Metal Halide and the I’ve got CO2 gas bubbled into the plumbing based on the pH.  The entire thing gets logged and can be graphed onto a device web page.  I’m using an Eheim Ecco canister filter and running the output through a UV sterilizer, inline heater, and the CO2 reactor.  Later (once I get the right fittings) I’m mounting a IceProbe chiller inline through some plumbing as well.  I need to modify it with different fans to push air from inside the enclosure through the heat sink and then vent it out of the tank rather than blowing air down onto the heat sink.  The fan is pretty noisy so I’ll be replacing it with fans used to make super silent computer vent fans and running a series of small ones along the sides blowing inward and one large one up top to suck outward that will pass through the base enclosure wall.

I’m kind of discouraged in the coffee world right now.  Mainly I’ve been waiting for a good Ethiopian coffee to come in but this year has not been a good year for coffee.  I’m trying to figure out what else I want to try as my “base” coffee for the ongoing roasting experiments.  I really need to have a base to compare one roast to the next as I adjust the programming on the controller rather than having different beans roast after roast.  I just havent found anything I want to drink week after week while I work out the kinks.

More logging… and floating math.

Two nights ago I managed to finally get the screen that shows graphs to draw the current temperature up in the corner on top of the graph.  Most of the problem was figuring out how to convert the “float” numbers to characters.

I needed to feed this into Microchip’s Graphics Library and accommodate “unicode” characters to get the “degree” symbol on the screen eventually.  Instead of typing a string as string=”Hello There”; it ends up being string={‘H’, ‘e’, ‘l’, ‘l’, ‘l’, ‘o’, ‘ ‘, ‘T’, ‘h’, ‘e’, ‘r’, ‘e’}; which ends up being an array of character values.

A float is a decimal number.  In this case 3 digits for hundreds, a decimal position, and 3 more digits for numbers.  The sensor is kicking out two digits and I’m adding readings together, averaging them, and then rounding up or down with the extra positions in some places.  The PIC32 unfortunately does not have a floating point calculation area in its brain resulting in it “compensating” for it by automatically sliding all the other numbers around using complicated things called mantissa and a few other things I really don’t want to deal with.

The reason I don’t want to deal with them is actually NOT because it is complicated (which it is) but because since it is compensating when you divide a float it has to do MANY cpu cycles for it to compensate and come up with the answer.  It is ACTUALLY easier to multiply the float by 100, 1000, 10,000 etc and insert that number into an integer data type.  Integers can be divided, multiplied, subtracted, etc without worrying about how the numbers line up and doing crazy compensating.  They just don’t end up with a decimal.

If you have a temperature of 175.25 degrees fahrenheit you multiply it by 1000 which equals 175250.  This maintains all of  required digits as a whole number and gives extra space for “rounding” down below.

The issue with the graphics library you need to use a font for every character and take into consideration symbols like degrees etc.  This means it is not simply just a “character” but you need to allocate for all the extra stuff.  This results in a larger space for each character.  To me it looks like a single character in XChar is actually two positions instead of one to leave extra room for the fancy characters to be allowed for.  To convert text strings or float numbers into characters that can be handled by the library you have to load them into an array.  This array to convert the above number (float averaged=175.25)  looks something like this:

int showtemp[8];
showtemp[0]=averaged*1000; //175250

showtemp[1]=showtemp[0]/100000; //175250/100000 = 1 in integer
showtemp[2]=showtemp[0]/10000-(showtemp[1]*10); //175250/10000 = 17.  and then 17- 1*10 = 7 in integer
showtemp[3]=showtemp[0]/1000-(showtemp[1]*100)-(showtemp[2]*10); 175250/1000 = 175 and then 175 – 1*100 – 7*10 = 5
showtemp[4]=showtemp[0]/100-(showtemp[1]*1000)-(showtemp[2]*100)-(showtemp[3]*10); // etc
showtemp[5]=showtemp[0]/10-(showtemp[1]*10000)-(showtemp[2]*1000)-(showtemp[3]*100)-(showtemp[4]*10);

temperaturetext[0]=showtemp[1]+48; // 1 + 48 = 49 = proper number for 1 in character
temperaturetext[1]=showtemp[2]+48;  // 7+ 48 = 55 or proper number for 7 in character
temperaturetext[2]=showtemp[3]+48; // etc
temperaturetext[3]=46; // 46 = proper number for a decimal.
temperaturetext[4]=showtemp[4]+48;  //etc
temperaturetext[5]=showtemp[5]+48;  //etc

 

the results in temperaturetext looks like {‘1′,’7′,’5′,’.’,’2′,’5′}

I roasted twice now using the new graph with actual temperatures listed up top and was planning on comparing the results but I accidentally corrupted the first file.  I’ve got one more batch of some coffee from Rwanda that I was testing with.  I’m getting pretty close to running out of coffee again so it’s time to order some more soon.  I was hoping to have something good from Ethiopia come up for sale but it’s still a little early for that.

Still working on… recognizing temperatures for various(rough) stages the roast is at vs some sort of mechanism to confirm a stage marking things like first / second etc.  Also need to get ambient weather information recorded and get other sensors going on it…. and make it pretier…. and of course get it hooked to higher voltage turning on and off the heat.

Close Encounters of the SD Memory Kind…

Sooo generally annoyed with sensors I decide to take a different direction, SD Memory.  Fun things happen with SD Memory.  You rip one open and you’ll usually find a single little flash memory chip and some other chip in front of it.  I haven’t identified the “guts” yet but that’s not really important.  What’s important is that generally you talk to that little flash memory chip using SPI (usually unless you wanna pay for licensing fees to use the direct SDIO method it sounds like.  Crazy licensing costs = faster SD Memory.  Free method = slow access.  If you need every bit of speed you can get then you’ll likely need that expensive method.  If you can buffer up data internally and then write it out later then you’ll use the SPI method).  This is likely to be preferred to have a built in memory chip to buffer items up just like working with a document on your computer.  It then isn’t until you save the file that it then transfers it from the internal memory out to the SD memory for transportation to the PC.

There is not much to it other than that except for having some structures that issue a few reads and writes to find a spot on the chip and make a file name and fill the file full of stuff.  That portion is the “FAT” portion that makes you able to read it on a computer etc.  This slows things down considerably in an SPI Method.  Apparently people have experimented with reading/writing to the SD memory chip with no

After a few days of poking at it and moving a couple wires around I’ve now managed to get it to make a file… and I can see that file on a PC.  The problem is I can’t get it to put anything INSIDE the file.   It just keeps getting stuck on the portion where it’s expanding the size of the file…  further it’s been quite a pain that any SD memory sample code out there is written focused on the 3xx series PIC32 and from looking at the various forums my issues are pretty common.  Most people get the 3xx series working just fine.  Many people seem to get files with no contents on 6xx and 7xx series PIC32s.

The only published successful people I’ve found seem to be commercial product developers who don’t want to share any code samples clarifying how to handle the failures properly.  The only exception I’ve found was some code modified by the user bmorse on mypic32.com.    His code appears to be modified to work specifically at 60mhz and using SPI2 which worked for initial testing to ensure I had things wired properly.   I needed to put a pull up resistor on the CS and the DO of SD to SDI2 on PIC32 and everything started working properly.

I’m now trying to isolate the portion of the code that affects the timing to increase the system speed back up to 80 mhz and scale the SPI back down again.   To assist in this department I’ve procured a FT232 UART to USB Com port chip on a breakout board from SparkFun.   This board is commonly used to take the UART output of various text and data from the running PIC and interact with it in the terminal window instead of watching the raw data on the debug watch.  I’ve learned that the watch window often “messes up” a lot of SPI states by constantly inspecting the information.  The idea is that it interrupts the normal state (data waiting etc) flags due to having read it for the watch window  blocking the rest of the circuit from detecting it.

I’ve also obtained a DS3234 clock.  At time time I only have the one I2C DS1307 clock and I may wish to eliminate the I2C bus unless I come up with something else that needs it.  Even if I use I2C elsewhere it seems as if 5 volt I2C is more of a rarity meaning I can’t really use that bus for other things anyway.

User interface work.

So at this point I’ve gotten annoyed with the other temperature sensor and decided I might as well move ahead with the functional part of the roaster.  This means the first thing I needed to do is draw a main menu for options.

Main Menu

As you can see this lists Manual and Auto Roast.  My plan is to make it where the first option simply gives you a few readings and then lets you “drive” by sliding the controls around.   I would make it log the information of what you set things to and what you got back from the system and perhaps let you “store” the settings to play them again as a profile.  That is where the next phase comes in, the Auto Roast.

I expect Auto Roast to be a portion of the system that would let you choose to either A) load a previous profile, or B) let the roaster pretty much run itself using a basic model of “drying” at a lower temperature for the first few minutes at a high fan speed and then begin to lower the fan speed and raise the temperature responding based on the time into the roast vs the temperature.  Expectations of driving first crack and the end of the roast based on a desired result would vary how it would work.  I’d anticipate some sort of yes/no 1/2/3/4 etc sort of question and answer series immediately before the roast activates.  While it would be mostly automatic you can step in at any time and seize control of a particular setting.

Main roasting screen

At this time the roasting system only monitors.  I have yet to work on actually connecting it directly to any of the controls on the roaster.  This will come later when there are more and better controls implemented.  Currently it simply shows bean temperature in Fahrenheit.  I will add the option to switch the temperatures on the Settings option from the main menu.  It also has a slighly inaccurate timer.  It seems to gain a second or two over the system clock in the corner every 40-60 seconds.  I need to work on the prioritization of the interrupts in the system and implement a series of if/else and/or case statements where I can service temperature, screen updates, and time tracking and use all of those checks as part of the delays required reading various sensors etc.  For example if it takes 100ns to service one sensor telling it to read a temperature or something but I need to wait 100ns to do another function then I can initiate the read request, perform the other function, and then return at the end to pickup the temperature result.  Some functions are more critical so they will take priority over other functions.  Those functions will take place on a tighter schedule while the other functions will “squeeze in” anywhere they can and take place based on a “true/false” tracking of whether they’ve run recently.  Once everything has run then everything will reset and things will start looping again.

The roast control system also has a series of buttons down the bottom for returning to the main menu, adding or removing time from the timer, as well as buttons for heat and fan control.  I expect to put more sensor readings as time goes on to display on the empty space.  I’m hoping to get the fan and heat controls to pop up over top of the roasting screen, allow adjustments, and then drop back to the bottom “tray”.

So far the SHT15 is winning. It mocks me.

My next step I wanted to try out some ambient measurements to add to the history of roasts once I get things logging. I’ve seen plenty of roast master setups having humidity and temperature readings around the area they work in and figured…. might be a good idea of something to try logging at the beginning of the roasts. One of the options was the SHT15 sensor. After about a day of poking around and reading data sheets I got it wired in and read a bunch of PIC16 and PIC18 and one PIC24 set of source code written for the SHT15. Upon looking through their code I can’t even begin to understand why most of that code even works because many times it does NOT conform to the requirements as stated in the data sheet. I’m pretty certain that most of that code got it to work “by accident” rather than by design.

As of now I’ve managed to get the SHT15 to report temperature readings reliably back to back in a loop for several dozen hits but could not get humidity to respond during that run. It responded appropriately when warmth was applied in the area of the sensor and then….. I rebooted the circuit after inserting a set of formulas to convert the reading to a real temperature number. I figured it was working and I didnt want to have to manually do the math. Upon starting it I found it immediately went back to 65535. I did an undo, recompile, and program and nada. Still 65535.

Wheeeeee

I’m pretty sure this is some sort of timing issue but it could be an issue with the pull up resistors too I suppose. I need to read more about the voltage I’m using vs the resistors on the bus and the length of wiring involved as well. I may be getting some sort of interference with all the gear on the desk right now and there were a few forum conversations talking about the length of wiring being somewhat sensitive for some people.

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.