Buongiorno a tutti, sto riscontrando qualche problemino con questo relè ( https://www.amazon.it/gp/product/B07TWH7FWW/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1 ) che ho mantenuto nel progettino anche se è eccessivo, prima comandava una cella di peltier da 12v 24a ed era dimensionato, ora comanda un compressore ed è di molto sovradimensionato ma l'ho mantenuto lo stesso...
Comunque il problema è il seguente: praticamente ho un sensore di temperatura (ds18B20) che legge una temperatura, sopra una data temperatura avvia il relè che mi raffredda il liquido fino ad un delta che imposto. Con la cella di peltier non avevo problemi di lettura, con il compressore ogni tanto mi da delle letture sballate.
Esempio: temperatura impostata a 4 gradi, il relè stacca a 3,5 e riattacca sopra ai 4,5.
Ogni tanto capita che quando riattacca, alla successiva lettura esca un valore casuale (la lettura è data da un media di letture) inferiore ai 3,5 e stacca, alla successiva legge la giusta temperatura e il compressore va fino a che non deve staccare sotto i 3,5.
é una cosa abbastanza casuale....
Ora il il relè lo alimento direttamente da arduino, vorrei alimentarlo separatamente, la mia domanda è la seguente: semplicemente attacco la 5v di un alimentatore esterno e metto in comune i gnd o devo fare qualche altra cosa?
Di seguito il codice per rendervi conto di cosa deve fare:
```cpp
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 5
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
LiquidCrystal_I2C lcd(0x27, 16, 2);
int t0=4;
float temperature;
int counter=0;
float media[30];
float result=0;
int soglia=0;
int a=0;
String riga1= "ver 1.1";
String temp;
float delta=0.5;
void setup() {
Serial.begin(9600);
//Serial.print("t0=");
//Serial.println(t0);
lcd.begin();
lcd.backlight();
lcd.clear();
Serial.println("inizio");
pinMode(2, OUTPUT); //relè
pinMode(3, OUTPUT); //led rosso
pinMode(4, OUTPUT); //led verde
digitalWrite(2, LOW); //relè spento
digitalWrite(3, HIGH); //led rosso accesso power
digitalWrite(4, LOW); //led verde spento no freddo
sensors.begin();
EEPROM.put(a,t0);
Serial.print("t0=");
Serial.println(t0);
lcd.setCursor(0,0);
lcd.print(riga1);
lcd.setCursor(0,1);
lcd.print("t0=");
lcd.setCursor(4,1);
//temp=t0;
lcd.print(t0);
}
void loop() {
tasti();
raffreddamento();
}
void tasti (){
int plus= digitalRead(6);
if (plus==HIGH) {
t0=t0+1;
EEPROM.write(a, t0);
lcd.setCursor(4,1);
lcd.print(" ");
lcd.setCursor(4,1);
lcd.print(t0);
delay(500);
}
int minus=digitalRead(7);
if (minus==HIGH) {
t0=t0-1;
EEPROM.write(a, t0);
lcd.setCursor(4,1);
lcd.print(" ");
lcd.setCursor(4,1);
lcd.print(t0);
delay(500);
}
}
void printTemperature(String label, float value) {
if (value != DEVICE_DISCONNECTED_C) {
Serial.println(label + ": " + String(value) + "°C");
} else {
Serial.println("Impossibile rilevare la temperatura");
}
}
float raffreddamento() {
//Serial.println("entrato in raffreddamento");
sensors.requestTemperatures();
temperature = sensors.getTempCByIndex(0);
printTemperature("Temperature", temperature);
Serial.print("temperature= ");
Serial.println(temperature);
if (counter<30) {
media[counter]=temperature;
counter++;
}
else {
counter=0;
calcolaMedia(media);
}
delay(1000);
}
void calcolaMedia(float array[]) {
float somma=0;
for (int i=0; i<30; i++) {
somma=somma + array[i];
}
result=somma/30;
Serial.println("media temperatura = ");
Serial.println(result);
Serial.print("°C");
lcd.setCursor(8,1);
lcd.print("t1=");
lcd.setCursor(11,1);
lcd.print(" ");
lcd.setCursor(11,1);
lcd.print(result);
attiva(result);
}
int attiva(float value){
if (value >= (t0+delta)) {
//Serial.println("entrato ciclo true, soglia= ");
soglia=1;
//Serial.println(soglia);
}
if (value <= (t0-delta)) {
soglia=0;
//Serial.print("entrato ciclo false, soglia= ");
//Serial.println(soglia);
}
peltier();
}
void peltier() {
//Serial.print("valore sogliaControllo ");
//Serial.println(soglia);
if (soglia==1) {
digitalWrite(4,HIGH); //accensione led verde
digitalWrite(2,HIGH); //accensione peltier
//Serial.println("attivazione peltier");
}
else {
digitalWrite(4,LOW); //spegnimento led verde
digitalWrite(2,LOW); //peltier spenta
//Serial.println("disattivazione peltier");
}
}