PID continues to works great, efficiency measured

The PID control continues to work great, after 3 1/2 days the PID seems to be in good control. The graph shows a bit of variation but within 10 degrees which seems within bounds.

3 1/2 days of PID control

3 1/2 days of PID control

During this time period I used an average of 2.15 bags of pellets per day. At 40 lbs. per bag this is 86 lbs per day or 39.09 kg/day. At a cost of $216/ton. this is $9.28/day. I am hoping to reduce this to less than a dollar with chips but before I do, I intend to implement some more mechanisms to reduce fuel usage. More to come with the new year, Merry Christmas, Happy Holidays everyone.


PID works!

122012PID

After tweaking the Kp and making the Ki work in the software the graph speaks for itself. The software is controlling the temperature to the set point of 140°F within a fraction of a degree for the most part. This was the last difficult piece of puzzle. I did not use the PID function in the Arduino language, instead I wrote my own with a large part of the understanding of the code coming from the excellent description by Brett Bueargard who wrote the PID library, as well as assistance from a friend who helped me understand the problem better in a spreadsheet. I now have a burner that works dependably and is modular so that I can make changes and see if I can further improve the efficiency. I now have software which will hold the temperature without worry. I plan to add a proof of fire sensor next for the mechanical part of the project, and add the ability to set the Real Time clock in the software. Onward, ever onward, but for today I think I will have a beer!


Thinking about PID control

Proportional, Integrative, Differential control.  There is a function in Arduino that implements this and I started thinking about how I would do this and if it would be appropriate.  The function, really an algorithm is all based on error and time.  In this case the error is the difference between the set point and the actual tank temperature.

All three functions Proportional, Integrative and Differential have a factor, Kp, Ki and Kd.  For example let’s calculate each portion of the formula starting with the proportional contribution Kp, if the current temperature of the tank is 100°F and the set point is 140°F the error is 40.  The integrative portion of the formula adds the contribution of the error over time.  This would be the Ki factor multiplied by 40 and added to the previous Ki*error for every time period.  The differential portion is the Kd multiplied by the difference in the tank temperatures or in other words the tank temperature at the beginning of the time period  minus the tank temperature at the end of the time period.  Let’s take some of the data collected by the OpenLog microSD card and take a stab at this in Excel. We’ll assume Kp=6, Ki=.6 and Kd =.2. The time period is one minute.

Raw data imported into Excel with PID data calculated

Raw data imported into Excel with PID data calculated

Now in practical terms how is the the fire being controlled now?  The auger time is being controlled.  Of course practically the fire must not go out so there is a minimum time the auger must run, since in this program the auger is on a fixed time of 5 secs this really means that all of the control comes from varying the time the auger is not running.  But again the fire can’t go out so I figure the max amount of time between the fixed auger feeds of five seconds is forty seconds.  So that is the slowest the fire can go.  How fast can it go?  Well theoretically the feed could run continuously but again we are dealing with a chemical process that cannot simply absorb 100% fuel feed.  In this case the auger motor added a practical aspect by limiting the feed to a duty cycle of 50%, so the maximum time that the feed can be on is half the time.

Since the PID control is based on time periods and the data collection time period is one minute,lets choose a time of 1 minute for argument.  In one minute at max run the feed will be on 30 seconds and off 30 seconds.  In one minute at min run the feed will be on for 5 secs, off for 40 secs, on for 5 secs and then off for the remaining 10 seconds of the minute.  So again we don’t control the on time only the off time and the difference between the max on time (min off time) and min on time (max off time) is 30 secs on, 30 secs off for the max and 10 secs on and 50 secs off for the min.   So the only control between full bore and idle is the difference between 50secs and 30 secs or 20 secs per minute.
 
This explains some of the challenge,  the other challenge is the inertial effect of the combustion reaction especially if unburned fuel has built up.  So now that the PID output has been calculated I’m having a hard time wrapping my mind around how this would translate to control of the time, I know I could set up a simple proportion between the PID output and the 0-20 scale of  auger off time dwell.  However in this example the PID output  increases as the error decreases.  I guess that’s the beauty of a spreadsheet I will play around with Kp, Ki and Kd to see if I can get this to work a little better.


Software changes to control underdamped Setpoint control

