Idroponica una guida completa (con programmazione fatta da una I.A.)

Buongiorno,

Da anni cerco un descrizione su come sviluppare un sistema autoregolato/autogestito da arduino per l'idroponica.
Con il tempo ho letto varie soluzioni ma tutte fastidiosamente incomplete.

Dunque volevo chiedervi un parere per concludere questo dilemma e finalmente completare il tutto.

Vi spiego:

i 3 parametri fondamentali sono:

  • umidità
  • TDS
  • PH

1-UMIDITà- per questo parametro basta azionare un umidificatore (un on/off alla alimentazione USB) con un sensore di umidità, quest'ultimo da acquistare su vostro consiglio.
2-TDS- il sensore per capirci, NON PRESENTE SUL SITO UFFICIALE, è questo:

Dovrebbe azionare DUE POME DOSOMETRICHE (Model G328, U: 13v)
in contemporanea che immettono i nutrienti.
Ma deve controllare dopo aver messo "x" quantita aspettare un pò che la soluzione si omogenizzi, e ricontrollare il parametro.

3-PH- in questo caso il parametro si può solo alzare. Quindi stesso discorso di prima ma al contrario, e cosa più complicata, in questo caso il sensore a disposizione più facilmente reperibile è ANALOGICO

Ecco qui...

Ora ho comprato arduino mega, 4 relè e un sensore per umidità/temperatura.

ho provato a chiedere a gpt-3 di fare la programmazione (tanto per curiosità per lo più) ed il risultato è stato questo:


//Inizializzazione dei pin
int relay1 = 2;
int relay2 = 3;
int relay3 = 4;
int dht11Pin = 5;
int phPin = 6;

//Inizializzazione delle variabili
float umidita;
float tds;
float ph;
float sogliaUmidita = 50; //Soglia di umidità desiderata
float sogliaTds = 500; //Soglia di TDS desiderata
float sogliaPh = 7.0; //Soglia di PH desiderata
unsigned long timer;  //Variabile per la gestione del timer 
unsigned long interval = 5000;  //Intervallo di tempo tra le letture dei sensori (5 secondi) 

void setup() { 
  //Impostazione dei pin come output 
  pinMode(relay1, OUTPUT); 
  pinMode(relay2, OUTPUT); 
  pinMode(relay3, OUTPUT); 

  //Impostazione della seriale per la comunicazione con il computer 
  Serial.begin(9600); 

  //Impostazione del potenziometro per la regolazione della soglia di umidità, TDS e PH 
  analogWrite(dht11Pin, sogliaUmidita); 
  analogWrite(phPin, sogliaTds);  

  //Inizializzazione del timer  
  timer = millis();  
}  

 void loop() {  

   //Controllo del timer per la lettura dei sensori ogni 5 secondi  
   if (millis() - timer > interval) {  

     //Lettura dei valori dai sensori  
     umidita = readDHT11(dht11Pin);  
     tds = readTDS(phPin);  
     ph = readPH(phPin);  

     //Stampa dei valori sulla seriale  
     Serial.print("Umidità: ");  
     Serial.println(umidita);  

     Serial.print("TDS: ");  
     Serial.println(tds);  

     Serial.print("PH: ");  
     Serial.println(ph);   

      //Controllo dei valori rispetto alle soglie impostate e attivazione/disattivazione dei relè in base ai risultati ottenuti   

      if (umidita < sogliaUmidita) {   
        digitalWrite(relay1, HIGH);   
      } else {   
        digitalWrite(relay1, LOW);   
      }   

      if (tds < sogliaTds) {   
        digitalWrite(relay2, HIGH);   
      } else {   
        digitalWrite(relay2, LOW);   
      }   

      if (ph > sogliaPh) {   
        digitalWrite(relay3, HIGH);   
      } else {   
        digitalWrite(relay3, LOW);   
      }    

      //Aggiornamento del timer per la lettura dei sensori ogni 5 secondi  
      timer = millis();  

   }  

 } 

 //Funzione per la lettura dell'umidità 
float readDHT11(int pin) { 
  //Codice per la lettura dell'umidità 

  float humidity = 0.0;

  //Codice per leggere l'umidità dal sensore DHT11...

  return humidity; //Restituisce il valore letto dal sensore DHT11. 
} 

 //Funzione per la lettura del TDS 
