DIGA

ok questo è il mio schema

Correggimi se sbaglio:

  • Hai fato un cap screen del video che c’è su Youtube (Che suppongo non sia tuo)
  • Hai aggiunto degli “elementi” a membro
  • Speri nella forza oscura che tutto funzioni.

Sbaglio qualcosa?

no non sbagli, il circuito l'ho preso da internet xo l'ho montato e l'ho testato e funziona.

cioè stai dicendo che quei display, collegati in quel modo (immagno che i vari segmenti siano in parallelo per comporre i numeri 1-2-3) si accendono prelevando alimentazione ai capi delle R da 330? e come funzionerebbero i transistor collegati al contenitore, ad idrogeno?

no Michele... quelli non sono display... sono numeri scritti su uno schema esistente preso su youtube...

sì, io l'ho capito, quello è uno schema diciamo semi-concettuale, ma il problema è che morru dice che è il "suo schema", allora qui non si capisce cosa sia stato assemblato ed in che modo possa funzionare, ecco perché ho sollevato le prime due questioni che saltano all'occhio. Allora, se morru si decide a dire come stanno le cose in realtà, cioè che lui ancora non ha realizzato nulla oppure come lo ha realizzato seriamente, visto che afferma che gli stia funzionando, gli si può dare una mano, almeno nel secondo caso, dicendogli come deve prelevare i tre segnali dei rilevatori di livello e come gestirli con Arduino; invece così al buio rischiamo di prenderci tutti inutilmente per i fondelli.

ok questo è il mio schema

Non può essere, il tuo schema, perchè tu hai scritto:

i collegamenti che ho fatto io sono : PIN 2 ARDUINO : centrale del 1 BC337 PIN 3 ARDUINO : centrale del 2 BC337 PIN 4 ARDUINO : centrale del 3 BC337 tra PIN 5 e GND di ARDUINO : ho collegato in parallelo il led verde ovvero 1 lvl tra PIN 6 e GND di ARDUINO : ho collegato in parallelo il led giallo ovvero 2 lvl tra PIN 7 e GND di ARDUINO : ho collegato in parallelo il led rosso ovvero 3 lvl PIN 8 ARDUINO : x ora non ho collegato nulla ma ci collegherò l'elettrovalvola.

Quindi ti devi sforzare a disegnare uno schematico anche a matita o come vuoi tu, niente frizing non lo capisco. Se posti lo schema che stai testando ricevi aiuto, ho modo di aiutarti, diversamente ....no

Ciao.

ragazzi ho disegnato lo schema su eagle. eccolo qui.

mmmmm.... vedo, ma non ci ho capito una mazza.

Un pin di ingresso di arduino ha una elevata sensibilità e una alta impedenza e quindi non è necessario un transistor. Un pin di arduino in uscita è in grado di fare accendere un led senza la necessità di ricorrere ai trastistor. Arduino è in grado di fare accendere contemporaneamente più led, per fare questo è sufficiente usare un R serie per ogni led di modo che un led non assorba una corrente superiore a 10mA (se assorbe 12mA o 15mA non esplode)

Quindi io ti consiglio di sperimentare il codice per accendere un led a seguito della pressione e mantenimento di un pulsante. Per lo schema, c'è il web pieno a partire da qui http://playground.arduino.cc/

Ti serve un pulsante o microswitch, 2 resistenza e un led, quando lo hai sperimentato, posta lo schema che lo modifichiamo per sfruttarlo come sensore.

1) Ricorda che l'acqua è un buon conduttore ma se forzi il liquido a condurre elevati correnti, si finisce per costatare il fenomeno della elettrolisi. 2) l'acqua contiene calcio, e altro, l'insime di questi agisce sui metalli in vari modi, il rame si ossida, l'acciaio si ricopre di calcare e non conduce più, quindi si tratta di un progetto didattico che non può essere usato per scopi pratici.

Il pulsantino è simile all'acqua solo quando viene premuto, cioè conduce, be fai 2 + 2.

