Creazione box-serra per interno

Buongiorno o buonasera a chi leggerà questo post.

Vorrei realizzare una serra in un box di 1m x 0,5m x 0,5 che sia in grado di:

  • Rilevare temperatura e umidità (tramite SHT31);
  • Regolare la temperatura in un range di 15÷30°C (Raffreddare e riscaldare)

Apro questo post per confrontarmi sul sistema di regolazione della temperatura in quanto ho pensato a una cella di Peltier in quanto potrei regolarla in modo da ottenere entrambi i funzionamenti.
Vorrei sapere se disponete di idee migliori, ho utilizzato la funzione cerca e anche bazzicato nel web ma non trovo nulla di soddisfacente per il mio progetto.
Comanderei la cella tramite un ponte ad H che dovrò realizzare, perciò se non è troppo chiedere vostri consigli a riguardo per esempio che componenti adottare (MOS-FET o più semplicemente relè) tenendo conto che non ho ancora idea di che cella acquistare ma vorrei puntare a una cella da 12V avendo in possesso una batteria da 12V/7A.

Accetto consigli sulla realizzazione del ponte ad H e relativa componentistica di potenza, cosa mi consigliate?

Vi ringrazio anticipatamente per aver letto questo post e spero di essere stato esaustivo!

ciao
Necessiti anche di illuminazione?
Ti serve ventola per uniformare la temperatura e umidita' dell aria all interno
Potrebbe essere necesario usare procedure PID

Grazie per il tuo contributo al topic.
Attualmente non necessito di illuminazione, per quanto riguarda la programmazione ho già una bozza che pubblicherò non appena sarò al PC. Ho già implementato un P.I.D. che andrò a configurare quando il circuito sarà in funzione.

1 Like

escludi i rele danno disturbi

Se utilizzassi questo modulo BTS7960, pensi sarebbe una soluzione migliore visto il dissipatore incorporato?

non sembra male

Riguardo le celle di Peltier, considera che creano molto piu calore di quello che spostano, la ventilazione del lato "caldo" dovrebbe essere come minimo fra 5 e 6 volte la superfice di quello "freddo" come dissipatore (i sistemi commerciali in genere fanno fra 8 e 10 volte), quindi raffreddando disperdono nell'ambiente molto piu calore di quello che tolgono dalla serra, se fosse per esterno non avresti troppi problemi, ma se e' per interno la cosa va presa in considerazione.

Di quanti gradi effettivamente parliamo, come abbassamento di temperatura ? ... potrebbe essere compensata almeno parzialmente con un sisema ad evaporazione ?

Considera che essendo di ridotte dimensioni e adattando il tempo di coltura con il clima stagionale, ho stimato un delta tra temperatura esterna (t_outside) di 5°C rispetto alla temperatura interna (t?inside).

Ho la possibilità di inserire un tappeto riscaldante per terreni formato da una resistenza delle dimensioni di una vaschetta di gelato, non darà un grande contributo ma probabilmente non necessiterò di un utilizzo prolungato della cella di Peltier.

Pensando a questo elemento raffreddante potrei acquistare un elemento riscaldante PTC utilizzando per il solo raffreddamento la cella di Peltier.

#include <Wire.h>
#include <Adafruit_SHT31.h>
#include <LiquidCrystal_I2C.h>
#include <Time.h>

// pin per controllare il riscaldatore e il condizionatore
const int heaterPin = 9;
const int coolerPin = 10;
const int buttonUpPin = 2;
const int buttonDownPin = 3;

// temperatura interna desiderata e differenza di temperatura per attivare il riscaldamento/raffreddamento
int desiredTemp = 72; 
const int tempDiffThreshold = 2; 

// costante per il controllo PID
const double kp = 0.2;
const double ki = 0.1;
const double kd = 0.05;

// variabili per il controllo PID
double error, prevError, integral, derivative;

// variabili per il controllo dei tempi di attivazione
unsigned long heatingStartTime = 0;
unsigned long coolingStartTime = 0;

// oggetto per la lettura della temperatura e umidità
Adafruit_SHT31 sht31 = Adafruit_SHT31();

// oggetto per il display LCD
LiquidCrystal_I2C lcd(0x27, 20, 4);

