problema sketch

voglio fare la tenda da sole motorizzata e comandata da arduino.
ho preso un sensore luce e uno vento ed ho scritto il seguente codice :

int pin_vento = 7;
int  m_avanti = 11;
int m_indietro= 3;
unsigned long vento;
int luce = 0;


void setup() {
  pinMode(pin_vento, INPUT);
  pinMode(m_avanti, OUTPUT);
  pinMode(m_indietro, OUTPUT);
}
void loop() {
  luce = analogRead(A0);
  do {
  vento = pulseIn(pin_vento, LOW);
  } while (vento > 500000);
   
  if ( (luce > 350) && (vento > 500000) ) {
    digitalWrite(m_indietro, LOW);
    digitalWrite(m_avanti, HIGH);
  }
   
  if ( (vento < 500000) && ( luce > 350) ) {
      digitalWrite(m_avanti, LOW);
      digitalWrite(m_indietro, HIGH);
    
  }

delay(1000);
}

l'unico problema è che mi rimane sempre "aperto" non è una brutta cosa...l'unico problema è quando c'è il vento che me la scassa tutta XD

 do {
  vento = pulseIn(pin_vento, LOW);
  } while (vento > 500000);

finchè vento <= 500000 non uscirà mai dal while e quindi non eseguirà mai il resto del codice
io ti consiglio di togliere il while e fare solo una pulseIn

if ( (luce > 350) && (vento > 500000) ) {
    digitalWrite(m_indietro, LOW);
    digitalWrite(m_avanti, HIGH);
  }

se lasci il while non è necessario controllare che (vento > 500000), perchè se il codice è uscito dal while vento è sicuramente >500000

if ( (vento < 500000) && ( luce > 350) ) {
      digitalWrite(m_avanti, LOW);
      digitalWrite(m_indietro, HIGH);
    
  }

per lo stesso motivo cui sopra, questo if sarà sempre falso se lasci il while.

ps. la variabile "luce" non viene mai aggiornata, quindi vale sempre 0... è un errore o semplicemente è un'aggiunta per un sensore che aggiungerai dopo?
pps. ma sei sicuro che il vento lo leggi solo con una pulseIn? che sensore usi?

..altro appunto:

if ( (luce > 350) && (vento > 500000) ) {
    digitalWrite(m_indietro, LOW);
    digitalWrite(m_avanti, HIGH);
  }
   
  if ( (vento < 500000) && ( luce > 350) ) {
      digitalWrite(m_avanti, LOW);
      digitalWrite(m_indietro, HIGH);
    
  }

metti in && la variabile legata alla velocità del vento con con quella legata alla luminosità: non ti ripari da casi particolari.
Es: se di notte tira vento (e hai la tenda aperta), la tenda non si chiude :smiley:

Io ragionerei in questo modo:
Di giorno la tenda esce, di notte rientra.
Se tira vento forte, chiude la tenda - indipendentemente dal fatto che sia giorno o notte.

Ho 2 tende su 2 terrazze, di cui una a carrozza, quindi sensibile al vento: mi protegge la terrazza anche dall'acqua ma se tira vento forte la sollevo per evitare sorprese (me l'hanno garantita anti-bufera ma i soldi io non li trovo sull'albero :wink: ).
Se c'è sole o pioggia ma senza vento la tenda la lascio giù, sia che sia giorno sia che sia notte, perché di notte mi ripara dalla guazza notturna.

la variabile luce l'aggiorno con questa riga di comando sotto a loop:

luce = analogRead(A0);

il sensore del vento è un sensore ad impulsi.

quindi dite che mi conviene togliere whild?? non è che poi mi ridà valori sballati il sensore??

i valori sballati te li da lo stesso anche con while, il ragionamento manca di logica..

per il resto ok

Esatto. E' il codice che è da rivedere, non c'entra l'uso di if o di while.

ok però perchè mi dite che la variabile luce non si aggiorna??

Intanto devi capire come funziona la... funzione loop() di Arduino. Essa è, come fa capire il nome, eseguita all'infinito, in un ciclo continuo.
Ma tu scrivi all'inizio di essa:

  luce = analogRead(A0);
  do {
  vento = pulseIn(pin_vento, LOW);
  } while (vento > 500000);

Con questo codice fai una lettura della luce e poi entri in un ciclo da cui puoi uscire solo se vento sarà maggiore di 500000. Quindi, se non tirerà mai vento, tu rimarrai intrappolato in quel ciclo per ore se non giorni o settimane, sia di giorno che di notte.

ok tolgo il whild faccio delle prove poi vi darò i risultati.

Grazie a tutti :slight_smile:

Sto realizzando una cosa simile,
Un semplice anemometro che controlla un relé per la sola chiusura in caso di forte vento.
Però non sempre funziona. Non so se dipende dalla circuiteria o dal software.
Per ora ho attaccato un led
Ho preso spunto dal tuo progetto:
Int pinvento=7
Int pinled=10
Unsigned long vento
Setup
Pinmode(pinvento,input)
Pinmode(pinled,output)
Loop
Vento=pulsein(pinvento,low)
If(vento>1000)
Digitalwrite(pinled,high)
Else
Digitalwrite(pinled,low)
Funziona ma credo non sia preciso, ci sono dei momenti in cui il led si ccende per un istante anche se le palette girano piano.
Per il collegamento ho messo una resistenza da 10k tra il pin di uscita e la massa

hai risolto poi?

Ma la piantiamo di andare a ripescare threda vecchi di ANNI e porre domande ?

Aprite thread nuovi ... e lasciare stare questi vecchi thread a cui nessuno più risponde !

Guglielmo

calasci:
hai risolto poi?

Dopo 5 anni e mezzo, a quest'ora la tenda gli ha fatto la muffa e l'ha buttata...

paulus1969:
Dopo 5 anni e mezzo, a quest'ora la tenda gli ha fatto la muffa e l'ha buttata...

ahahah