Led e flussometro

salve a tutti, sono nuovo e non so niente di programmazione, direte che ci fai qui? bene sono attratto da queste cose e dal fai da te ma non ho il tempo e la testa per studiare a 50 anni. stavo cercando in giro per il web un codice per arduino mega 2560 in cui quando il flussometro gira si deve accendere una spia. ho collegato direttamente un led all'uscita del flussometro ma il problema è che quando si ferma e nel punto in qui il magnete si trova sul sensore la spia rimane accesa. il mio progetto sarebbe rilevare un eventuale perdita dall'impianto, c'è qualcuno che può aiutarmi a creare uno sketch?

Buongiorno e benvenuto, :slight_smile:
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il succitato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nel rispetto del suddetto regolamento nessuno ti risponderà, quindi ti consiglio di farla al più presto. :wink:

P.P.S. : ...ed in merito alla tua domanda ... leggi bene il REGOLAMENTO al punto 16.1

cominciando con questo sketch (se riesco a postarlo) fatto con un programma a blocchi funziona, ma il problema è che quando il magnete della girandolina si ferma sul sensore il led rimane acceso, dovrei impostare che in un lasso di tempo (tipo 1 secondo) devo avere almeno tre impulsi per far capire ad arduino che sta girando il fluxometro. chi mi può aiutare?

/***   Included libraries  ***/




/***   Global variables and function definition  ***/
const int led = 13;
const int flux = 2;




/***   Setup  ***/
void setup() {
    pinMode(led, OUTPUT);
    pinMode(flux, INPUT);

}


/***   Loop  ***/
void loop() {
    if (digitalRead(flux) == HIGH) {
        digitalWrite(led, HIGH);
    } else {
        digitalWrite(led, LOW);
    }
}

In conformità al REGOLAMENTO, fosse anche per una sola riga, il codice va racchiuso negli appositi tag ... :roll_eyes:

... cortesemente, quindi, 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 all'intero del IDE). Grazie. :slight_smile:

Guglielmo

grazie mille, nel regolamento c'è scritto ma non trovavo il tag e come si faceva.