float readTDS(int pin) { 
  //Codice per la lettura del TDS 

  float tdsValue = 0.0;

  //Codice per leggere il valore TDS dal sensore...

  return tdsValue; //Restituisce il valore letto dal sensore TDS. 																																						} 

 //Funzione per la lettura del PH 
float readPH(int pin) { 
//Codice per la lettura del PH

 float phValue = 0.0;

 //Codice per leggere il valore PH dal sensore...

 return phValue; //Restituisce il valore letto dal sensore PH.
}

Ovviamente non capisco nulla,
Qualcuno potrebbe aiutermi a capire? :slight_smile:

Vuoi dire che quel codice è stato prodotto interamente da una IA?

si esatto, ma non sò se ci sia qualcosa di giusto o come vada corretto

@wellawella: come richiesto al punto 7 del REGOLAMENTO , per favore edita il tuo post più sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone a forma di piccola matita :pencil2: che si trova in basso del tuo post), seleziona la parte di codice e premi l'icona </> nella barra degli strumenti per contrassegnarla come codice. Inoltre, così com'è, non è molto leggibile ... assicurati di averlo correttamente indentato nell'IDE prima di inserirlo (questo lo si fa premendo ctrlT su un PC o cmd T su un Mac, sempre all'interno del IDE).

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà sistemato il codice come indicato, nel rispetto del regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

@Claudio_FF: ... cerchiamo di ricordarcelo il REGOLAMENTO ? Grazie :wink:

Dopo averlo indentato nell'IDE, devi togliere l'apostrofo che c'è all'inizio e alla fine, quelli che ci sono all'inizio e alla fine della parte che già appare come codice, selezionare TUTTO il codice e premere l'icona. Fatto la prima volta, è facilissimo. :slight_smile:

Provando a fare ctr+t mi apre una nuova scheda :-/ comunque dovreebbe andare bene così giusto?

Non mi sembra una IA molto I :rofl:
In fondo, ha prodotto solo un template incompleto per le funzioni di lettura e per le logiche binarie di attivazione delle uscite.

Il problema principale è il seguente a mio avviso :stuck_out_tongue_winking_eye:

Direi che i link per iniziare che mette Guglielmo in questi casi (e che dimentico sempre di salvare da qualche parte) siano un ottimo punto di partenza.

... sono nel punto 16.1 del REGOLAMENTO ... incluso il link all'ottimo libro che ha scritto Leo.

Guglielmo

Sono d'accordo che il problema maggiore al momento è la non conoscenza del C (e forse della programmazione in generale?). E sono d'accordo sul fatto che quel codice è uno scheletro. Ma è uno scheletro fatto molto bene. A parte i dettagli per ovvie ragioni mancanti, per il resto è molto più consistente e ordinato di quanto normalmente scriva un umano anche non principiante. E quindi la IA deve essere stata "interrogata" in modo molto preciso e ben impostato. Mi domando se sia possibile senza conoscenze di programmazione, per questo sarei veramente curioso di sapere cosa e come è stato descritto in linguaggio naturale per ottenere quel risultato.

Se davvero vuoi realizzare progetti con Arduino, è fuori discussione il fatto che bisogna imparare il suo linguaggio di Programmazione.

Quel codice è una casa generica, per me fin troppo bene impostata, ma grezza, adesso ci vanno le finiture e i mobili. Questo credo che nessuna IA potrà mai farlo, perché ci sono tanti dettagli che dipendono direttamente dall'hardware di contorno e dai collegamenti che si andranno ad effettuare, e altri che dipendono dalla logica specifica che si vuole ottenere.

Praticamente tutto di quel codice si comprende con le basi di linguaggio C, un libro introduttivo specifico per Arduino come quello consigliato, una lettura del reference, un'occhiata agli esempi presenti nell'IDE.

Per iniziare qualsiasi tipo di spiegazione sul codice presentato bisognerebbe "conoscere le conoscenze".

Potrei dire: l'esecuzione avviene nella funzione 'loop', che ogni 'interval' millisecondi (tempo calcolato tramite la funzione 'millis') chiama le funzioni di lettura dei sensori, e in base ai valori restituiti, confrontati con delle soglie, comanda in modo reattivo (nessuna isteresi, nessuna temporizzazione) le uscite per i relé.

Le funzioni di lettura dei sensori sono dei segnaposto da completare, attualmente restituiscono sempre zero. Le istruzioni di confronto che vanno a impostare le uscite per comandare i relé, potrebbero funzionare nel modo opposto a quello che serve (dipende dai collegamenti che andranno effettuati).

1 Like

Capisco il punto di vista. Il mio dubbio è che questo genere di strumenti in realtà siano molto più utili per chi già ne sa abbastanza perché effettivamente ti consentono di impostare rapidamente lo scheletro del progetto, piuttosto che per i principianti dove c'è il rischio che si possa pensare "vabbè ma tanto c'è l'IA che scrive il codice".