After running for a few days I have been happy with the amount of holes in the bottom of the burner, the ash level when running does not get higher or lower.  However the fuel usage is a little higher than I thought it would be and the program does not hold the set point temperature as well as I would like.  The graph shows the interaction of the excess fuel usage and the set point.  At times the boiler should be idling along with very little fuel feed, the program should be able to determine the fuel usage needed to control the temperature to the set point.

Under damped control

Under damped control

You can see the 140°F horizontal grid line, the set point is currently 140°F. The integral of the area over that line is excessive fuel usage. However that’s not the only issue, the second issue is the amplitude seems to grow larger until approx. 121 minutes.  At that point I shut down and started a new software change.    You can see the slow recovery as I had to relight the fire and then the software starting correcting earlier, so in short more software changes are in order.    The challenge is to build self correcting software since the whole goal of this project is to burn chips and that will require the software to deal with different energy densities.  I’ll make a few more software changes and post another graph soon.


Continuous run, working fine, future improvments

At this point the boiler has been working for a day and based on last years experience I see no reason why I would need to shut down for a week.  Yesterday we brought two tons of pellets into the shop knowing snow and rain mix was in the forecast.  Yesterday was a pleasant 40°F day with full sunshine a great day to move a little fuel.  I believe we are on a two bag a day pace so with luck I won’t have to worry about moving pellets again until nearly February.  We have chairs set up by the boiler and it is a pleasant place to sit and talk in lieu of sitting in front of a woodstove.

So..what’s next on the list.  1) Software improvements, to be able to adapt to pellets or chips will take a more dynamic software approach.  The software should be able to adapt automatically to varying energy densities.  2) Faster and easier maintenance.  More over center latches to be able to easily take apart the chimney for cleaning and a removable top to the boiler to easily clean the tank tubes.  3) Testing with various materials, chips being at the top of the list.  4) Building a chip dryer.  5) Adding more sensors, I am definitely going to add a fire eye to confirm fire.   I would like to monitor the temperature of the feed motor and the fan motor.   It would be helpful to add a relay for the fan motor so that is controlled by the Arduino.   6) I have tried the self start but it is not in the software yet, that would be a great leap forward especially for March and April when daytime heat is often not required but nighttime heat and hot water are needed.  Automatic starting would be great and would save a lot of fuel.  7) Improving the CNC Plasma cutter, there is still some chatter in the  Y axis and if I can fix that, it would be great and would probably speed the CNC up significantly cutting down on the dross or slag produced when it is cutting.  Cutting down on the slag is a major priority since it is time consuming to grind this off and I am sure part of the development will include trying different burner designs.  8)  Taking a Design of Experiments statistical approach to the burner design to optimize for efficiency.  I gave myself a pretty good list back in September and I have whittled it down to completion so I know it is all possible and fun, I just need to get started.  Tomorrow probably, today I am just going to sit by the fire and enjoy a Sunday.


12/14/12 data, more testing, draft improvements

I  added  gasket rope which I bought at a local hardware store, which is made to replace the gasket material which comes in a wood stove door between the burn plate and the boiler.  This gasket changed the Magnehelic vacuum reading from .1″H2O to .4″H2O.  That I thought would make the flame a bit more vigorous.  I also made the holes in the bottom of the burner larger to allow the ash to fall through.  Lastly I made minor changes by tacking some material across some holes and making more air holes in the ramp plate which the pellets fall down.

Temperature vs. Minutes 12/14/12 data

Temperature vs. Minutes 12/14/12 data

The main differences in this graph and the previous day’s graphs are at approximately minute 273  pellets were added and the sawdust which had been running finally ran out.   As you can see it had enough energy density to overcome the demands of the circulator circuit.  The biggest problem after that came at about 341 when the program allowed the temperature to go past the set point of 140°F  The only explanation I could come up with is the division by different types of declared variables was not allowed and yielded a result of zero.  I was dividing an unsigned long which is an integer by .8 to increase the Auger Off time by 20%.  Since you will not get an integer when you do this the program may not have liked this result.  The Arduino language is a slight variant of C++ .  I have since made all the variables doubles we’ll see if that works.  Today’s burn will be a better test of the burner floors ability to let ash fall through.  Sawdust is very difficult to burn.  It’s also difficult to get the ash to fall through the burner floor.   I think this is because the air cannot get around the sawdust sufficiently to burn it completely and hence it smolders in clumps instead of falling through the grate.    The burner when I pulled it out to inspect it was definitely not clean of ash but did appear better than yesterday.


