Termostato dimmer instabile

Salve a tutti, sto realizzando un termostato dimmer per lampade alogene. Finora tutto bene, l'unico problema che ho è il seguente. Con gli if faccio accendere la lampada im pwm, più o meno a seconda della temperatura rilevata. Il problema è quando la T viene raggiunta si abbassa l'intensità (e qui tutto ok), appena questa scende qualche decimo di grado la lampada riaumenta, facendo così, la lampada continua ad aumentare e diminuire di continuo, ogni pochi secondi, appena cambia la T. Pensavo ad un delay, ma dopo questo mi "blocca" tutto, anche la lettura dei tasti ad esempio, se metto un delay di 60000 ms anche i tasti si bloccano per 1 minuto. Come potrei risolvere? Potete aiutarmi perfavore? Grazie.

ciao

David81:
... Potete aiutarmi perfavore? Grazie.

E secondo te come potremmo aiutarti se non abbiamo uno straccio di codica da poter controllare???

ciao
pippo72

Ciao, così vedi la retroazione della sonda di temperatura. Qual'è il problema (a parte la variazione di intensità luminosa) ?
Se metti dei delay il problema lo avrai comunque con, peggio, maggiori variazioni di temperatura.

Stefano

Non ho postato il codice perché non sono a casa e speravo nella possibilità di un comando diverso, ecco anche perché non pensavo servisse il codice. Tra poco lo posto.
Cam9500 grazie per la risposta. Si, in effetti col delay la temperatura sarà leggermente meno stabile, ma una differenza di 0.5-1 grado mi va benissimo. Provando a modificare la rivoluzione dei DS18B20 mi rimane sempre la maggiore (12) anche se la imposto a 8 o 9 e cioè una precisione di 0.06 gradi se non ricordo male e per me è esagerata. Col delay come dici ho una temperatura leggermente più instabile, ma non ho questo incremento-decremento di luce ogni pochi secondi.
Tra poco sono a casa e posto lo sketch. Vi chiedo di essere comprensivi visto che sono alle prime armi e ho fatto tutto provando e unendo vari esempi trovati sul web. Grazie.

Ecco qui il codice

#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 rtc;
//char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
/*-----( Declare Constants )-----*/
#define ONE_WIRE_BUS 2 /*-(Connect to Pin 2 )-*/
#define TEMPERATURE_PRECISION 8 // Sensor resolution

/*-----( Declare objects )-----*/
/* Set up a oneWire instance to communicate with any OneWire device*/
OneWire ourWire(ONE_WIRE_BUS);

/* Tell Dallas Temperature Library to use oneWire Library */
DallasTemperature sensors(&ourWire);



/*-----( Declare Variables )-----*/

int uscita1 = 9;
int uscita2 = 10;
float tempset0 =29; 
float tempset1 =29;

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 8);

void setup() {
  lcd.clear();
  #ifndef ESP8266
  while (!Serial); // for Leonardo/Micro/Zero
#endif
  Serial.begin(57600);
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

sensors.begin();
lcd.begin(20, 4);

}

void loop() {
  int sensorValue = analogRead(A0);
  // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
  float voltage = sensorValue * (5.0 / 1023.0);
  // print out the value you read:
  Serial.println(voltage);
  float newts0;
  float newts1;
 if(voltage<0.50)
 {
  tempset0 = tempset0+0.5;
 }
if((voltage>0.80) and (voltage<1.40))
 {
  tempset0 = tempset0-0.5;
 } 
 if((voltage>1.30)and(voltage<1.80))
 {
  tempset1 = tempset1+0.5;
 }
if((voltage>1.80)and(voltage<2.50))
 {
  tempset1 = tempset1-0.5;
 } 




sensors.requestTemperatures(); // Send the command to get temperatures



lcd.setCursor(0,0);
lcd.print("Temp set 1:  ");
lcd.print(tempset0);
lcd.setCursor(0,1);
lcd.print("Temp set 2:  ");
lcd.print(tempset1);


if(sensors.getTempCByIndex(0) <= tempset0-2.00)
{
  analogWrite(uscita1, 255);
  Serial.print("ON");
  delay(500);
 
}
if((sensors.getTempCByIndex(0) > tempset0-2.00) and (sensors.getTempCByIndex(0)  < tempset0))
{
  analogWrite(uscita1, 200);
  Serial.print("ON");
  delay(500);
 
}
if(sensors.getTempCByIndex(0) >= tempset0)
{
  analogWrite(uscita1, 130);
  Serial.print("OFF");
  delay(500);
 
}
if(sensors.getTempCByIndex(1) <= tempset1-2)
{
  analogWrite(uscita2, 255);
  Serial.print("ON");
  delay(500);

}
if((sensors.getTempCByIndex(1) > tempset1-2) and (sensors.getTempCByIndex(1)  < tempset1))
{
  analogWrite(uscita2, 200);
  Serial.print("ON");
  delay(500);

}
if(sensors.getTempCByIndex(1) >= tempset1)
{
  analogWrite(uscita2, 130);
  Serial.print("OFF");
  delay(500);
}
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
 
  lcd.setCursor(0, 2);
  lcd.print("T1:");
  lcd.setCursor(3,2);
  lcd.print(sensors.getTempCByIndex(0));
  lcd.setCursor(11,2);
  lcd.print("T2:");
  lcd.setCursor(14,2);
  lcd.print(sensors.getTempCByIndex(1));
  DateTime now = rtc.now();

  
  // set the cursor to column 0, line 2
   //(note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 3);
  lcd.print("Ora");
  lcd.setCursor(5,3);
  if(now.hour()<=9){
    lcd.print("0");
    lcd.setCursor(6,3);
    lcd.print(now.hour(), DEC);
  }
  else{
    lcd.print(now.hour(), DEC);
  }
  lcd.setCursor(7,3);
    lcd.print(':');
    lcd.setCursor(8,3);
  if(now.minute() <=9){
    lcd.print("0");
    lcd.setCursor(9,3);
    lcd.print(now.minute(), DEC);
    }
    else{
    lcd.setCursor(8,3);  
    lcd.print(now.minute(), DEC);
    }
}