void setup() {
    // imposta i pin di uscita per il riscaldatore e il condizionatore
    pinMode(heaterPin, OUTPUT);
    pinMode(coolerPin, OUTPUT);
    pinMode(buttonUpPin, INPUT);
    pinMode(buttonDownPin, INPUT);

    // inizializza il display LCD
    lcd.begin();
    lcd.clear();
    lcd.print("Initializing...");

    // inizializza la comunicazione I2C
    Wire.begin();

    // inizializza il sensore SHT31
    if (!sht31.begin(0x44)) {
        lcd.clear();
        lcd.print("Error initializing");
        while (1);
    }

    lcd.clear();
    lcd.print("Temperature:");
    lcd.setCursor(0, 1);
    lcd.print("Humidity:");
    lcd.setCursor(0, 2);
    lcd.print("Power: ");
    lcd.setCursor(0, 3);
    lcd.print("Status: ");
    }
    

    void loop() {
    // leggi la temperatura e l'umidità
    float temperature = sht31.readTemperature();
    float humidity = sht31.readHumidity();
    // visualizza la temperatura e l'umidità sullo schermo
    lcd.setCursor(12, 0);
    lcd.print(temperature);
    lcd.print((char)223);
    lcd.print("C ");
    lcd.setCursor(11, 1);
    lcd.print(humidity);
    lcd.print("% ");

    // leggi i tasti per la regolazione della temperatura desiderata
    int buttonUpState = digitalRead(buttonUpPin);
    int buttonDownState = digitalRead(buttonDownPin);

    if (buttonUpState == LOW) {
        desiredTemp++;
        delay(200);
    }
    if (buttonDownState == LOW) {
        desiredTemp--;
        delay(200);
    }

    // Calcola la differenza tra la temperatura desiderata e quella corrente
    int tempDiff = desiredTemp - temperature;

    // se la differenza di temperatura è maggiore del limite
    if (abs(tempDiff) > tempDiffThreshold) {
        // calcola l'errore per il controllo PID
        error = tempDiff;
        integral += error;
        derivative = error - prevError;
        prevError = error;

        // calcola la potenza di riscaldamento/raffreddamento necessaria utilizzando il controllo PID
        int power = kp * error + ki * integral + kd * derivative;
        power = constrain(power, -255, 255);

        // visualizza la potenza sullo schermo
        lcd.setCursor(7, 2);
        lcd.print(power);

        // modula l'uscita per riscaldare o raffreddare
        adjustOutput(power);
    } else {
        // la temperatura è stabile, spegni riscaldatore e condizionatore
        digitalWrite(heaterPin, LOW);
        digitalWrite(coolerPin, LOW);
        integral = 0;
        lcd.setCursor(7, 2);
        lcd.print(" ");
        }
        // aggiorna lo stato sullo schermo
        lcd.setCursor(8, 3);
        if (digitalRead(heaterPin) == HIGH) {
            lcd.print("Risc. ");
            lcd.print(getFormattedTime(heatingStartTime));
        } else if (digitalRead(coolerPin) == HIGH) {
            lcd.print("Raff. ");
            lcd.print(getFormattedTime(coolingStartTime));
        } else {
            lcd.print("       ");
        }

        delay(1000); // aspetta 1 secondo prima di controllare di nuovo la temperatura e i tasti
}

void adjustOutput(int power) {
    // utilizzare la potenza calcolata per regolare l'uscita del riscaldatore o del condizionatore
    // esempio:
    // se power > 0, attiva il riscaldatore con la potenza specificata
    // se power < 0, attiva il condizionatore con la potenza specificata (in modo negativo)
    // se power == 0, spegni riscaldatore e condizionatore
    if (power > 0) {
    if (digitalRead(heaterPin) == LOW) {
        heatingStartTime = millis();
    }
    analogWrite(heaterPin, power);
    digitalWrite(coolerPin, LOW);
    } else if (power < 0) {
    if (digitalRead(coolerPin) == LOW) {
        coolingStartTime = millis();
    }
    analogWrite(coolerPin, -power);
    digitalWrite(heaterPin, LOW);
    } else {
        digitalWrite(heaterPin, LOW);
        digitalWrite(coolerPin, LOW);
    }
}

// funzione per formattare il tempo di attivazione in hh:mm:ss
String getFormattedTime(unsigned long startTime) {
    unsigned long currentTime = millis();
    unsigned long elapsedTime = (currentTime - startTime) / 1000; // convert to seconds
    int hours = elapsedTime / 3600;
    int minutes = (elapsedTime % 3600) / 60;
    int seconds = elapsedTime % 60;
    String formattedTime = String(hours) + ":" + String(minutes) + ":" + String(seconds);
    return formattedTime;
}

Prova a considerare invece, come elemento riscaldatore, un piatto riscaldato per stampanti 3D ... si controllano facilmente con un MOSFET e sono ottimi per riscaldare piccoli ambienti :wink:

Guglielmo

Il solito problema dei venditori che scrivono ca...volate ... le celle di Peltier non sono "elementi raffreddanti", sono "pompedi calore", prendono il calore dal lato "freddo" e lo trasferiscono a forza a quello "caldo", e nel farlo generano altro calore ... per cui si, il dissipatorino piccolo si raffreddera', ma quello grosso si riscaldera' molto di piu.

Purtroppo, almeno per ora, ancora non esiste il magico componente che "produce il freddo", tocca arrangiarsi con le pompe di calore, che pero' spostano il calore all'esterno, per cui se l'ambiente e' caldo lo diventa ancora di piu, oppure con i sistemi ad evaporazione, che pero' aumentano l'umidita', e potrebbero aumentarla anche di molto (anche se, essendo una serra, potrebbe non essere troppo dannoso, dipende dal tipo di piante)

Curiosita', in che ambiente si trova ? ... perche' se fosse climatizzato, non avresti bisogno di raffreddare, ti basterebbe far circolare l'aria esterna ... peraltro 5 gradi non sono neppure critici, mentre il problema piu grosso potrebbe essere il mantenere il calore se le piante fossero tropicali e l'ambiente esterno alla serra freddo (ma quello sarebbe facile risolverlo, un riscaldatore a PTC davanti ad una ventolina e via)

Temo che la termodinamica dimostri che un tale componente sia impossibile

Ottima soluzione per scaldare anche il terreno (per roba critica tipo peperoncini-killer da mezzo milione di scoville :grin:), che vogliono caldo anche il terreno, non solo l'aria, ma prima la rivestirei con qualche mano abbondante di vernice protettiva, epossidica se possibile, perche' altrimenti le piste in rame fanno presto a sparire con l'umidita' del terreno.

Per l'aria probabilmente un riscaldatore a PTC per auto sarebbe migliore, tipo questi cosi qui o simili https://www.aliexpress.com/item/1005001833443975.html

Per quello parlavo di "magico componente" :grin: (oppure si assume un diavoletto di Maxwell, a trovarne ancora :grin:)

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.