Sensori Umidità Terreno in Vasi con Wifi

Ciao Ragazzi rieccomi qui a chiedere una vostra opinione....

vorrei procedere in questo modo... creare dei sensori fatti in casa di una lunghezza maggiore rispetto a quelli che si trovano in commercio(i miei vasi sono h 30 cm) e fare in modo che la lettura avvenga nella parte più bassa del sensore...(avete un'idea di come?) il sensore lo farei con due barrette metalliche reperibili in ferramenta(consigli sul tipo di materiale?) un sensore da tenere fisso in ogni vaso e nel momento della misurazione, collegare l'arduino al sensore facendogli fare la lettura...per poi scollegarlo lasciando sempre il sensore fisso nel vaso.... pensate ci siano risvolti negativi in questo modo?

se usi per le barrette dell'accicio inox, e copri la parte superiore con del termorestringente o della vernice spessa lasciando scoperta solo una zona alle estremita', hai risolto entrambi i problemi, lettura in profondita' e corrosione praticamente nulla ... :wink:

Se vuoi spendere un po di più dovresti usare l'oro che grazie al suo alto potenziale elettrochimico non viene ossidato con facilità (vedi appunto i connettori audio video che sono dorati).

Per esperienza personale, posso dire che anche le barrette in acciaio inox col tempo tendono ad ossidarsi. L'alternativa è trovare un ottimo acciaio inox, o come detto, procedere al rivestimento di queste con uno strato di oro.

Se trovi del 316L dovrebbe durare un bel po ...

Etemenanki:
Se trovi del 316L dovrebbe durare un bel po ...

Grazie! Proverò a cercare quello.
In azienda utilizziamo titanio e oro per i dispositivi.
Per un sensore di pioggia avevo disegnato una struttura a pettine su un wafer e poi mediante fotolitografia incisa su un wafer "sputterato" con oro... :slight_smile:

ha funzionato finché non si è preso un chicco grosso di grandine.

L'oro e' un'ottima soluzione ... se non fosse che costa, e che per metallizzare oro su accicio per via elettrolitica serve prima metallizzare in rame con solfato di rame ed acido solforico, e poi rivestire lo strato di rame con oro, che di solito richiede oro dissolto in cianuro di sodio, tutte cose molto salutari e che chiunque puo farsi tranquillamente in cucina senza rischi (cioe', senza rischiare di sopravvivere a lungo, intendo ... :D) ...

Noi depositiamo titanio e poi oro. Poi per aumentare lo spessore facciamo crescita galvanica. Confermo la pericolosità: i bagni di galvanica contengono proprio oro dissolto in cianuro ed altri sali e salini non proprio salutari. Il wafer che mi ero fatto era niobato di litio, deposizione di ossido di silicio, titanio e oro.

Etemenanki:
se usi per le barrette dell'accicio inox, e copri la parte superiore con del termorestringente o della vernice spessa lasciando scoperta solo una zona alle estremita', hai risolto entrambi i problemi, lettura in profondita' e corrosione praticamente nulla ... :wink:

perfetto!! grazie mille per il consiglio!!! a questo punto credo proprio che sia il caso di provare a smanettare con Arduino!!!!

grazie

ciao ragazzi... i miei primi smanettamenti con arduino mi hanno portato già quello che per me è un'ottimo risultato:

sensore fatto da me lungo 30cm collegato ad arduino e che mi dà il risultato su un display... il passo successivo è quello di mettere un secondo sensore e dire ad arduino di alternare la lettura ad esempio ogni 5 minuti e di darmene visualizzazione sul display,alternando quindi letture e visualizzazioni.

ancora mi devo cimentare con questi smanettamenti e quindi non vi sto chiedendo questo.... (per il momento :slight_smile: )