Come piloti la lampada allogena?
Ciao Uwe

Uwe ho un regolatore AC230v pilotato in DC pwm

non ho letto il codice, ma da come descrivi il problema potresti provare a:

  • fare una media di un "tot" di temperature, così eviti inutili su e giù repentini se la temperatura non è stabile
  • fare un controllo per variare l'intensità della lampada solo se la variazione di temperatura e maggiore di un delta prefissato (esempio 1 grado)

Uwe ho un regolatore AC230v pilotato in DC pwm

Allora io il PID lo proverei, dovrebbe calzare a pennello.

Pid Resources

Ciao.

Esattamente come dice @MauroTec usa un PID, qui trovi una descrizione di cos'è un controllo PID, per la temperatura bastano anche solo i PI.

Dino

Scusate il ritardo nel rispondere. Vorrei semplicemente dire: WOW!!! Grazie mille per la dritta sul PID, è eccezionale! Ho avuto per ora modo solo di provarne al volo il funzionamento pratico tramite potenziometro e led (sono le 2:30 di notte dopo un turno stressante al lavoro e dovrei andare a dormire) dovrò ora adattarlo al mio sketch per il mio utilizzo, ma è comunque fantastico. Non lo conoscevo prima d'ora e lo trovo eccezionale. Grazie davvero per la dritta.

Non lo conoscevo prima d'ora e lo trovo eccezionale. Grazie davvero per la dritta.

Se solo vagamente hai mai sentito parlare di "controreazione" nei circuito analogici, bhe questo PID permette il controllo in controreazione di grandezze analogiche tramite microprocessore. In rete trovi molte info in merito al PID alcune complete e ben spiegate, ma comunque il mal di testa è quasi sempre assicurato.

Ciao.

Concordo per il mal di testa :smiley:
Una cosa ancora... si può utilizzare come input il segnale dei ds18b20 collegati con oneWire? Ho provato al volo ma, o ho sbagliato io, o il segnale non è compatibile, visto che con un input 0-5v funziona, con i ds18b20 il led (in output ho messo ora un led per provare) lampeggia in modo irregolare.

David81:
Salve a tutti, sto realizzando un termostato dimmer per lampade alogene. Finora tutto bene, l'unico problema che ho è il seguente. Con gli if faccio accendere la lampada im pwm, più o meno a seconda della temperatura rilevata. Il problema è quando la T viene raggiunta si abbassa l'intensità (e qui tutto ok), appena questa scende qualche decimo di grado la lampada riaumenta, facendo così, la lampada continua ad aumentare e diminuire di continuo, ogni pochi secondi, appena cambia la T. Pensavo ad un delay, ma dopo questo mi "blocca" tutto, anche la lettura dei tasti ad esempio, se metto un delay di 60000 ms anche i tasti si bloccano per 1 minuto. Come potrei risolvere? Potete aiutarmi perfavore? Grazie.

beh... qualsiasi termostato che di rispetti ha l'isteresi si "attacca" a una data temperatura e si stacca a un altra temperatura o meglio quando si raggiunge la temperatura voluta gli si aggiunge qualche decimo di grado o piu
via sotware