Proteggi tende

Sto realizzando un proteggi tende da sole o tapparelle ecc che al momento funziona solo c’è forte vento ma si potrebbe implementare con un sensore pioggia e sole, solo per l'abbassamento automatico.
Al momento ho un anemometro della NICE VOLO 17€ via filo nella descrizione riporta:
costante vento ( impulsi/s/km/h) = 0,25
Al momento comanda un relé per la sola chiusura in caso di forte vento.
Però Ho notato che non sempre funziona.
Non so se dipende dalla circuiteria o dal software.
Per ora ho attaccato un led

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 ci sono dei momenti in cui il led si ccende per un istante anche se le palette girano piano, ma veramente piano
Per il collegamento ho messo una resistenza da 10k tra il pin 7 di uscita e la massa, purtroppo non vi è riportato altro nelle istruzioni. Potrei provare a mettere l'ingresso del sensore a +5v e l'uscita in ingresso al pin 7 senza resistenze ecc, mo non vorrei danneggiare qualcosa.
Secondo voi che puo essere?

sembrano delle interferenze, l'anemometro è lontano da Arduino?
puoi provare a leggere più volte:

unsigned long windspeed()
{
    unsigned long s = pulseIn(pinvento,0);
    s += pulseIn (pinvento,0); 
    s >>= 1;
    s += pulseIn (pinvento,0);
    s >>= 1;
    s += pulseIn (pinvento,0);
    s >> = 1;
    return s;
}

loop()
{
    if ( windspeed() > 1000 )
        digitalWrite(pinled,1);
    else
        digitalWrite(pinled,0);
}

così usi la media, ma potresti riscrivere la funzione windspeed in modo che ritorni 1 solo se leggi n volte valori superiori alla soglia.

anche un condensatore ( 0,1µF ) , in parallelo alla resistenza, aiuta

dici che fa interferenze il sensore?
Credo che ci sia uno di quei sensori per allarmi dentro, con un piccolo magnete...provero a metterlo piu distante e ad usare la tua funzione.
L'ideale sarebbe inserire un contatore in una funzione millis, esempio se mi conta 4 o piu impulsi in 1 secondo ho il led che si accende.
Quali funzioni potrei usare e in che modo le devo accoppiare?
Non mastico ancora bene il linguaggio

Ho provato con le tue istruzioni ma non risolvo niente è praticamente uguale.
Vorrei usare la funzione millis.
Come faccio?
Vorrei scrivere un comando del genere.
Se ci sono piudi 4 in 1secondo allora si accende il led
Non c'è un manuale di come si utilizzano le funzioni?

innanzi tutto, come hai collegato il sensore ?
Presuppongo che abbia due fili, uno lo hai collegato al pin 7 e hai messo una resistenza da 10K verso il GND.
E l'altro capo lo hai collegato al +5V ?
Perche' se è cosi', questo passaggio è errato

Vento=pulsein(pinvento,low)

If(vento>1000)

Comunque in genere per gestire la cosa si usano gli Interrupt
Con il seguente sketch ad esempio conti quante volte il sensore viene attivato dal magnetino in un tempo prefissato, mentre con la pulseIn() vedi solamente il tempo impiegato per un giro ( rimbalzi del sensore permettendo, ecco perchè ti avevo suggerito di aggiungere almeno un condensatore in parallelo alla resistenza )

volatile int count = 0;
unsigned long previousMillis = 0;
const long interval = 1000; // intervallo in mS
const byte pinled = 10 ;
int allarme_giri = 4 ;

void setup() {
  Serial.begin (115200);
  pinMode (pinled, OUTPUT);
  // Si abilita l'Interrupt al pin 2, ad eseguire la routine int_rout ogni volta
  // che il magnete passa sul sensore
  attachInterrupt(0, int_rout, RISING);
}

void loop() {
  if (millis() - previousMillis >= interval) { // è trascorso l'intervallo
    Serial.println(count); 
    if (count >= allarme_giri ) { // 4 giri = 1 Kmh
      digitalWrite (pinled, HIGH);
    }
    else {
      digitalWrite (pinled, LOW);
    }
    count = 0 ; // azzera la variabile per un nuovo conteggio
    previousMillis = millis();
  }
} // Fine Loop

// Routine eseguita ad ogni giro
void int_rout() {
  count ++ ;
}

Ho messo il condensatore come mi hai detto, il resto del cablaggio è corretto.
Ma la serial begin a che serve?

ho provato a caricare il tuoi dati ma mi da questo errore

collect2.exe: error: ld returned 5 exit status
Errore durante la compilazione

non riesco a capire il tuo file, scusami ma è troppo per le mie conoscenze?
il sensore ora dove lo collego?
vedo che hai scritto:
pinMode (pinled, OUTPUT);
// Si abilita l'Interrupt al pin 2, ad eseguire la routine int_rout ogni volta
quindi lo devo collegare al pin 2?
poi ho notato che se inserisco l'ultima parte del file, windows si blocca e mi da errore
void int_rout() {
count ++ ;
}
non è che mi spiegheresti cosa hai creato?
grazie