quanti sensori posso collegare ad arduino uno contemporaneamente? immaggino che il fatto di alternare le misure,se riesco a capire come si fa, significhi far "spegnere" un sensore per accenderne un'altro e questo mi fa pensare che non siano limiti a quanti metterne... ma se per assurdo volessi che le letture siano fisse e costanti su N sensori... come faccio a capire quanti ne posso mettere?

grazie

quanti sensori posso collegare ad arduino uno contemporaneamente?

Dipende da quale Arduino usi e quindi da quante porte analogiche ha.
Se è una UNO hai a disposizione 6 porte ( da A0 a A5 )

Dipende anche dal sistema che usi tu per leggerli ... se devi avere letture continue ed ininterrotte, servono tanti pin quanti sono i sensori, quindi il numero e' limitato da quanti pin di ingresso adeguati hai disponibili ... se invece anche se restano accesi li puoi leggere uno alla volta, sequenzialmente, puoi collegarne tanti quanti canali riesci a multiplexare (o quanti ingressi riesci a concatenare con degli expander, decidi communque tu il sistema da usare)

simosere:
ciao ragazzi... i miei primi smanettamenti con arduino mi hanno portato già quello che per me è un'ottimo risultato:

sensore fatto da me lungo 30cm collegato ad arduino e che mi dà il risultato su un display... il passo successivo è quello di mettere un secondo sensore e dire ad arduino di alternare la lettura ad esempio ogni 5 minuti e di darmene visualizzazione sul display,alternando quindi letture e visualizzazioni.

ancora mi devo cimentare con questi smanettamenti e quindi non vi sto chiedendo questo.... (per il momento :slight_smile: )

quanti sensori posso collegare ad arduino uno contemporaneamente? immaggino che il fatto di alternare le misure,se riesco a capire come si fa, significhi far "spegnere" un sensore per accenderne un'altro e questo mi fa pensare che non siano limiti a quanti metterne... ma se per assurdo volessi che le letture siano fisse e costanti su N sensori... come faccio a capire quanti ne posso mettere?

grazie

eccomi di nuovo qui.... anche questo è fatto... ho collegato al momento due sensori che si alternano sul diaplay ogni 6 secondi.... ora però viene il bello....

i prossimi passi sono questi...

far fare la lettura una sola volta al giorno,al massimo 2....in modalità automatica e quando non serve fare letture lasciare arduino in standby(è possibile per risparmiare batteria?) oppure fisso su qualche schermata ifssa... tipo orario o non so.... i dati devo essere memorizzati in qualche modo per poi essere letti...(come?)

e successivamente a questo avere la possibilità di dire ad arduino di passare in modalità manuale e di leggere il sensono numero 1 ad esempio e memorizzare i dati.

oltre a non sapere cosa mi serve qui sarebbe utile qualche consiglio anche sulla programmazione....

stasera quando torno a casa vi posto il codice che ho fatto/copiato/modificato dalla rete....

