#include <thermistor.h>
#include <PID_v1.h>
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735
#include <TM1637Display.h>
// Define the connections pins
#define CLK 11
#define DIO 12
TM1637Display display(CLK, DIO); // Create an instance of the TM1637Display
#define SelectorSW 4 // MODE PIN
#define SelectorDT 3 // ENCODER PIN
#define SelectorCLK 2 // CLK PIN
//INPUTS
#define HAB_CAL_PIN 8 // OUTPUT HEATING PIN
#define MAX_TEM_PIN 7 // INPUT INCREASE TEMP VALUE
#define MIN_TEM_PIN 6 // INPUT DECREASE TEMP VALUE
#define PIN_TERMISTOR A6 // NTC 3950 100K Pullut 4K7 TEMPERATURE PIN
//OUTPUTS
#define PIN_CALEFACCIO 9 // PWM PIN
#define PIN_LED_CAL 10 // HEATING LED PIN
// VARIABLES
bool PolsadorMotor=0,PolsadorSelector=0,dif3=0,dif4=0,MarxaMotor=0,MarxaCalefaccio=0,AlarmaRotura=0; //aa
double ValorAnterior=0,Constant=15,ValorCalculat=0;
int status;
int CorreccioTemperatura=3,RoturaCinta=0;
int VelocitatMotor=5000,Mode=0;
double Temperatura,SortidaCalefaccio=0,ConsignaCalefaccio=90; //Temperatura de inicio
char Temp [30], Consigna[30],Vel[30];
const int Retras=100, RetrasDisplay=1000;
long Temps=0, TempsDisplay=0;
float S, R;
long TempsPolsadorPremut = 0;
int Divisor = 1;
int ValorAnalogic;
int TempTermistor;
int currentStateCLK;
int lastStateCLK;
uint32_t start, stop;
int buzzerstate = 0;
long previousmillis = 0;
long intervalon = 500;
long intervaloff = 1500;
int c = 0;
// PID
thermistor therm1(PIN_TERMISTOR,0); // llibreria termistor
//#define TFT_CS A4 // TFT CS pin is connected to arduino pin A4
//#define TFT_RST -1 // TFT RST pin is connected to arduino pin A3
//#define TFT_DC A2 // TFT DC pin is connected to arduino pin A2
double agrKp=9,agrKi=0.0,agrKd=0;
double conKp=8,conKi=0.2,conKd=0;
PID pid(&ValorCalculat,&SortidaCalefaccio,&ConsignaCalefaccio, conKp, conKi, conKd,DIRECT);
// degree celsius symbol
const uint8_t celsius1[] = {
SEG_A | SEG_B | SEG_F | SEG_G // Degree symbol
};
void setup() {
pid.SetMode(AUTOMATIC);
pinMode(A3, OUTPUT); // ALARM
Serial.begin(9600);
Serial.println(__FILE__);
Serial.println();
Temperatura = therm1.analog2temp();
ValorCalculat=Temperatura;
ValorAnterior=Temperatura;
//attachInterrupt(0, LecturaSelector, CHANGE);
// PIN CONFIGURATION
pinMode(PIN_CALEFACCIO,OUTPUT);
pinMode(HAB_CAL_PIN,INPUT);
pinMode(MAX_TEM_PIN,INPUT);
pinMode(MIN_TEM_PIN,INPUT);
pinMode(PIN_LED_CAL,OUTPUT);
pinMode(SelectorCLK,INPUT);
pinMode(SelectorDT,INPUT);
pinMode(SelectorSW,INPUT);
lastStateCLK = digitalRead(SelectorCLK); // Read the initial state of CLK
setPWMPrescaler(PIN_CALEFACCIO, 1024);
display.setBrightness(5); // Set the display brightness (0-7)
}
void loop() {
Serial.print("\t Temperatura : ");
Serial.print(ValorCalculat);
Serial.print("\t Consigna : ");
Serial.print(ConsignaCalefaccio);
Serial.print("\t Sortida : ");
Serial.println(SortidaCalefaccio);
SeleccioEntrada();
//LecturaSelector();
LecturaTemperatura();
ControlCalefaccio();
Displaynumber();
modifyTemp();
//ControlMotor();
// ControlRotura();
//Main_tft();
}
// TEMPERATURE READING
void LecturaTemperatura()
{
if (millis() > Temps + Retras)
{
ValorAnalogic=analogRead(PIN_TERMISTOR);
Temperatura = therm1.analog2temp();
ValorCalculat=(ValorAnterior*((Constant - 1)/Constant)+(Temperatura/Constant));
ValorAnterior=ValorCalculat;
TempTermistor = ValorCalculat;
Temps = millis();
}
}
// TEMPERATURE CONTROL
void ControlCalefaccio ()
{
double gap = abs(ConsignaCalefaccio-Temperatura); //distance away from setpoint
if (gap < 40)
{ //we're close to setpoint, use conservative tuning parameters
pid.SetTunings(conKp, conKi, conKd);
}
else
{
//we're far from setpoint, use aggressive tuning parameters
pid.SetTunings(agrKp, agrKi, agrKd);
}
// Marxa calefaccio per polsador
if (digitalRead(HAB_CAL_PIN)& dif3==0)
{
MarxaCalefaccio=MarxaCalefaccio^1;
}
dif3=digitalRead(HAB_CAL_PIN);
if (MarxaCalefaccio==1)
{
pid.Compute();
if (SortidaCalefaccio<0) {SortidaCalefaccio=0;}
analogWrite(PIN_CALEFACCIO,SortidaCalefaccio);
digitalWrite(PIN_LED_CAL,HIGH);
//tft.drawXBitmap( 10, 20, IconaTemperatura,50,50, RED);
}
else
{
analogWrite(PIN_CALEFACCIO, 0);
SortidaCalefaccio = 0;
digitalWrite(PIN_LED_CAL,LOW);
//tft.drawXBitmap( 10, 20, IconaTemperatura,50,50, WHITE);
}
}
// MODE
void SeleccioEntrada ()
{
if (digitalRead(SelectorSW)==0 & PolsadorSelector==1)
{
if (Mode<2)
{
Mode=Mode+1;
}
else
{
Mode=0;
}
AlarmaRotura=LOW;
}
PolsadorSelector=digitalRead(SelectorSW);
if (PolsadorSelector==LOW)
{
Mode = Mode;
}
}
void Displaynumber() {
//display.clear(); // Clear the display
// Read the temperature as Celsius from the sensor
//int temp = dht.readTemperature();
// Display the temperature in Celsius
display.showNumberDec(ConsignaCalefaccio, false, 3, 0);
display.setSegments(celsius1, 1, 3);
//delay(1000);
}
void modifyTemp() {
if (digitalRead(MAX_TEM_PIN)==HIGH)
{
if (ConsignaCalefaccio==140){
ConsignaCalefaccio=90;
}
ConsignaCalefaccio=ConsignaCalefaccio+1;
delay(500);
}
if (digitalRead(MIN_TEM_PIN)==HIGH)
{
if (ConsignaCalefaccio<1){
ConsignaCalefaccio=1;
}
ConsignaCalefaccio=ConsignaCalefaccio-1;
delay(500);
}
}
void setPWMPrescaler(uint8_t pin, uint16_t prescale) {
byte mode;
if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
switch(prescale) {
case 1: mode = 0b001; break;
case 8: mode = 0b010; break;
case 64: mode = 0b011; break;
case 256: mode = 0b100; break;
case 1024: mode = 0b101; break;
default: return;
}
} else if(pin == 3 || pin == 11) {
switch(prescale) {
case 1: mode = 0b001; break;
case 8: mode = 0b010; break;
case 32: mode = 0b011; break;
case 64: mode = 0b100; break;
case 128: mode = 0b101; break;
case 256: mode = 0b110; break;
case 1024: mode = 0b111; break;
default: return;
}
}
if(pin==5 || pin==6) {
TCCR0B = TCCR0B & 0b11111000 | mode;
} else if (pin==9 || pin==10) {
TCCR1B = TCCR1B & 0b11111000 | mode;
} else if (pin==3 || pin==11) {
TCCR2B = TCCR2B & 0b11111000 | mode;
}
}