{ *Sensore Igrometro per irrigazione* }

(deleted)

Perché hai deciso di utilizzare elettrovalvole "analogiche"? per poter variare il flusso?
Spiega meglio il problema anche

Ciao! In realtà hai un idea del progetto nel senso generale ma non c'è un codice di partenza e neanche una domanda precisa!

Comunque per ogni tipo di sensore puoi trovare online esempi sul suo utilizzo, adesso se so come è fatto il codice di funzionamento di un sensore cambia poco usarne 5 al posto di uno.

In pratica se ho un sistema con una pompa, una valvola e un sensore "di cui puoi trovare esempi", se devo gestirne di più sarà lo stesso codice duplicato, cambieranno solo i nomi dei pin.

Spesso una cosa complessa non è altro che un insieme di cose più semplici, come nel tuo caso un uso di una valvola e un sensore ripetuto più volte.

(deleted)

(deleted)

Ciao,
l'ultimo codice che hai postato attiva pin digitali, quindi, se non hai elettrovalvole particolari, puoi usare quelli per N elettrovalvole. Ti ricordo che se ti servono più pin ci sono modi per aumentarli, ad es. con un multiplexer, ce ne sono che tengono anche i valori in uscita e non vanno rinfrescati di continuo, oppure con degli shift register.
Poi, dovrai prendere i segnali di uscita di questi componenti e amplificarli con dei transistor o mosfet, per poter erogare una corrente più elevata. Se non lo fai devi stare molto attento ai consumi perchè rischi di friggere arduino.

Il sensore di umidità, non ho capito esattamente quale hai, ma dovrebbe darti un valore da 0 a 1023 che in proporzione equivale ad una tensione da 0 a Vcc quindi i 5V di alimentazione.
Devi capire che valori restituisce quando rileva secco e quando umido e poi ti regoli in proporzione per le letture intermedie.
Ora non ricordo numeri, ma si fa presto a fare delle prove asciugando o bagnando il sensore. Se la mia memoria non mi inganna, potresti avere valori alti se rileva secco e bassi se rileva umidità. Nel mezzo dovrebbe essere abbastanza lineare come misura, quindi fatte due prove hai tutti i parametri per decifrare i risultati.

Hai già qualcosa in casa?
La pompa è una micro pompa?
Occhio che qui non si può parlare della 220 per regolamento, troppo pericolosa per lavorarci da dilettanti.
Se è una micro pompa, potresti usarne anche più di una per isole di irrigazione differenti, ognuna con la sua pompa, la sua vasca con la riserva d'acqua e le sue elettrovalvole.
Dubito che una micropompa possa avere una capacità tale da irrigare piante anche ad una certa distanza tra di loro, dipende sempre da cosa hai, comunque anche gestire più micropompe non è difficilissimo, basta replicare quello che si fa per una anche alle altre.

Se dai qualche dettaglio in più, magari si può essere più precisi. Occhio solo alla 220, no se poleeee!

ciao
Maurizio

La maggioranza dei progetti che ho visto in giro sono poco più che delle idee e usano come sensore quello economicissimo a forchetta.

L'unico che ho visto veramente serio era il progetto Vinduino, all'inizio nato come blog e che oggi è diventato un prodotto commerciale per cui i post originali mi sa che sono andati persi.

(deleted)

(deleted)

Il tuo programma è zeppo di delay(), hai una delay(10000) che vuol dire pausa di 10 secondi, TUTTO arduino bloccato per 10 secondi.
Finché usi i delay() non riuscirai a fare più cose in parallelo. Arduino non è un PC con un sistema operativo che permette di eseguire più cose in parallelo.

Eventualmente potresti usare un buzzer attivo, con un pin lo accendi/spegni. Non sono un elettronico, se ti interessa questa strada, qualcuno ti può dare delle dritte.

(deleted)

Ecco alcuni link utili su millis() prova a darci un'occhiata, se ti va.

Maurizio

(deleted)

Un delay() non si "converte".
Devi modificare la logica del programma.
Devi vedere lo sketch di esempio Blink, lo stampi e poi vedi lo sketch BlinkWithoutDelay e lo stampi.
e li metti a confronto. Vedrai che non c'è un modo per "sostituire" la riga delay(), bisogna cambiare la logica di come si programma.

Con millis il concetto è far flullare il loop più velore che puoi e ad ogni giro avere un test del tipo: è passato 1 secondo dall'ultima volta che ho fatto la mia operazione? se si la rieseguo, altrimenti passo oltre.
Devi solo salvarti il millis dell'ultima esecuzione per confrontare il nuovo millis con quello e vedere quando la differenza è maggiore di 1000.

Il link 2 che ho postato, se non ricordo male, fa un esempio semplice e molto chiaro.

Maurizio

(deleted)

Tu hai un tempo di 5000 millisecondi, il tuo delay(5000); , da levare.
Prendi il BlinkwithoutDelay. Tu metti un tempo di 5000 come interval invece di 1000.
E' un grosso if (millis...; nella parte che entra per vero, lui gestisce lo stato del led
e nella parte vera ci metti tutto il tuo codice gestione igrometro, dalla riga "// Igrometro"
alla riga con "delay (5000);" esclusa (la devi eliminare)
Così intanto abbiamo tolto un delay
Il fotodiodo invece mi pare lo puoi eseguire sempre

...qui le tue variabili e costanti
unsigned long previousMillis = 0;        // will store last time LED was updated
const unsigned long interval = 5000;           // interval at which to blink (milliseconds)
...qui metti il tuo attuale setup
void loop()
{ unsigned long currentMillis = millis();
  // qui lasci parte del fotodiodo
  // FotoDiodo
  valLumen = analogRead ( pinFotoDiodo );
  Serial.print("Sensore Crepuscolare :    ");  Serial.println( valLumen, DEC );
  if ( valLumen > limite_FotoDiodo )
  {  digitalWrite ( pinRelay_2, HIGH );
  }           // graffa che hai dimenticato nel tuo post precedente!!
  else
  { digitalWrite ( pinRelay_2, LOW );
  }
  // gestione igrometro ogni 5 secondi
  if (currentMillis - previousMillis >= interval) 
  { previousMillis = currentMillis;  // save the last time you blinked the LED
     // qui il tuo codice per igrometro, eseguito solo ogni interval millisecondi
  }
}

Da quel post del tuo codice poi NON considero neppure la tua funzione "void allarm()"
che messa poi prima della ultima graffa chiusa da errore in compilazione

Hai capito come accendere e spegnere un led con millis()?
Bene ora fai lampeggiare il led con intervalli di 5 secondi, cioè ogni 5 secondi lo accendi o se già acceso lo spegni.
Ora, nel loop, in coda a questo codice, metti un altro blocco di codice che, solo quando il led è acceso, scriva sulla seriale "LED acceso" una volta ogni secondo, ma quando si spegne il led smette, sempre utilizzando millis().

Maurizio

(deleted)

Dal punto di vista del software secondo me puoi fare poco.
analogRead() di Arduino è a 10 bit, legge i valori analogici del sensore da 0 a 1023 ma ci saranno di sicuro delle "zone morte" cioè non credo il sensore possa uscire con circa 0 o circa 1023.
Se necessiti di una lettura "migliore" penso hai bisogno di un sensore migliore.