Feed test

Hopper with pellets

The chain arrived from McMaster-Carr last night so today a friend and I hooked up the drive motor for the auger and we did a timing test.  The assumption is the pellets will yeild approx. 5000 BTU’s per pound.  So after running the auger for a minute we weighed the sample and with the weight we calculated the feed rate at approx. 30 secs every 2.5 minutes.  We will have to adjust the rate as needed for the test.  I got a great email from a friend with some useful suggestions for the code which is still having issues.  I incorporated all the suggestions  and look forward to more useful suggestions.

Auger Motor


Added hopper and auger feed motor, LCD problems still

Yesterday I added a hopper to the auger feed and mounted the auger motor.  By depending on my memory I found that I did not have any of  the #35 chain I thought I had and so I had to order some from McMaster-Carr.  Their website is the best I have found and their service is great, so I should have the chain on Tuesday or Wednesday and a test burn is planned for then.  I need to finish up a few minor issues on the boiler, and then it is time for a water test for leaks on the KBS coatings job.    The LCD is now working better I no longer have the garbled characters, however I am finding that the thermister readings go to zero on the display, but again not in the Arduino loop.

At this point I need to finish the boiler ash clean out door, weld up a hole where the tank strap wore through the tank when it was mounted on the truck, line the inside with fire brick, and hook up a removable chimney flange, make the sensor wells and hook up the plumbing, sounds like a lot, but in reality is probably only two days work.  The weather looks mild for this next week but it is really time to finish up and make the boiler work.  I have one other major project in the shop which I need to finish but when that’s complete the decks should be cleared for design of experiments on this boiler, starting work on the next iteration and PLOWING!

If anyone understands the issues with the LCD better than me, please let me know, since it is frustrating to experiment until it works instead of understanding the issue thoroughly.  Here’s the code.