Electrical box and paint, Step 7 of a DIY record

It took me longer than I would like, but the hopper/auger assembly is now painted and the electrical box is mounted and the wiring is functional.  I have mounted the Arduino and LCD display.  That box also contains the board that accommodates the thermistor electronics, which are the sensors that read various temperatures.

The main electrical box is a stainless steel box  I picked up used from a scrap yard, putting the frugal in frugaltinker.com.  That’s the reason that there are so many holes in the box,  however it was such a good deal I thought it was worth it, despite the cosmetics.  The cover was just too ugly to leave be, so I attempted to skin the cover with a plate which I plasma cut in “Frugaltinker.com”.  This doesn’t show up too well, I probably should paint a background behind it to make it stand out better. Painting a background seems low on the to do list right now, so I think I will skip that task and focus on the burner.

The CNC was invaluable in the production of the electrical mounting plate, mounted inside the electrical box.  It was great to not have to drill any holes to mount anything.   All the holes were cut with the CNC and fit just fine.

So the final task is complete before the burner is welded up and tested.

This slideshow requires JavaScript.


Radio data transfer!

I have been working through some of Robert Faluidi’s excellent book ” Building Wireless Sensor Networks with Zigbee, Xbee and Arduino Processing”  Working with these radios has been a lot of fun.  The book is a great introduction to the basics and gives you a great idea for what can be done with a little imagination.

My plan for the chip boiler is to continue building and testing blocks of code that will be all integrated into the boiler control program at least at some point for some of the testing period.  Last winter the boiler ran for approximately a month and  a half.  In that time there were many starts and stops which made me wish the Arduino could provide better data for the feedback of the program itself, hence the data logging program just tested.

A second desire is the real time temperature monitoring of the boiler water as well as the auger feed pipe temperature.  Hence the need for wireless radio temperature monitoring.    That is what the wireless data transfer will accomplish.  I am picturing a simple box with a LCD screen to display the data running on a 9v battery.  Video to follow soon. Thanks as always for reading.


Milestones, why we need to take a minute.

There is so much to do in life,  so much to to make, test, verify, improve, install etc.   that it is good to look back on goals completed and know that progress is being made.  I think that is why I like programming so much, it is near instant feedback to test and observe the results.  In my outside of night work hobby life I am finally going to get a machine out of my shop that has been there nearly a year.    That is going to free up a lot of physical space, but mentally I know it is going to be huge.  A constant reminder of time and money gone.  YEA!

On the project side I received a package I ordered from Yourduino.com to complete a phase of the OpenLog testing.  My plan has been to create a temperature recorder with a real time clock using a Arduino Uno  logging time and temperature data to OpenLog’s microSD card recorder.  Here is the finished code, that compiles and works.

/*
Temperature and Time recorder test

This code records time and temperature to a microSd card, this is a test program to prove the ability and
allow the code to be used in other programs as part of a larger code development

A thermistors is attached to analog pin 0
The Real time clock SDA pin is attached to analog 4, the RTC SCL pin is attached to analog pin 5

The circuit:
Arduino Digitial Pins
0 RX to MicroSD TX
1 TX to MicroSD RX
2 to MicorSD GRN
3
4
5
6
7
8
9
10
11
12
13

Inputs
* Thermister, Analog in 0
* RTC SDA, Analog pin 4
* RTC SCL, Analog pin 5

Created 9/10/12
http://www.frugaltinker.com

*/
#include <math.h> // include the library code for thermsiter functions
#include <Wire.h>
#include “RTClib.h”

RTC_DS1307 RTC;

// define I/O pins

// define constants for clarity

// define variables
int statLED = 13;          //toggles LED
int resetOpenLog = 2;      //reset OpenLog

int hour = 0;              // clock hour
int minute = 0;            // clock minute

// the following variables are long’s because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.

unsigned long prevmillis = 0;     // prevmillis
long DisplayDwell = 7500; // dwell time of 7.5 secs

