Essiccatore

Salve a tutti,
questo è il mio primo vero progetto, si tratta di un prototipo di essiccatore per legna da ardere.
In pratica su un contenitore costruito in legno (che simula una cella coibentata) viene applicato un riscaldatore ad aria che porta la temperatura interna a x gradi fino al raggiungimento di una soglia max prefissata, quindi si spegne e rimane in stand-by fino a che la temperatura non scende al di sotto di una soglia minima prefissata.
Nel frattempo col calore l’ umidità presente nella legna posta all’ interno del contenitore comincia ad evaporare fino a raggiungere una percentuale di umidità stabilita, parte quindi una ventola che estrae l’ aria umida e nel contempo si apre, per mezzo di un servomotore, uno sportello per fare entrare aria in modo che non si crei una depressione all’ interno della cella (per x secondi cioè per il tempo necessario ad estrarre tutta l’ aria umida presente).

E il ciclo ricomincia.
Uso Arduino Uno. Il sensore di umidità/temperatura è questo https://www.sunfounder.com/humiture-sensor-module.html
penso sia un DHT11
Il servo è quello dello starter kit
Per il riscaldatore uso un comune asciugacapelli.
La ventola devo ancora reperirla comunque va bene qualsiasi ventolina di recupero del diam. di circa 10 cm.

Spero di essere stato chiaro. Di seguito lo sketch che mi da qualche messaggio di errore.
Mi potete aiutare a capire dove sto sbagliando?
Grazie.

#include <Adafruit_Sensor.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);
#include <DHT.h>
#include <DHT_U.h>
#define DHTPIN 4     // Pin di Arduino dove è collegato il sensore
#define rele1 7       //  Pin di Arduino dove è collegato il relè 1-riscaldatore
#define rele2 8       //  Pin di Arduino dove è collegato il relè 2-ventola
float val_umid = 75.0 ;  // valore umidità a cui si attiva la ventola
float temp_max = 60.0 ;  // valore temperatura a cui si spegne il riscaldatore
float temp_min = 40.0 ;  // valore temperatura a cui si attiva il riscaldatore
#define DHTTYPE DHT11   // DHT 11 
DHT dht(DHTPIN, DHTTYPE);
#include <Servo.h>
Servo myServo;
int velocita = 50; // Un valore da 0 a 100 (da lento a veloce)

void setup() {
  lcd.begin(16, 2);
  pinMode(rele1, OUTPUT);
  pinMode(rele2, OUTPUT);
  dht.begin(); 
  digitalWrite(rele1, HIGH);
  digitalWrite(rele2, HIGH);
  myServo.attach(9);
  myServo.writeMicroseconds(1500); // Imposto il servo al centro
 }
void loop(){
delay(2000);
  float h = dht.readHumidity(); // Read Humidity 
  float t = dht.readTemperature(); // Read temperature as Celsius (the default)
  }
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Umidita': ");
  lcd.print(h);
  lcd.print(" %\t");
  lcd.setCursor(0, 1);
  lcd.print("Temperatura: ");
  lcd.print(t);
  lcd.print(" *C ");

  if (t <= temp_min ) {
    digitalWrite(rele1, LOW);
  }
  else if (t >= temp_max ) {
    digitalWrite(rele1, HIGH);
  }
  
  if (h >= val_umid )  {
    digitalWrite(rele2, LOW) ;  // Accende la ventola
    
     for (int n=0; n<45; n++) // Rotazione 45 gradi, un grado per volta
 {
  myservo.write(n); // Faccio muovere il servo di un grado 
    delay(calcolaVelocita()); // Imposto il ritardo prima del movimento
  }
  delay(15000); // aspetto 15 secondi
  { 
    digitalWrite(rele2, HIGH) ;  // Spegne la ventola
  }
   for (int n=45; n>0; n--) // Rotazione 45 gradi, un grado per volta
  {
    myservo.write(n); // Faccio muovere il servo di un grado 
    delay(calcolaVelocita()); // Imposto il ritardo prima del movimento
        
  int calcolaVelocita()
{
  return (map(velocita,0,100,120,20));
    }
  }
 }

I messaggi di errore:
Arduino:1.8.1 (Windows 10), Scheda:“Arduino/Genuino Uno”

Essiccatore_2:33: error: ‘lcd’ does not name a type

lcd.clear();

^

Essiccatore_2:34: error: ‘lcd’ does not name a type

lcd.setCursor(0, 0);

^

Essiccatore_2:35: error: ‘lcd’ does not name a type

lcd.print("Umidita’: ");

^

Essiccatore_2:36: error: ‘lcd’ does not name a type

