//**************************************************************////////////////
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
unsigned long tempo_anterior1 = 0; // Variável para armazenar o tempo da última
unsigned long tempo_anterior2 = 0; // Variável para armazenar o tempo da última
double erro = 0;
double temp = 0;
float controle_PWM = 0;
double P = 0 ;
double I = 0 ;
double D = 0 ;
double PID = 0.0;
float setpoint = 37.7;
#define PWM_0 16 // pino saída PWM aquecimento
// GPIO onde o DS18B20 está conectado
const int OneWireBus = 4;
// Configure uma instância oneWire para se comunicar com qualquer dispositivo OneWire
OneWire oneWire(OneWireBus);
// Passe nossa referência oneWire para o sensor de temperatura Dallas
DallasTemperature sensors(&oneWire);
// Config. o endereço I2C LCD para 0x27 com 16 caracteres e 2 linhas
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup()
{
// Inicia o Serial Monitor
Serial.begin(115200);
// Inicia o DS18B20 sensor
sensors.begin();
//Inicia o lcd
lcd.init();
//Ativa o backlight do lcd
lcd.backlight();
pinMode(PWM_0, OUTPUT);
lcd.setCursor(3, 0);
lcd.print("INICIANDO");
delay(5000);
lcd.print(" ");
}
void loop()
{
unsigned long tempo_atual = millis();
if (tempo_atual - tempo_anterior2 >= 1000)
{
tempo_anterior2 = tempo_atual;
//imprime_serial();
// Publica_dados();
calcula_PID();
// imprime_LCD();
}
imprime_LCD();
//Exibe a temperatura no Serial Monitor
Serial.print("Temperatura: ");
Serial.print(temp);
Serial.print("°C");
// Serial.print("\t");
Serial.println ();
}
void calcula_PID()
{
sensors.requestTemperatures(); /* Envia o comando para leitura da temperatura */
temp = (sensors.getTempCByIndex(0));
double kp = 24;
double ki = 0.013;
erro = setpoint - temp;
P = erro * kp;
I += erro * ki; // * delta_tempo;
//D = ((ultima_temp - temp) * kd );// delta_tempo;
PID = P + I + D;
controle_PWM = (PID);
if (controle_PWM >= 255)
{
controle_PWM = 255;
}
if (controle_PWM <= 0)
{
controle_PWM = 0;
}
analogWrite(PWM_0, controle_PWM);
if (temp >= 38)
{
controle_PWM = 0;
}
}
////////////////////////////////////////////////////////
void imprime_LCD()
{
//lcd.clear();
unsigned long tempo_atual = millis();
if (tempo_atual - tempo_anterior1 > 2000)
{
tempo_anterior1 = tempo_atual;
lcd.setCursor(0, 1);
lcd.print("TEMP");
lcd.setCursor(9, 1);
lcd.print(temp, 1);
lcd.setCursor(13, 1);
lcd.print((char)223);
lcd.setCursor(14, 1);
lcd.print("C");
lcd.setCursor(3, 0);
lcd.print(F( "NASCEDOURO" ));
}
}