Dear all,
I’m working on a project to control the temperature in my BBQ a Webber and or a reverse flow smoker.
With a max6675, PID, PWM output on a fan and U8glib driver for the display ssd 1306.
Ive managed to compile a sketch and so far it shows me the temperature reading and through the plotter i can see that my PID is doing something.
when i attach my fan, the darn thing is going full speed and when reaching the setpoint it is still going 100% of the speed.
Also the PID is like a PWM signal giong up and down, see pic.
Can somebody help me on this project? The sketch is taking approx 80% of memory.
Also please find attached a picture of the plotter and of course the sketch.
Thanks in advance…
sketch_jul12_BBQ_TEMP_CONTROL_PID.ino (3.24 KB)
The attached code where everyone can see it. You’re welcome.
// Add libraries
#include "U8glib.h"
#include <SPI.h>
#include <Wire.h>
#include "max6675.h"
#include <PID_v1.h>
//Definitions
#define FAN 3 // Output pin for fan
boolean centigrade = true; //Un REM this for Centigrade and REM out line below
//Setup PID
double Setpoint, Input, Output; //I/O for PID
double aggKp=20, aggKi=0.2, aggKd=1; //original: aggKp=4, aggKi=0.2, aggKd=1, Aggressive Turning,50,20,20
double consKp=10, consKi=0.1, consKd=0.25; //original consKp=1, consKi=0.05, consKd=0.25, Conservative Turning,20,10,10
PID myPID(&Input, &Output, &Setpoint, consKp, consKi, consKd, DIRECT); //Initialize PID
//setup u8g object
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // I2C
//
double max = 215; // maximum temperature
double min = -215; // minimum temperature
float currentTemp = 0.00;
String thisTemp = "";
int maxTemp = 0; // maximum temperature reached
int minTemp = 0; // minimum temperature reached
int pad = 0;
//
// Thermocouple MAX 6675
//
int thermoDO = 8;
int thermoCS = 9;
int thermoCLK = 10;
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
//
void draw(void) {
u8g.setFont(u8g_font_profont12);
u8g.drawStr(20,10, "BBQ TEMP");
u8g.setFont(u8g_font_profont12);
u8g.setFont(u8g_font_profont29);
if(currentTemp > 99){pad = 2;}
if(currentTemp > 9 && currentTemp < 100){pad = 10;}
if(currentTemp < 10){pad = 18;}
thisTemp = String(currentTemp);
if(centigrade){
thisTemp = thisTemp + "\260C";
}
else{
thisTemp = thisTemp + "\260F";
}
const char* newDispC = (const char*) thisTemp.c_str();
u8g.drawStr(pad,50, newDispC);
}
void setup(void) {
Serial.begin(9600);
Serial.println("Start");
//Temperature Setup
//(centigrade)
currentTemp = thermocouple.readCelsius();
minTemp = int(thermocouple.readCelsius());
maxTemp = int(thermocouple.readCelsius());
Setpoint = 124; //Inintialize desired Temperature in Deg C
//PID Setup
myPID.SetMode(AUTOMATIC);
//TCCR2B = TCCR2B & 0b11111000 | 0x02; //adjust the PWM Frequency, note: this changes timing like delay() Gerd, dit is de PWM timer. Kun jij checken of deze goed is voor 21Khz-25Khz voor een fan?
}
void loop(void) {
currentTemp = 0;
for(int f = 0; f <25; f++){
if(centigrade){
currentTemp = thermocouple.readCelsius() + currentTemp;
}
{
//Get temperature and give it to the PID input
thermocouple.readCelsius();
Input=thermocouple.readCelsius();
//Compute PID value
double gap = abs(Setpoint-Input); //distance away from setpoint
if(gap < 15)
{
//Close to Setpoint, be conservative
myPID.SetTunings(consKp, consKi, consKd);
}
else
{
//Far from Setpoint, be aggresive
myPID.SetTunings(aggKp, aggKi, aggKd);
}
myPID.Compute();
Serial.print(" ");
Serial.print(Input);
Serial.print(" ");
Serial.println(Output);
analogWrite(FAN,Output);
}
}
currentTemp = currentTemp/25; // averages out 25 readings
// picture loop
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );
// rebuild the picture after some delay
delay(200);
}