Docx

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 9

/* Max6675 Module ==> Arduino

* CS ==> D10
* SO ==> D12
* SCK ==> D13
* Vcc ==> Vcc (5v)
* Gnd ==> Gnd */

//LCD config (i2c LCD screen, you need to install


the LiquidCrystal_I2C if you don't have it )
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3f,20,4); //sometimes
the adress is not 0x3f. Change to 0x27 if it dosn't
work.

/* i2c LCD Module ==> Arduino


* SCL ==> A5
* SDA ==> A4
* Vcc ==> Vcc (5v)
* Gnd ==> Gnd */

#include <SPI.h>
//We define the SPI pìns
#define MAX6675_CS 3
#define MAX6675_SO 2
#define MAX6675_SCK 4

//Pins
int PWM_pin = 11;

//Variables
float temperature_read = 0.0;
float set_temperature = 60;
float PID_error = 0;
float previous_error = 0;
float elapsedTime, Time, timePrev;
int PID_value = 0;

//PID constants
int kp = 9.1; int ki = 0.3; int kd = 1.8;
int PID_p = 0; int PID_i = 0; int PID_d = 0;

void setup() {
pinMode(PWM_pin,OUTPUT);
TCCR2B = TCCR2B & B11111000 |
B00000011; // pin 3 and 11 PWM frequency of
980.39 Hz
Time = millis();
lcd.init();
lcd.backlight();
}
void loop() {
// First we read the real value of temperature
temperature_read = readThermocouple();
//Next we calculate the error between the
setpoint and the real value
PID_error = set_temperature -
temperature_read;
//Calculate the P value
PID_p = kp * PID_error;
//Calculate the I value in a range on +-3
if(-3 < PID_error <3)
{
PID_i = PID_i + (ki * PID_error);
}

//For derivative we need real time to calculate


speed change rate
timePrev = Time; // the previous
time is stored before the actual time read
Time = millis(); // actual time
read
elapsedTime = (Time - timePrev) / 1000;
//Now we can calculate the D calue
PID_d = kd*((PID_error -
previous_error)/elapsedTime);
//Final total PID value is the sum of P + I + D
PID_value = PID_p + PID_i + PID_d;

//We define PWM range between 0 and 255


if(PID_value < 0)
{ PID_value = 0; }
if(PID_value > 255)
{ PID_value = 255; }
//Now we can write the PWM signal to the
mosfet on digital pin D3
analogWrite(PWM_pin,PID_value-255);
previous_error = PID_error; //Remember to
store the previous error for next loop.

delay(300);
//lcd.clear();

lcd.setCursor(0,2);
lcd.print("PID TEMP control");
lcd.setCursor(0,3);
lcd.print("S:");
lcd.setCursor(2,3);
lcd.print(set_temperature,1);
lcd.setCursor(9,3);
lcd.print("R:");
lcd.setCursor(11,3);
lcd.print(temperature_read,1);
}
double readThermocouple() {

uint16_t v;
pinMode(MAX6675_CS, OUTPUT);
pinMode(MAX6675_SO, INPUT);
pinMode(MAX6675_SCK, OUTPUT);

digitalWrite(MAX6675_CS, LOW);
delay(1);

// Read in 16 bits,
// 15 = 0 always
// 14..2 = 0.25 degree counts MSB First
// 2 = 1 if thermocouple is open circuit
// 1..0 = uninteresting status

v = shiftIn(MAX6675_SO, MAX6675_SCK,
MSBFIRST);
v <<= 8;
v |= shiftIn(MAX6675_SO, MAX6675_SCK,
MSBFIRST);

digitalWrite(MAX6675_CS, HIGH);
if (v & 0x4)
{
// Bit 2 indicates if the thermocouple is
disconnected
return NAN;
}

// The lower three bits (0,1,2) are discarded


status bits
v >>= 3;

// The remaining bits are the number of 0.25


degree (C) counts
return v*0.25;
}

You might also like