lcd.print(h);

^

Essiccatore_2:37: error: ‘lcd’ does not name a type

lcd.print(" %\t");

^

Essiccatore_2:38: error: ‘lcd’ does not name a type

lcd.setCursor(0, 1);

^

Essiccatore_2:39: error: ‘lcd’ does not name a type

lcd.print("Temperatura: ");

^

Essiccatore_2:40: error: ‘lcd’ does not name a type

lcd.print(t);

^

Essiccatore_2:41: error: ‘lcd’ does not name a type

lcd.print(" *C ");

^

Essiccatore_2:43: error: expected unqualified-id before ‘if’

if (t <= temp_min ) {

^

Essiccatore_2:46: error: expected unqualified-id before ‘else’

else if (t >= temp_max ) {

^

Essiccatore_2:50: error: expected unqualified-id before ‘if’

if (h >= val_umid ) {

^

exit status 1
‘lcd’ does not name a type

Questo report potrebbe essere più ricco di informazioni abilitando l’opzione
“Mostra un output dettagliato durante la compilazione”
in “File → Impostazioni”

Ti da tutta quella schiera di errori perché alla riga 33 hai chiuso la graffa del loop. Inoltre anche nel restante codice le graffe di apertura e chiusura sono messe un po' alla casaccio e sicuramente darà altri errori in compilazione. La graffa alla riga 33 eliminala e sei a posto, per le altre sicuramente ti mancano tutte le graffe di chiusura dei vari for, insomma il codice va tutto risistemato, prova a ricontrolalre tutte le graffe dei vari for ed if e mano a mano gli errori spariranno

Grazie Fab ora provo a sistemarle...ma per quanto riguarda il codice ti sembra corretto?

Come logica di base direi di si, intanto fai funzionare il tutto così com'è poi al massimo si ottimizza in seguito
Es. se l'umidità supera di molto la soglia succede che accendi la ventola e apri la porta, aspetti 15 secondi poi chiudi e spegni la ventola, il loop riparte e l'umidità è ancora sopra soglia (essendo prima molto sopra la soglia) quindi accendi apri aspetti chiudi e spegni, potrebbe ancora essere sopra soglia e il ciclo dovrebbe ripetersi.
Come detto fallo funzionare che poi si ottimizza (Es. ventola e porta aperta finché l'umidità non rientra nei parametri) sulla falsa riga di quel che hai fatto con la temperatura.

Ho sistemato il codice e verificato, adesso è OK! L' ho anche provato su bredboard e funziona. Per quanto riguarda il rilevamento dell' umidità penso abbia ragione tu, dovrò fare come per la temperatura, perché ora che il sensore rileva l' umidità, 15 sec. sono pochi, oppure devo aumentare il tempo di funzionamento della ventola.

A proposito di sensore leggevo che il DHT11 è un modello economico e impreciso; mi conviene acquistare per pochi euro in più il DHT22?

Grazie.

Flavi71:
A proposito di sensore leggevo che il DHT11 è un modello economico e impreciso; mi conviene acquistare per pochi euro in più il DHT22?

Grazie.

Lascia stare i DHT11 che sono una vera ciofeca, opta sicuramente per il DHT22, considera che in passato altri utenti hanno segnalato che questa classe di sensori sopra una certa soglia di umidità perdono efficacia e/o si degradano alla velocità di un ghiacciolo al sole. Ora non so di che tassi di umidità stiamo parlando ma potresti valutare se sul mercato ci sono sensori umidità più resistenti a costi non folli (io non so consigliarti) e valutare se conviene usare un sensore solo temperatura (Es. DS18B20) ed uno solo umidità

Ma alla fine invece di usare N sensori, perché non ne usate uno che fa tutto e che, se sommate i vari costi, non è che siete lontanissimi ? Esempio il BME280 che da umidità, temperatura e pressione il tutto su un unico bus I2C ... :slight_smile:

Guglielmo

Grazie Guglielmo, comunque per quello che devo fare io è più che sufficiente il DHT22, anche perché non ho la necessità di rilevare la pressione.

Piuttosto volevo chiedervi un altra cosa: nel progetto essiccatore ho previsto un modulo a 2 relè che andranno a comandare la ventola e il riscaldatore; alla fiera dell’ elettronica mi hanno propinato una schedina con 2 relè ma a 12V (Songle SRD-12VDC-SL-C). Attenzione: quello dell’ immagine allegata è a 5V ma io ho la versione a 12V!

A cosa serve il jumper JD-VCC VCC GND?

Posso comandarli con arduino o devo comprare un modulo relè 5V?

modulo-2rele songle.jpg