Flussometro e accensione led

Ciao a tutti. Vorrei chiedere se potete aiutarmi a compilare il codice per Arduino uno r3. Ho un flussometro che se non manda il segnale vorrei che partisse un led.. Praticamente in assenza di alcun flusso.. Per poi farlo spegnersi se il flusso si riprende..
Un'altra cosa è che dovrebbe funzionare con sola batteria,quindi senza il pc, al limite collegherò una presa USB al posto della batteria ma solamente per alimentare l'Arduino, quindi niente serial. Come devo impostare il boot? Io per ora ho questo code che non include il funzionamento del led che, come già detto, si dovrà attivare quando il segnale proveniente dal flussometro è nullo
Code qui sotto

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, HIGH); 
  
  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))); 
    oldTime = millis();
    flowMilliLitres = (flowRate / 60) * 1000;
    totalMilliLitres += flowMilliLitres;
    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.println("mL"); 
    Serial.print("\t");       
  Serial.print(totalMilliLitres/1000);
  Serial.print("L");
    pulseCount = 0;
 attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
  }
}
void pulseCounter()
{
 pulseCount++;
}

ragazzi ,proprio nessuno?:(:(:frowning:

Ma quel sketch Ti funziona?

Per accendere un LED fai:

If (flowRate < 0,01) digitalWrite(LEDpin,HIGH);
else digitalWrite (LEDpin,LOW);

Ho preso il valore 0,01 a caso. Puó essere necessario che Tu lo modifichi per il Tuo sketch.

Ciao Uwe

< 0.01 (punto per le virgole nel codice)

uwefed:
Ma quel sketch Ti funziona?

Per accendere un LED fai:

If (flowRate < 0,01) digitalWrite(LEDpin,HIGH);

else digitalWrite (LEDpin,LOW);




Ho preso il valore 0,01 a caso. Puó essere necessario che Tu lo modifichi per il Tuo sketch.

Ciao Uwe

ciao , scusami , l'ho corretto . adesso funziona !!

nid69ita:
< 0.01 (punto per le virgole nel codice)

Corretto , ha funzionato con ".'. grazie
Come posso fare per farlo lampeggiare il led ? nella stessa condizione

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(GREEN,HIGH);
    else digitalWrite (GREEN,LOW);

Non semplice, devi usare una variabile di stato, a vero farai eseguire (in base ad un altro if(stato==vero) la parte di codice che accende/spegne il led
Forse più semplice usare un led che già da solo lampeggia. non costano molto.

nid69ita:
Non semplice, devi usare una variabile di stato, a vero farai eseguire (in base ad un altro if(stato==vero) la parte di codice che accende/spegne il led
Forse più semplice usare un led che già da solo lampeggia. non costano molto.

Ho provato questo ma da' l'errore di esecuzione
if (ledState == LOW &&((flowRate < 0.01)) (digitalWrite(GREEN,HIGH));
{
ledState = HIGH;
}

else digitalWrite (GREEN,LOW);

sicuramente sara' piu' facile usare un led lampeggiante . Ma volevo arrivarci con il code

if (ledState == LOW &&((flowRate < 0.01)) (digitalWrite(GREEN,HIGH));
    {
    ledState = HIGH;
    }
   
    else digitalWrite (GREEN,LOW);

eh certo stai facendo un errore grosso. cosa ha che fare il (digitalWrite(GREEN,HIGH) in quella posizione? conta il numero di parentesi aperte e quelle chiuse.

dove metti il ledState a low?

Ciao Uwe

Cosi come sintassi è corretta:

if (ledState == LOW && flowRate < 0.01) 
{ digitalWrite(GREEN,HIGH);
  ledState = HIGH;
}
else 
{ digitalWrite (GREEN,LOW);
}

La logica mi pare invece errata. Hai intuito qualcosa, ovvero usare la variabile ledState.
Però già il nome è fuorviante. A te non interessa lo stato del led. Lo stato deve essere vero/falso se se in situazione d'allarme, ovvero se il flusso è < 0.01
Nel tuo codice iniziale, invece del digitalWrite() high o low sul led, al posto metti uno statoAllarme=HIGH o LOW. Quindi lì, scateni il setting dell'allarme o lo togli.
Fuori da quel pezzo di codice del controllo flusso, prima della graffa di chiusura della loop metti un pezzo di codice che analizza statoAllarme e se HIGH ti occupi del led. Come far lampeggiare un led senza delay? Usando la millis(), vedi esempio BlinkWithoutDelay.
Allo scattare dell'allarme quindi devi far partire un altro contatore in base a millis, quindi integri quell'esempio blinkwithoutdelay dentro al tuo codice (parte finale prima della chiusura loop)

Suggerimento ... cambia ledState in base al valore del flusso ... POI, in un'altro if, fai if ledStatr == 1, e li dentro esegui il codice del lampeggio (ad esempio, quello del blink without delay, tanto per dirne uno) ... se proprio vuoi fare le cose complete, usi un'if-else ... l'if esegue il lampeggio se ledState e' 1, l'else spegne il led se ledState e' zero ... :wink:

grazie mille, ma gli esempi sono troppo difficili . Ecco trovato uno che e' quasi troppo semplice e funzionante

if (flowRate < 0.01)
      if (ledState == LOW)
    ledState = HIGH;
      else
    ledState = LOW;
    else
  ledState = LOW;

Si, funziona occhio però che il blink del led è ogni 1 secondo dato dal intervallo della if iniziale, intervallo che penso è da 1 secondo per ... qualcosa riguarda la lettura del flussometro ? Quindi hai la lettura ogni 1 secondo del flusso e il blink ogni 1 secondo coincidenti. Se vuoi intervalli diversi, sei fregato.

nid69ita:
Si, funziona occhio però che il blink del led è ogni 1 secondo dato dal intervallo della if iniziale, intervallo che penso è da 1 secondo per ... qualcosa riguarda la lettura del flussometro ? Quindi hai la lettura ogni 1 secondo del flusso e il blink ogni 1 secondo coincidenti. Se vuoi intervalli diversi, sei fregato.

Esattamente, quel mille del if del loop è il controllore del intervallo di lettura, se lo imposto a 30 lampeggia che sembra essere fisso il led... E i valori sul serial non cambiano (lettura da pc)