Si, va collegato sul pin2

Sul fatto che ti da' errore in compilazione non ho idea di come mai ti succeda, è un codice legittimo e senza niente di particolare.
Mai visto vericarsi codesto errore, ma cercando ho trovato questa discussione

se ti da' errore nelle tre righe finali, prova a cambiare qualcosa, anche solo ad aggiungere degli spazi

unsigned long windspeed()
{
    #define TENTA 4
    #define OFFSET 50

    static unsigned long lastr = 0;
    static byte safe = TENTA;
    
    unsigned long s = pulseIn(pinvento,0);
    
    if ( lastr = 0 )
    {
        lastr = s;
        return 0;
    }
    
    unsigned long m = lastr < OFFSET ? 0 : lastr - OFFSET;
    if ( s > m && s < lstr + OFFSET )
    {
        --safe;
        if ( 0 == safe )
        {
            safe = TENTA;
            lastr = 0;
            return s;
        }
        return 0;
    }
    safe = TENTA;
    lastr = 0;
    return 0;
}

Cambiando il numero in TENTA cambi quante volte controllare che il valore sia in un range chiamato OFFSET dal valore precedentemente letto.
Fai dei tentativi.

hai hai hai....certo che siamo passati da un semplice software e una qualcosa di mostruoso...
io non sono cosi bravo. comunque faccio dei tentativi.
vi aggiorno.
comunque grazie tante

non riesco a far funzionare nessuno dei due software.
con il primo, ho errore di windows id.exe
il secondo invece non me lo carica su arduino.
io ho un arduino mega 2560 come software di programmazione ho una versione 1.6.5
non so proprio.
provo a cancellare il collector2.exe

ho notato che avevo scritto due errori

unsigned long windspeed()
{
    #define TENTA 4
    #define OFFSET 50

    static unsigned long lastr = 0;
    static byte safe = TENTA;
    
    unsigned long s = pulseIn(pinvento,0);
    
    if ( lastr == 0 )
    {
        lastr = s;
        return 0;
    }
    
    unsigned long m = lastr < OFFSET ? 0 : lastr - OFFSET;
    if ( s > m && s < lastr + OFFSET )
    {
        --safe;
        if ( 0 == safe )
        {
            safe = TENTA;
            lastr = 0;
            return s;
        }
        return 0;
    }
    safe = TENTA;
    lastr = 0;
    return 0;
}

prova quello, poi se hai ancora errori posta l’intero firmware ed il log del compilatore.
è inutile cancellare il programma Collect2, è ld (il linker) che da errore.

non sono esperto del sistema, mi arrangio come posso. sta di fatto che questo errore si genera solo con determinati file.
comunque anche eliminando collect2 le cose non sono cambiate.
vbextreem scusami ma credo di non saper usare molto bene questo aggeggio.
non so come formattare il tuoi file. scusami ma non ci capisco niente.

Pietroruta:
comunque anche eliminando collect2 le cose non sono cambiate.

Cosa NON è cambiato ? Di sicuro non può più darti l'errore ad esso relativo ... ::slight_smile:

Guglielmo

Pietroruta:
non so come formattare il tuoi file. scusami ma non ci capisco niente.

Non sarà che ... stai facendo il passo più lungo della gamba ?

Non è meglio cominciare con qualche cosa di più semplice ? Almeno ti impratichisci bene con Arduino ed il suo linguaggio di programmazione e poi ... ti riavvicinerai, sicuramente più produttivo, al tuo programma. :slight_smile:

Guglielmo

anche eliminando collect2 le cose non sono cambiate

continua cioe' a darti il solito errore di Windows ?

ld.exe c'è ancora. ma negli errori vedo solo errore di compilazione

volatile int count = 0;
unsigned long previousMillis = 0;
const long interval = 1000; // intervallo in mS
int pinled = 10 ;
int allarme_giri = 4 ;

void setup() {
Serial.begin (115200); // Si abilita l'Interrupt al pin 2, ad eseguire la routine int_rout ogni volta che il magnete passa sul sensore
pinMode (pinled, OUTPUT); // pin led output
attachInterrupt(0, int_rout, RISING);
}
void loop() {
if (millis() - previousMillis >= interval) { // è trascorso l'intervallo
Serial.println(count);
if (count >= allarme_giri ) { // 4 giri = 1 Kmh
digitalWrite (pinled, HIGH);
}
else {
digitalWrite (pinled, LOW);
}
count = 0 ; // azzera la variabile per un nuovo conteggio
previousMillis = millis();
}
} // Fine Loop
void int_rout() { // Routine eseguita ad ogni giro
count ++ ;
}