Su arduino hai la seriale, impara ad usarla, puoi ad esempio scrivere: if (digitalRead(s0, HIGH) Serial.print("sensore0 = Alto");

Vediamo di sgobbare, che mi sa che questo post potra essere di aiuto a molti principianti.

Ciao.

morru: 1) cmq allora a bicchiere vuoto non deve fare nulla. 2) quando l'acqua tocca il primo sensore di livello (ovvero il mio primo bc337) si deve accendere il mio led verde. 3) quando l'acqua tocca il secondo sensore di livello (ovvero il mio secondo bc337) si deve accendere il mio led giallo. 4) quando l'acqua tocca il terzo sensore di livello (ovvero il mio terzo bc337) si deve accendere il mio led rosso e far aprire l'elettrovalvola. 5) infine quando l'acqua è scaricata chiude l'elettrovalvola. 6) fine

1)ok 2)ok 3) il led verde rimane acceso? 4) I led verde e giallo rimangono accesi? 5) nel frattempo che l'acqua scende che fanno i led? 6) per fine intendi che si ritorna al punto 1?

si il led verde rimane acceso anche quando l'acqua tocca il 2 livello... stessa cosa x il 3

morru: non mi spegne l'altro led e cmq appena carico il programma il 1 led del 1 livello è già acceso anche se l'acqua nn fa contatto.

Per forza. Forse NON hai capito bene come funziona un programma su Arduino. E' IMPORTANTISSIMO che tu capisca una cosa: tutto quel codice che hai scritto nella loop() viene eseguito di continuo dalla prima all'ultima istruzione. NON è un programma sequenziale. Secondo me stai pensando al programma come una sequenza di passi ma purtroppo non è così.

Il led1 ti si accende subito perchè nel codice, a metà circa, ti chiedi se statosensore2 è HIGH, siccome NON lo è allora fai nell'else:

// spegni il led 2 e accendi il led 1:
    digitalWrite(led2, LOW); 
    digitalWrite(led1, HIGH);

Ovvero accendi led1 e spegni led2.

Secondo me sarebbe meglio ripensare al programma. Prima di tutto metterei le 3 istruzioni di lettura sensori all'inizio della loop():

statosensore1 = digitalRead(sensore1);
statosensore2 = digitalRead(sensore2);
statosensore3 = digitalRead(sensore3);

Poi in base alle varie combinazioni di questi stati allora agisci (tenendo conto dei casi impossibili esempio sensore3 high e gli altri due low non è possibile)

if(statosensore1==HIGH && statosensore2==LOW && statosensore3==LOW)
{ // primo livello
}
elseif(statosensore2==HIGH && statosensore3==LOW)   // sensore1 dovrebbe essere a high
{ // secondo livello
}
elseif(statosensore3==HIGH)          // sensore1 e sensore2 dovrebbero essere a high
{ // terzo livello
}

ok ora ci provo ... cmq si hai ragione... io arduino nn ho proprio idea di come si programmi e dalla scuola non ho nessun aiuto ... infatti ho scritto qui io l'anno scorso programmavo con assembler quello del dos del computer (bassissimo lvl) mentre qui si parla di alto livello e io linguaggio in c zero proprio...

ok credo di aver fatto come mi hai detto. potrebbe andar bene secondo te?

const int sensore1 = 2; // sensore 1 sul piedino 2 const int sensore2 = 3; // sensore 2 sul piedino 3 const int sensore3 = 4; // sensore 3 sul piedino 4 const int led1 = 5; // led 1 sul piedino 5 const int led2 = 6; // led 2 sul piedino 6 const int led3 = 7; // led 3 sul piedino 7 const int elettrovalvola = 8; // elettrovalvola sul piedino 8

// stati iniziali:

int statosensore1 = 0; // stato iniziale pronto per essere letto dal sensore 1 int statosensore2 = 0; // stato iniziale pronto per essere letto dal sensore 2 int statosensore3 = 0; // stato iniziale pronto per essere letto dal sensore 3 int statoled1 = 0; // stato iniziale pronto per essere letto dal led 1 int statoled2 = 0; // stato iniziale pronto per essere letto dal led 2 int statoled3 = 0; // stato iniziale pronto per essere letto dal led 3 int statoelettrovalvola = 0; // stato iniziale pronto per essere letto dall'elettrovalvola