//define function to calculate the temperature in fahrenheit for Analog pin 0
double Thermister(int RawADC) {//beginning of function
double Temp;
Temp = log(((10240000/RawADC) – 10000));
Temp = 1 / (0.001129148 + (0.000234125 * Temp) + (0.0000000876741 * Temp * Temp * Temp));
Temp = Temp – 273.15;            // Convert Kelvin to Celcius
Temp = (Temp * 9.0)/ 5.0 + 32.0; // Convert Celcius to Fahrenheit
return Temp;
}//end of function

void OutsideTempSection() {// outside temp section
Serial.print(Thermister(analogRead(0))); //print to the lcd should be the Outside temp if thermistor is hooked up properly
Serial.print(“, “);
}// end outside temp function

void TimeSection() {//start time function
DateTime now = RTC.now();
hour=now.hour(),DEC;       //get the hour from the RTC chip
minute=now.minute(),DEC;   //get the minute from the RTC chip
if (hour>=13)              //PM Section
hour=hour-12;           //printed hour is the hour
Serial.print (hour);          //prints the hour
Serial.print (“:”);           // prints a colon
if (minute<10)             //adds a “0” if the time is single digit
Serial.print (“0″);
Serial.print(minute);          //prints minuts
hour=now.hour(),DEC;       //get the hour from the RTC chip
if (hour>=12)   // prints pm
Serial.println (” PM”);
if (hour<12)                       // prints am
Serial.println (” AM”);
}// end time function

void setup()
{//Begin Setup section
// pinMode(ledPin, OUTPUT);
pinMode(statLED, OUTPUT);
pinMode(resetOpenLog, OUTPUT);

Wire.begin();
RTC.begin();
RTC.adjust(DateTime(__DATE__, __TIME__));
Serial.begin(9600);             //initiate serial communication and define baud rate
delay (1000);                   //delay 1 sec for the data logger to begin
//Reset OpenLog
digitalWrite(resetOpenLog, LOW);
delay(100);
digitalWrite(resetOpenLog, HIGH);

//Wait for OpenLog to respond with ‘<‘ to indicate it is alive and recording to a file
while(1) {
if(Serial.available())
if(Serial.read() == ‘<‘) break;
}

//Send three control z to enter OpenLog command mode
//Works with Arduino v1.0
Serial.write(26);
Serial.write(26);
Serial.write(26);
//Wait for OpenLog to respond with ‘>’ to indicate we are in command mode
while(1) {
if(Serial.available())
if(Serial.read() == ‘>’) break;
}
//send the open file
Serial.print(“Templog.txt\r”); //\r in string + regular print works with older v2.5 Openlogs

//Wait for OpenLog to return to waiting for a command
while(1) {
if(Serial.available())
if(Serial.read() == ‘>’) break;
}
// send the command to append the file
Serial.print(“append Templog.txt\r”);

//Wait for OpenLog to indicate file is open and ready for writing
while(1) {
if(Serial.available())
if(Serial.read() == ‘<‘) break;
}

} //End setup section

void loop()
{//Begin Loop section
if (millis()-prevmillis> DisplayDwell)
{//start if sections
OutsideTempSection();    //checks and displays the outside temp section
TimeSection();           //displays the time
prevmillis=millis();
}// end if section

}//End loop section

 

 


Why spend your evenings and weekends welding and programming?

I have been following the pre buy prices of oil for a while now.  For those of you unfamiliar with the term “pre buy”. It is what is sounds like, the price of the oil you will have delivered is prepaid by you and you and your supplier determine how many gallons you should buy.  If you over buy you can usually take the remaining gallons you bought in a final delivery and store that amount in your own tank for next year.  If you can’t hold that much you get a refund, but my supplier would not hold that price for anything longer than one season.  If I under bought they usually would allow me the pre buy price on additional gallons if I used their estimate of how many gallons to buy.

Below is a .pdf chart of the pre buy prices  by year.  Note the chart also has a straight line regression trendline based on the existing data.  The line is extrapolated out and predicts what the coming years prices may become.  Note also that for a period of years the trendline and the prices were relatively accurate and tight to the trendline.   I think as time goes on the market may become more volatile.  The world market for oil is currently in the dollar currency.  This may also add to the price fluctuations as the dollar currency may become volatile as well as the oil market’s geopolitical issues may also add to the fluctuation.  Makes me want to get off the merry go round.  Note clicking on the link should bring up the chart as a pdf file.  Bear with me as a I try different ways to express things in wordpress.  Suggestions are welcome.

OilPrices2012