..... lasciare arduino in standby(è possibile per risparmiare batteria?

Questo dipende da quale scheda Ardino stai usando.
Se è ad esempio una UNO, metterlo in standy non riduce il consumo in modo significativo

Tutto il resto che vuoi fare è solo software da implementare

Ciao a tutti, sono in dirittura d'arrivo con questo mio primo progetto, ma vorrei se posso chiedere il vostro supporto su due cose:

1 banalmente confermarmi la presenza o meno di errori sul codice,funzionano perfettamente ma gradirei un supporto... :slight_smile:

2 avere la possibilità di avere la lettura del VCC di arduino essendo questo alimentato da una batteria da 3.7v, oltre alla lettura vorrei anche convertirlo con la funzione map in % di batteria rimanente...da leggere poi sul display... leggevo del Secret Arduino Voltmeter e parallelamente sto capendo come funziona prima di implementarlo nel codice di lettura dell'umidità del terreno, mi manca di capire perchè il vcc letto va convertito se si usa una batteria.... e come....

allego anche foto del progetto che manca solo del case.

grazie a tutti

codice lettura unidità terreno(i led sono in forse se metterli o no... per quello sono "definiti", in caso li tolgo...:

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
 
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
 
#define LED 13
#define LED 8
int sensorValue=0;
int umidita=0;
 
 

 
void setup()   {                
  Serial.begin(9600);
 
  // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3D (for the 128x64). Change address from 0x3D to 0x3C
  // init done
  
  // Show image buffer on the display hardware.
  // Since the buffer is intialized with an Adafruit splashscreen
  // internally, this will display the splashscreen.
  display.display();
  delay(2000);
 


}
 
 
void loop() {
  

 
 

float s = sensorValue = analogRead(0);
float x = umidita = map (sensorValue, 184, 1010, 100, 0);


  // Clear the buffer.
  display.clearDisplay();
 
  
 
  // text display tests
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Rh % terreno:");
  display.setTextSize(2);
  display.setTextColor(WHITE); // 'inverted' text
  display.println(x);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.println("prova");
  display.display();
delay(100);



}

codice su cui sto lavorando per la lettura del VCC(copiato volgarmente da internet... e riadattato:

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



LiquidCrystal_I2C lcd(0x27,16,2);  //dichiara il display "lcd" di tipo 16x2 all'indirizzo 0x20

 
float iREF = 1.24; //internal reference cal factor



void setup() {
  // put your setup code here, to run once:
  analogReference(EXTERNAL);
  //burn some ADC readings after reference change
  for (int i = 0; i < 8; i++) analogRead(A0);
   Serial.begin(9600);

 lcd.init();                     
  lcd.backlight();
   
lcd.setCursor(0, 0); 
lcd.print("V:"); 


 
}

void loop() {








  


  
  // put your main code here, to run repeatedly:
  delay(100);
  Serial.print("Measured battery voltage is: ");
  Serial.println(fReadVcc());
  Serial.println();
  lcd.setCursor(0, 1); 
   lcd.print(fReadVcc());

 
   
     
 
}

//This function uses the known internal reference value of the 328p (~1.1V) to calculate the VCC value which comes from a battery
//This was leveraged from a great tutorial found at https://code.google.com/p/tinkerit/wiki/SecretVoltmeter?pageId=110412607001051797704
float fReadVcc() {
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(3); //delay for 3 milliseconds
  ADCSRA |= _BV(ADSC); // Start ADC conversion
  while (bit_is_set(ADCSRA, ADSC)); //wait until conversion is complete
  int result = ADCL; //get first half of result
  result |= ADCH << 8; //get rest of the result
  float batVolt = (iREF / result) * 1024; //Use the known iRef to calculate battery voltage
  return batVolt;
}

foto progetto in allegato

2 avere la possibilità di avere la lettura del VCC di arduino essendo questo alimentato da una batteria da 3.7v, oltre alla lettura vorrei anche convertirlo con la funzione map in % di batteria rimanente...da leggere poi sul display... leggevo del Secret Arduino Voltmeter e parallelamente sto capendo come funziona prima di implementarlo nel codice di lettura dell'umidità del terreno, mi manca di capire perchè il vcc letto va convertito se si usa una batteria.... e come....

nessuno? almeno un piccolo chiarmento su questo punto.... grazie

Non è nostra abitudine fornire "pappa fatta", ma in questo caso si tratta di una funzione ben specifica, piuttosto complessa (usa direttamente i registri della MCU e non è di banale comprensione), per cui .... faccio un'eccezione ... :smiley:

long readVcc() {
  uint8_t low;
  uint8_t high;
  long result;
  // Read 1.1V reference against AVcc
  // set the reference to Vcc and the measurement to the internal 1.1V reference
#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
  ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
  ADMUX = _BV(MUX5) | _BV(MUX0);
#elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
  ADMUX = _BV(MUX3) | _BV(MUX2);
#else
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#endif
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Start conversion
  while (bit_is_set(ADCSRA, ADSC)); // measuring
  low  = ADCL; // must read ADCL first - it then locks ADCH
  high = ADCH; // unlocks both
  result = (high << 8) | low;
  result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
  return result; // Vcc in millivolts
}

Copia/incolla questa funzione nel tuo programma e, dove ti interessa misurare il valore al momento della Vcc con cui alimenti Arduino (quindi, nel tuo caso, della batteria che lo alimenta), chiami la funzione che ti ritorna il valore espresso in millivolt.

La uso anche io per una schedina alimentata con una LiPo e mi serve appunto per aggiornare un indicatore grafico di batteria e capire quando ... è il momento di spegnere/bloccare il tutto :smiley:

Guglielmo

Passo successivo ... se usi anche tu una LiPo, considera che completamente carica da circa 4.2V, mentre la puoi considerare scarica (per sicurezza) se scende sotto i 3.3V, quindi, il tuo 100% sono 4.2V ed il tuo 0% sono 3.3V quindi, se vuoi un valore "percentuale" tra questi due estremi applichi la funzione map() assieme alla funzione che ti ho appena passato sopra :

percentuale = map(readVcc(), 3300, 4200, 0, 100);

...ed ogni volta, nella variabile percentuale (che puoi dichiarere come una int) hai il valore % rimanente della batteria.

Se vuoi rischiare puoi portare quel 3300 (3.3V) anche a 3200 (3.2V), ma te lo sconsiglio e ti consiglio invece di considerare scarica la LiPo a 3.3v ... essa te ne sarà grata :grin:

Guglielmo

grazie Guglielmo sei stato molto gentile...

non ho però capito in che parte del mio programma devo inserirlo... e se devo di conseguenza eliminare qualcosa che ho inserito per le letture che il programma fa attualmente... grazie

invece un consiglio più pratico per il case finale del progetto... ci sono immagini o lavori fatti sul forum per vedere come poter fissare un OLED Display 128 x 64 Pixel 0,96 ad un case, il risultato che ottengo è pessimo e non adatto ad eventuali contatti con polvere e acqua.... sto usando una scatola di derivazione elettrica,ma il risultato è pessimo...

simosere:
non ho però capito in che parte del mio programma devo inserirlo... e se devo di conseguenza eliminare qualcosa che ho inserito per le letture che il programma fa attualmente... grazie

NON ho guardato il tuo programma ...

... la funzione "long readVcc() {...}" la puoi inserire dove vuoi, purchè, ovviamente, fuori dal setup() e dal loop(), mentre la sua chiamata con il map(), probabilmente la metterai delntro al loop() dove ti interessa controllare la percentuale di carica della batteria.

Guglielmo

simosere:
... fissare un OLED Display 128 x 64 Pixel 0,96 ad un case ...

Dato che lo dovresti usare all'aperto e/o con l'acqua, piu che "fissare l'oled al case", ti consiglierei di fargli una finestrella ed incollare all'interno un foglietto di plexiglass o roba simile (ci sono anche da 2 o 3 decimi di mm, credo che lo spessore piu facile da reperire sia sul mezzo mm, alla disperata si massacra smonta con cura (:D) un vecchio display per notebook rotto o bruciato, preferibilmente di quelli sottili, e ci trovi dentro un "diffusore" in plexiglass trapezoidale largo come l'intero schermo, da cui si possono ricavare un po di pezzi per fare le finestrelle :wink: ... o anche un display rotto da smartphone, il foglio di plexiglass e' ancora piu sottile ... i negozi che fanno quelle riparazioni di solito li buttano, quindi dovrebbe essere facile farsene regalare qualcuno), in modo che risulti impermeabile ... poi all'interno il display lo puoi incollare come ti pare, tanto se la finestrella sara' piu piccola del display (larga come la zona dei pixel o poco piu), il resto non sara' visibile ... con il vantaggio di essere anche impermeabile, se fatto bene :wink: