Salve a tutti, sto implementando un progettino che dovrà servirmi per controllare la temperatura di un carico da 200W in dc (elementi ceramici riscaldabili) e un secondo progetto, separato, che dovrà pilotare una resistenza da 2500W ac per mantenere una determinata temperatura di un liquido. Il codice che sto analizzando, preso in rete, è il seguente:
#include <PID_v1.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
#define pinData 11
#define SSR 3
#define led 13
#define tempoCiclo 1000
double Setpoint, Input, Output;
double Kp=100, Ki=0, Kd=0;
float temperatura=0;
unsigned long rispostaUltimaTemperatura = 0;
unsigned long lastPIDCalculation = 0;
float prevTemperature = -9999.0;
PID myPid(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);
OneWire OurWire(pinData);
DallasTemperature sensors(&OurWire);
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup() {
Setpoint = 30.0;
myPid.SetOutputLimits(0, 255);
myPid.SetSampleTime(tempoCiclo);
myPid.SetMode(AUTOMATIC);
Serial.begin(115200);
pinMode(SSR, OUTPUT);
digitalWrite(SSR, LOW);
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
sensors.begin();
lcd.begin(16, 2);
}
void loop()
{
if (millis() - rispostaUltimaTemperatura >= tempoCiclo) {
temperatura = sensors.getTempCByIndex(0);
Input = (double)temperatura;
myPid.Compute();
lastPIDCalculation=millis();
Serial.print(temperatura);
Serial.print(" , ");
Serial.println(Output/10);
sensors.requestTemperatures();
rispostaUltimaTemperatura = millis();
lcd.setCursor(0, 0);
lcd.print("t:");
lcd.setCursor(2, 0);
lcd.print(Input);
lcd.setCursor(8, 0);
lcd.print("sp:");
lcd.setCursor(11, 0);
lcd.print(Setpoint);
lcd.setCursor(0, 1);
lcd.print(Output);
}
control();
}
void control() {
if ((millis() <= (lastPIDCalculation + Output)) || (Output == tempoCiclo)) {
// Power ON
digitalWrite(SSR, HIGH);
digitalWrite(led, HIGH);
}
else {
// Power OFF
digitalWrite(SSR, LOW);
digitalWrite(led, LOW);
}
}
osservando l'uscita, al di là dei valori del pid ancora da stimare, ho notato che l'output effettivamente varia tra il minimo ed il massimo impostato, a seconda della variazione della temperatura rilevata. Ho però il problema di come gestire la fase di pilotaggio dei due carichi. Ho attualmente un ssr fotek (SSR-25DA):
ho letto su altri post che un ssr non può essere direttamente utilizzato per pilotare carichi in ac. Mi date qualche dritta per risolvere? grazie"