Sicuramente si, come vale anche per i simulatori. Chi usa i simulatori deve essere consapevole che sta utilizzando un modello ridotto (sarà la fame ma avevo scritto risotto :cook:) a cui mancano molti dettagli del mondo reale. Quello che sarei curioso di sapere è fino a che dettaglio e precisione si potrebbe "raffinare" quella generazione automatica di codice.

Ciao Claudio,

per farvi capire quali indicazioni gli ho dato per scrivere il codice, vi dico che ho fatto un copia e incolla del testo che ho scritto su questo topic all'incirca :slight_smile:

Per quanto riguarda quanto detto dagli altri, è indubbio che dovrò comunque studiare arduino in quanto qui nessuno "lavora per gli altri gratis". Ma spero comprenderete la mia impulsiva curiosità a mostrarvi quanto scritto dalla IA.
Giusto per comprendere meglio alcune cose, mancano proprio dei pezzi in quello scheletro, o solo dei parametri da inserire (ad esempio per leggere la sonda)?

Curiosità, link a quella ia?

In che senso, scusa ? ... per abbassare il PH aggiungi un'acido, per alzarlo aggiungi una base, cosa ti vieta di farlo ?

Immagino si riferisse a ChatGPT :roll_eyes: ... ormai tutti a giocare con quella :grin:

Guglielmo

Bisognerebbe vedere il testo esatto. Ci sono diverse "assunzioni" nel codice, sui pin da usare, sui valori delle soglie. Io non so se queste sono supposizioni della IA o le sono state fornite un po'di informazioni in più (tra l'altro continua a sembrarmi uno scherzo :disguised_face:).

Della parte "Ma deve controllare dopo aver messo "x" quantita aspettare un pò che la soluzione si omogenizzi, e ricontrollare il parametro" non c'è traccia, mentre ha messo un controllo fisso ogni 5 secondi e la trasmissione seriale dei valori.

Per l'umidità non c'è alcuna gestione del sensore, ma ha creato una funzione di nome 'readDHT11', quindi ha fatto comunque l'ipotesi di usare un sensore DHT11 (ma è molto meglio il DHT22).

Le due righe 'analogWrite' sono pura fantasia.

1 Like

Openai!

Un altra ? Spintano come funghi ultimanente ... :roll_eyes:

Ah, no, in realtà è sempre quella che ho già indicato :grin:

Guglielmo

In teoria open ai è la piú avanzata. E l'hanno aggiornata qualche giorno fa, vi descrivo cosa mi ha detto:

Certo, sarebbe felice di aiutare. Per programmare il tuo Arduino, avrai bisogno di un computer con il software di sviluppo Arduino installato e di un cavo USB per collegare l'Arduino al computer.

Per iniziare, apri il software Arduino e crea un nuovo sketch (un progetto vuoto). Poi, puoi utilizzare il linguaggio di programmazione Arduino per scrivere il codice che controllerà il tuo Arduino.

Ecco un esempio di codice che potrebbe essere utilizzato per fare ciò che hai descritto:

void setup() {
  // metti qui il codice che vuoi eseguire una volta all'avvio
}

void loop() {
  // metti qui il codice che vuoi eseguire in loop continuamente
}

Il metodo setup viene eseguito una sola volta all'avvio dell'Arduino, mentre il metodo loop viene eseguito continuamente in loop. Puoi inserire il tuo codice all'interno di questi metodi per far fare all'Arduino ciò che desideri.

Per maggiori informazioni su come programmare l'Arduino, ti consiglio di consultare la guida ufficiale di Arduino: https://www.arduino.cc/en/Guide/HomePage

IO:Buongiorno,
Da anni cerco un descrizione su come sviluppare un sistema autoregolato/autogestito da arduino per l'idroponica.
Con il tempo ho letto varie soluzioni ma tutte fastidiosamente incomplete.
Dunque volevo chiedervi un parere per concludere questo dilemma e finalmente completare il tutto.
Vi spiego:
i 3 parametri fondamentali sono:
umidità
TDS
PH
*1-UMIDITà- per questo parametro basta azionare un umidificatore (un on/off alla alimentazione USB) con un sensore di umidità, quest'ultimo da acquistare su vostro consiglio. Il sensore è il AZDelivery DHT11 AM2302 Sensore di temperatura e umidità *
che deve spegnere una ventola o attivarla.
*2-TDS- il sensore per capirci, NON PRESENTE SUL SITO UFFICIALE, è questo Il CQRobot Ocean: TDS *
Dovrebbe azionare DUE POME DOSOMETRICHE (Model G328, U: 13v)
in contemporanea che immettono i nutrienti.
Ma, cosa importante, deve controllare dopo aver messo "x" quantita aspettare un pò che la soluzione si omogenizzi, e ricontrollare il parametro.
3-PH- in questo caso il parametro si può solo alzare. Quindi stesso discorso di prima ma al contrario, e cosa più complicata, in questo caso il sensore a disposizione più facilmente reperibile è ANALOGico.
scrivere la programmazione.

Lui:
Sicuramente, sarebbe felice di provare a scrivere il codice per il tuo sistema di idroponica autoregolato con Arduino. Tieni presente che il codice che segue è solo un esempio e potrebbe essere necessario modificarlo in base alle tue esigenze specifiche e all'hardware che stai utilizzando.

Per iniziare, avrai bisogno di includere le librerie necessarie per utilizzare i sensori e gli attuatori nel tuo sketch Arduino. Ad esempio, se stai utilizzando il sensore di umidità DHT11, dovrai includere la libreria DHT per gestirlo:

#include <DHT.h>

`Successivamente, dovrai dichiarare i pin a cui sono connessi i sensori e gli attuatori. Ad esempio, se il sensore di umidità DHT11 è connesso al pin 2 dell'Arduino, dovrai dichiarare una variabile per il pin come segue:

#define DHT_PIN 2

Inoltre, dovrai dichiarare le variabili per i valori rilevati dai sensori e per i valori di soglia che desideri mantenere. Ad esempio, potresti dichiarare le variabili per il valore di umidità rilevato dal sensore DHT11 e per il valore di umidità di soglia come segue:

float humidity;
float humidityThreshold = 50;

Successivamente, nel metodo setup , dovrai configurare i sensori e gli attuatori. Ad esempio, se stai utilizzando il sensore di umidità DHT11, dovrai inizializzarlo come segue:

DHT dht(DHT_PIN, DHT11);

Nel metodo loop , dovrai leggere i valori dei sensori e agire di conseguenza. Ad esempio, per il controllo dell'umidità, potresti utilizzare il sensore DHT11 per leggere il valore di umidità e, in base a questo, accendere o spegnere la ventola o l'umidificatore:

humidity = dht.readHumidity();

if (humidity < humidityThreshold) {
  // accendi l'umidificatore
} else {
  // spegni l'umidificatore
}

Per il controllo del TDS e del pH, potresti utilizzare i sensori Ocean: TDS e il sensore analogico per leggere i valori di TDS e pH e, in base a questi, azionare le pompe dosometriche o la pompa per aggiungere l'agente alcalino o acido:

float tds = readTDSSensor();
float pH = readPHAn

Come precedentemente menzionato, tieni presente che il codice che segue è solo un esempio e potrebbe essere necessario modificarlo in base alle tue esigenze specifiche e all'hardware che stai utilizzando.

Per il controllo del TDS e del pH, potresti utilizzare i sensori Ocean: TDS e il sensore analogico per leggere i valori di TDS e pH e, in base a questi, azionare le pompe dosometriche o la pompa per aggiungere l'agente alcalino o acido. Ad esempio, potresti utilizzare le seguenti funzioni per leggere i valori dei sensori e gestire le pompe dosometriche o la pompa:

float tdsThreshold = 1000;

float readTDSSensor() {
  // leggi il valore di TDS dal sensore Ocean: TDS e restituisci il valore
}

void controlTDS() {
  float tds = readTDSSensor();
  if (tds < tdsThreshold) {
    // aziona le pompe dosometriche per aggiungere i nutrienti
    // aspetta un pò per far si che la soluzione si omogenizzi
  }
}

float pHThreshold = 7;

float readPHAnalogSensor() {
  // leggi il valore di pH dal sensore analogico e restituisci il valore
}

void controlPH() {
  float pH = readPHAnalogSensor();
  if (pH < pHThreshold) {
    // aziona la pompa per aggiungere un agente alcalino
  }
}

Infine, potresti utilizzare un timer per controllare i valori dei sensori a intervalli regolari e agire di conseguenza. Ad esempio, potresti utilizzare la libreria Timer per impostare un timer che richiami la funzione controlTDS ogni 10 minuti:

#include <Timer.h>

Timer tdsTimer;

void setup() {
  // configura il timer per richiamare la funzione controlTDS ogni 10 minuti
  tdsTimer.every(10 * 60 * 1000, controlTDS);
}

void loop() {
  // esegui il timer
  tdsTimer.update();
}

Spero che questo codice possa darti un'idea di come procedere per sviluppare il tuo sistema di idroponica autoregolato con Arduino. Se hai altre domande o hai bisogno di ulteriore supporto, non esitare a chiedere.