/*
Circulator pump controller

This code turns a circulator pump on by closing a relay, simulating a thermostat.
A thermistor in the solar storage tank measures the temperature and if it is below a certain value
then the relay closes, the temperature of the tank is displayed to a LCD as well as the outside temperature
on the third line of the display the state of the circulator pump is listed. The program smooths the data from the
solar tank to avoid relay chatter, and include a RTC to decide what time of day the heat should be on for the hot
water heating. The time that is given to the RTC comes from the computer so as soon as possible after compiling upload
to the Arduino to make the time as accurate as possible.  The time should be within a minute which seems close enough for
my purposes.

The two thermistors are attached to analog pins 0 and 1, the relay pin is digital pin 8 and the LCD pins are listed below
The Real time clock SDA pin is attached to analog 4, the RTC SCL pin is attached to analog pin 5

The circuit:
Inputs
* Thermister Solar Store, Analog in 0
* Thermister Outside Temp, Analog in 1
* RTC SDA, Analog pin 4
* RTC SCL, Analog pin 5
Outputs
* Relay, Digital pin 8
* LCD Pins Date 2,3,4,5
* LCD Pins RW/E Pins 11,12

Created 11/14/11
Michael Clark

http://www.frugaltinker.wordpress.com

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

//define function to calculate the temperature in fahrenheit for Analog pin 0
double ThermisterTank(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
//define function to calculate the temp in fahrenheit for analog pin 1
double ThermisterOut(int RawADC1) {//beginning of function
double Temp;
Temp = log(((10240000/RawADC1) – 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

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  // initialize the lcd with the numbers of the interface pins
//char buffer[5];//gobetwino example

//int count;   // declaring an integer for count
int Solar_Relay = 1;     // init relay toggle to off.
#define Solar_Relay  8   // Arduino Digital I/O pin number 8
// Define the number of samples to keep track of.  The higher the number,
// the more the readings will be smoothed, but the slower the output will
// respond to the input.  Using a constant rather than a normal variable lets
// use this value to determine the size of the readings array.

//smoothing variables for Thermal storage
const int TSTnum=10; //Thermal Storage readings array
int TSTtemptotal=0; // Thermal Storage tank temperature
int TSTtempaverage=0;// Thermal Storage tank average
int TSTarray[TSTnum]; //Thermal Storage reading array
int index=0;  //index for Thermal storage array
int count=0; //initial count for average
//smoothing variables for Outside temp
const int Outnum=10; //Outside temperature reading array
int OutTotal=0; //declare variable and set to 0 for outside temp total
int OutAverage=0; //declare integer variable and set to 0
int Outarray[Outnum]; //decleare array for outside temps
int index1=0; //index for outside temp array
int count1=0; //initial count for average
//section for time keeping
int hour;
int minute;
int pmhour;
int lcdcount =0;

int Outsidetemp;
int test;

RTC_DS1307 RTC;

void setup()
{//Begin Setup section
Serial.begin(9600); // initiate serial communication
lcd.begin(20, 4);// set up the LCD’s number of rows and columns:
lcd.clear();
delay(75);
lcd.setCursor(0, 0);// set the cursor to column 0, line 0
delay(75);
lcd.print(“Solar   Outside”);// Print a message to the LCD.
delay(75);
digitalWrite(Solar_Relay,1); //turn circulator pin off
pinMode(Solar_Relay, OUTPUT); //Arduino digital pin 8 output
Wire.begin();
RTC.begin();
RTC.adjust(DateTime(__DATE__, __TIME__));
// initialize all the readings to 0:
for (int thisReading = 0; thisReading < TSTnum; thisReading++)
TSTarray[thisReading] = 0;
for (int thisReading = 0; thisReading < Outnum; thisReading++)
Outarray[thisReading] = 0;
} //End setup section

void loop()
{//Begin Loop section
//Thermal storage tank temperature smoothing section
TSTtemptotal=TSTtemptotal-TSTarray[index];  // remove reading from array
TSTarray[index]=int(ThermisterTank(analogRead(0)));
TSTtemptotal=TSTtemptotal+TSTarray[index];
index=index+1;
count=count+1;
if (index>=TSTnum)
{//start if section
index=0;
}//end if section
if (count<=TSTnum)
{//start if section
TSTtempaverage=TSTtemptotal/count;
} //end if section
else
{//start else section
TSTtempaverage=TSTtemptotal/TSTnum;
}//end else section
//end Thermal storage tank smoothing section
//outside temperature smoothing section
OutTotal=OutTotal-Outarray[index1]; //remove reading from array
Outarray[index1]=int(ThermisterOut(analogRead(1)));  //get the Outside temperature reading
OutTotal=OutTotal+Outarray[index1];
index1=index1+1;
count1=count1+1;
if (index1>=Outnum)
{//start if section
index1=0;
} //end if section

if (count1<=Outnum)
{//start if section
OutAverage=OutTotal/count1;
}//end if section
else
{//start else section
OutAverage=OutTotal/Outnum;
}//end else section
//end outside temp smoothing section

/*
Start relay on/off section, want circulator pump to turn on if the following conditions are true, tank temperature is
below 120°F and the time is between 4pm and 9pm.  All other times the tank temperature can float.  Note: Three conditions can happen here
1) not in the time frame, circulator off, this is the else section to the initial time check 2) you are within the time constraints and are below
or above the setpoints, turn circulator on, and 3) you are within the time settings and in between the temp settings, leave circulator off.
*/
if ((hour>=16) and (hour<21)) //condition 1
{//start if section
//this section turns on the relay to control the thermostat wire to run the circulator pump to heat water
//if the temperature of the thermal storage tank is below 100°F
if (TSTtempaverage < 120) //change this temp if you want to change the lower limit
{   //code within brackets applies if above condition is true
digitalWrite(Solar_Relay, 0);    // turns Relay On
} //end of the if true section
if (TSTtempaverage >125) // change this temp if you want to change the upper limit
{  //code within brackets applies if above conditions are true
digitalWrite(Solar_Relay, 1); //Turns relay off
} //end of the if true section
}//end if section
else //not between the hours above
{//begin else section
digitalWrite(Solar_Relay, 1); //Turns relay off
}//end else section

if (lcdcount>=10)
{// start if section

//This section prints the thermistor readings to the LCD
lcdcount=0;
//Serial.print(lcdcount);
lcd.clear();
delay(75);
lcd.noAutoscroll();
delay(75);
lcd.setCursor(0, 0);// set the cursor to column 0, line 0
delay(75);
lcd.print(”                    “); //clear line
delay(75);
lcd.setCursor(0,0); //reset cursor
delay(75);
lcd.print(”                    “);
delay(75);
lcd.setCursor(0,0);
delay(75);
lcd.print(“Solar   Outside”);// Print a message to the LCD.
//Serial.print (TSTtempaverage);
//Serial.print (OutAverage);
lcd.setCursor(0,1);
delay(75);
lcd.print(”                    “);
delay(75);
lcd.setCursor(0, 1);// set the cursor to column 1, line 1, line 1 is the 2nd row
delay(75);
lcd.print(TSTtempaverage); //print to the lcd should be the Solar Store temp if thermistor is hooked up properly
delay(75);
lcd.setCursor(8, 1);// set the cursor to column 1, line 1, line 1 is the 2nd row
delay(75);
lcd.print(OutAverage); //print to the lcd should be the Solar Store temp if thermistor is hooked up properly
delay(75);
//end lcd printing section
//Time section, gets and displays the time
DateTime now = RTC.now();
hour=now.hour(),DEC;     //get the hour from the RTC chip
Serial.println(hour);
minute=now.minute(),DEC; //get the minute from the RTC chip
Serial.println(minute);
//changes from 24 hour time to AM, PM
lcd.setCursor(0,2);
delay(75);
lcd.print(”                    “);
delay(75);
if (hour>=13) //PM Section
{//start if section
pmhour=hour-12;
lcd.setCursor(0,2);      //set cursor to the 1st column, 4th row where the time will be displayed
delay(75);
lcd.print (pmhour);
delay(75);
lcd.print(‘:’); // print :
delay(75);
if (minute<10)//adds a “0” if the time is single digit
{//start if section
lcd.print(“0″);
delay(75);
}//end if section
lcd.print(minute);
delay(75);
lcd.print(” PM”);
delay(75);
}//end if section
if (hour<13) //AM Section
{//start if section
lcd.setCursor(0,2);      //set cursor to the 1st column, 4th row where the time will be displayed
delay(75);
lcd.print (hour);
delay(75);
lcd.print (“:”);
delay(75);
if (minute<10)//adds a “0” if the time is single digit
{//start if section
lcd.print(“0″);
delay(75);
}//end if section
lcd.print(minute);
delay(75);
if (hour>=12)
{ //start if section
lcd.print (” PM”);
delay(75);
}// end if section
if (hour<12)
{// start if section
lcd.print(” AM”);
delay(75);
} //end if section
}//end if section
//End time section

//checks condition and writes accordingly
lcd.setCursor(0,3);
delay(75);
lcd.print(”                    “);
delay(75);
test=digitalRead(Solar_Relay);// prints the state of the circulator if in the middle ground of temp
if (test==1)
{// start if section
lcd.setCursor(0,3);              //sets cursor to column 1, line 3
delay(75);
lcd.print(“Circulator Off”); //prints “Circulator Off to lcd line 3
delay(75);
}//end if section
if (test==0)
{//start if section
lcd.setCursor(0,3);              //sets cursor to column 1, line 3
delay(75);
lcd.print(“Circulator On “);      //prints circulator on to lcd line 3
}// end if section
//End Relay on/off section
}//end if section
lcdcount=lcdcount+1;
delay(1500);
//Start Gobetweeno Data collection section
// lcd.setCursor(6, 3);// set the cursor to column 8, line 4, line 3 is the 4th row
// lcd.print(millis()/10000);// print the number of seconds since reset:
// if (count == 30)
//{  //does everything within the brackets section if the statement is true goes on otherwise
//  Serial.print(“#S|LOGTEST|[“);//if gobetwino is running this will log the data
//Serial.print(itoa((int(ThermisterTank(analogRead(0)))),buffer, 10));//sends data to file for inside temp
// Serial.print(“,”);// comma to delimit the data between inside and outside temps
// Serial.print(itoa((int(ThermisterOut(analogRead(1)))),buffer, 10));//collects outside temp in file
// Serial.println(“]#”);//gobetino command ending
//   count = 0;
//} //end of the if true section
//   count = (count + 1);
// Serial.println (count); //display count on the com monitor window

//End Gobetweeno data collection section

}//End loop section


LCD issues

After running the circulator controller for several days now,  after 4-5 hours, sometimes more, sometimes less the LCD seems to start printing garbage characters.  I have tried several different things to get rid of this but have not done so yet.  My latest attempt to get the program to be stable is to add more delay into the program to allow the LCD more time to work.  After reading the LCD manual it seems that this may be an issue and I will keep my fingers crossed however it appears that this may require a better understanding of the LCD and the programming language requiring a bit more studying.   The Arduino and the program are both running correctly in the background and we are enjoying hot showers, the relays come on and shut off at the correct time, all seems to be working fine with the exception of the LCD display, I have switched out the LCD with another of the same brand and type but I think it must just be getting some bad data and not erasing it.  Any suggestions would be helpful.  Sorry about the picture quality, tough to get a good picture of the display.

Garbled display


Circulator controller now works!

The Arduino thermostat/circulator controller has now been tested and works, I bought an Adafruit DS1307 RTC and am now displaying the time on a 20x4LCD display.  The relay board has been hooked up and now turns the circulator on or off according the time and temperature.  The circulator pumps hot water from the boiler through the second coil in the solar thermal storage tank to supplement any heat that may be required due to an inadequate solar collection day.   While the electronics now work nicely, the next step will be do put all the components in a neat case so that the project can be finished and mounted.  Let me know if you would like a copy of the code or have any questions.