void setup() { // utilizza la variabile sensore 1 sul piedino 2 come ingresso: pinMode(sensore1, INPUT); // utilizza la variabile sensore 2 sul piedino 3 come ingresso: pinMode(sensore2, INPUT); // utilizza la variabile sensore 3 sul piedino 4 come ingresso: pinMode(sensore3, INPUT); // utilizza la variabile led 1 sul piedino 5 come uscita: pinMode(led1, OUTPUT); // utilizza la variabile led 2 sul piedino 6 come uscita: pinMode(led2, OUTPUT); // utilizza la variabile led 3 sul piedino 7 come uscita: pinMode(led3, OUTPUT); // utilizza la variabile elettrovalvola sul piedino 8 come uscita: pinMode(elettrovalvola, OUTPUT); }

void loop(){

statosensore1 = digitalRead(sensore1); statosensore2 = digitalRead(sensore2); statosensore3 = digitalRead(sensore3);

if(statosensore1==HIGH && statosensore2==LOW && statosensore3==LOW) { // primo livello digitalWrite (led1, HIGH); digitalWrite (led2, LOW); digitalWrite (led3, LOW); } else if(statosensore1==HIGH && statosensore2==HIGH && statosensore3==LOW) // sensore1 dovrebbe essere a high { // secondo livello digitalWrite (led1, LOW); digitalWrite (led2, HIGH); digitalWrite (led3, LOW); } else if(statosensore3==HIGH) // sensore1 e sensore2 dovrebbero essere a high { // terzo livello digitalWrite (led1, LOW); digitalWrite (led2, LOW); digitalWrite (led3, HIGH); } }

Prima scrivi che i led rimangono accesi e poi nello schetch fai il contrario. Vabbe'.

Credo che tu possa aggiungere l'accensione dell'elettrovavola nell'ultimo if (terzo livello) e il suo spegnimento nel primo if (secondo livello).

L'accensione potrebbe essere con un if !digitalRead(elettrovalvola) digitalWrite(elettrovalvola, HIGH); Lo spegnimento if digitalRead(elettrovalvola) digitalWrite(elettrovalvola, HIGH);

Questo per fare in modo che se la valvola è HIGH non lo si faccia daccapo. Penso però che funzioni anche con il semplice digitalWrite(elettrovalvola, HIGH);

Spero di non aver scritto castronerie, però.

Mi sa che poi ti comparirà un piccolo problema. Quando l'acqua arriverà ad un sensore di livello mi sa che la lettura non sarà stabile per cui forse bisognerebbe prevedere che se almeno 10 letture distanziate nel tempo non sono le stesse non viene eseguito l'if del cambio di livello.

in che senso scrivo che rimangono accesi ?

Hai scritto questo

morru: si il led verde rimane acceso anche quando l'acqua tocca il 2 livello... stessa cosa x il 3

Dovrebbe significare che ci sono stati con 2 o più led accesi mentre nel codice non è così. Ma fa niente, forse ho capito male io, non è un problema.

L'idea didattica però è carina. In una diga reale però oltre allo scarico di fondo c'è uno scarico al livello massimo, un po' come nella vasca da bagno.

ma infatti non deve accadere che rimangano accesi tutti e 3 ... cmq io devo far scaricare l'acqua quando arriva al 3 livello e si deve chiudere quando è sotto al primo livello.

Io direi di provare il codice com'è per vedere se la sequenza dei led è corretta e poi si aggiunge il codice dell'elettrovalvola.

zoomx:
Io direi di provare il codice com’è per vedere se la sequenza dei led è corretta e poi si aggiunge il codice dell’elettrovalvola.

Quoto. Poi si può migliorare. Tieni conto di una cosa, ma per ora fregatene. Quel codice viene eseguito di continuo da Arduino.
Mentre l’acqua sale fino ad esempio da lvl 1 a lvl 2 il tuo codice di continuo accende led2 e spegne led1 e 3.
In teoria sarebbe meglio “sentire” il cambiamento di stato di quei sensori (da low->high o high->low) ma si complicherebbe. Per ora ripeto fregatene.

P.S. mi sembra manchi il caso tutti LOW=spegni tutti i led. !!!