Non è chiaro come usi il flussometro, comunque nei miei programmi, per sapere se il flussometro gira oppure è fermo o rotto uso un semplice timer di qualche secondo che viene resettato dal flussometro (leggo solo l'impulso in salita, non se è acceso oppure spento) , qualsiasi posizione sia.
Quindi, se il mio timer è di 5 secondi, se non viene resettato entro quel tempo significa che il flussometro è fermo.
Se invece il flussometro gira, mi resetterà continuamente il timer senza arrivare a attivare l'allarme dato dal timer.

ciao steve-cr, ancora non è in funzione perché prima lo testo poi lo monterò. faccio il muratore ed è un periodo che mi chiamano i clienti per scoperte (anche tardi $$$$$) di perdite all'impianto esterno alla casa, il mio concetto di usare il flussometro è montarlo al contatore e che quando gira si deve accendere un led. ribadisco non sono un programmatore ne ci capisco, ho usato un programma a blocchi e quello che faccio per svago lo cerco in qua e là. direi che dovrei programmare arduino concettualmente cosi:
il flussometro da un impulso quando gira la ventolina, quindi se in un dato tempo (es. 2/3 sec.) ci sono almeno 2 impulsi allora il flux sta girando e quindi accendi il led.

Però fammi capire COME fai a sapere se ci sono perdite di acqua?

  • se il rubinetto è chiuso il flussometro non gira
  • se il rubinetto è aperto il flussometro gira
  • se c'è una perdita il flussometro gira
    Come fai a sapere che è una perdita e non un normale uso di acqua?

ciao steve-cr

  • se apro il rubinetto si accende il led, ma so che non è una perdita, giusto?
  • se si accende il led ma non ho aperto nessun rubinetto deduco che ho una perdita, giusto?
    poi dove sia quello viene dopo, ma lo scopo del mio progetto è che se ho una perdita lo devo vedere subito e non quando mi arriva la bollette di € 800/1000. purtroppo 2 miei clienti hanno avuto una perdita all'esterno senza essere visibile, solo quando gli sono arrivate le bollette di € 800 e € 1000 se ne sono accorti.
    credo che sia il contrario del tuo programma, cioè a te avvisa se è fermo, mentre a me interessa se gira. Spero di essere stato più chiaro.

Spiegalo bene ai clienti, che se è acceso il led devono essere SICURI che i rubinetti sono chiusi :grinning_face_with_smiling_eyes:
Sai quante volte ti chiameranno, "c'e' una perdita! led acceso con rubinetti chiusi" poi si scopre che il figlio faceva la doccia :joy:
Ovvero tieni conto del comportamento degli umani. A volte fan di quelle caxxate...

si giusto ma penso che prima di chiamare controllino, intanto voglio sperimentarlo a casa mia, poi vedremo, solo che non mi da una mano nessuno.......

più o meno ho capito cosa vuoi ottenere

mi confermi che ti serve che il led si acceso fisso se c'è flusso d'acqua, e che si spenga diciamo 10 secondi dopo che il flusso si è interrotto?

Ah ok, allora ho capito.
Il tuo programma fa da "ripetitore" al flussometro che in alcuni modelli è già fornito di led a bordo.
Quando c'è flusso il led si vede intermittente. Quando non c'è flusso il led è acceso oppure spento (dipende dove si è fermata la girante all'interno del flussometro).
Quindi già vedere che la luce è intermittente significa che c'è un flusso, quindi rubinetto aperto oppure perdita.
Se poi vuoi fare due righe di programma solo per interpretare meglio il led allora basta che metti un timer attivato solo dall'impulso in salita oppure in discesa del flussometro e gli dai un ritardo di spegnimento di qualche secondo (dipende poi quanti impulsi ti da il tuo flussometro).

Si confermo, ma 10 secondi sono anche troppi.

Steve-cr il mio problema è proprio scrivere 2 righe di programma, e per questo ho chiesto aiuto.:slightly_smiling_face::slightly_smiling_face:

eh...
ma qualcosa devi fare tu, non possiamo fartelo noi...

Emmm ... hai presente il punto 16.1 del REGOLAMENTO (... che dovresti aver letto)?
Ecco ... dice tutto ... :roll_eyes:

Guglielmo

ciao a tutti, ho trovato lo sketch che fa per me qui nel sito ma ho un problema.
lo sketch funziona su Arduino mega 2560, mentre su Arduino nano 33 IoT non funziona.
Purtroppo non posso chiedere in quell'argomento perché chiuso. quindi chiedo a voi.
come mai non funziona?
grazie.
non è un problema hardware perché la nano l'ho testata con altri sketch.

byte statusLed    = 13;
byte sensorInterrupt = 0;  // 0 = digital pin 2
byte sensorPin       = 2;
float calibrationFactor = 4.5;
volatile byte pulseCount;  
float flowRate;
unsigned int flowMilliLitres;
unsigned long totalMilliLitres;
unsigned long oldTime;
void setup()
{
  Serial.begin(9600);
  pinMode(statusLed, OUTPUT);
  digitalWrite(statusLed, LOW); 
  
  pinMode(sensorPin, INPUT);
  digitalWrite(sensorPin, HIGH);

  pulseCount        = 0;
  flowRate          = 0.0;
  flowMilliLitres   = 0;
  totalMilliLitres  = 0;
  oldTime           = 0;
  attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
}
void loop()
{
   
   if((millis() - oldTime) > 1000)
  { 
     detachInterrupt(sensorInterrupt);
        
    flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
    oldTime = millis();
    flowMilliLitres = (flowRate / 60) * 1000;
    totalMilliLitres += flowMilliLitres;
    if (flowRate > 0.01) digitalWrite(statusLed,HIGH);
    else digitalWrite (statusLed,LOW);
    unsigned int frac;
    Serial.print("Flow rate: ");
    Serial.print(int(flowRate));  
    Serial.print("L/min");
    Serial.print("\t");     
    Serial.print("Output Liquid Quantity: ");        
    Serial.print(totalMilliLitres);
    Serial.print("mL"); 
    Serial.print("\t");       
    Serial.print(totalMilliLitres/1000);
    Serial.println("L");
    pulseCount = 0;
 attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
  }
}
void pulseCounter()
{
 pulseCount++;
}

Il pin associato all'interrupt non è un pin valido per attachInterrupt() con il nano IoT