perche questo sketch non legge gli impulsi sotto i 31 hertz

non riesco a venirne piu a capo =(

questo sketch quando imposto il tono sotto i 31 hertz sballa eppure dovrebbe andare meglio a prendere le letture di frequenza piu bassa ]:slight_smile:

se metto il tone tra 31- 1300 legge tutto benissimo con tono altre 1300 posso comprendere che fa fatica a leggere ma in basso proprio non ci arrivo

il pin 17 e 19 li ho uniti con una resistenza al volo (arduino uno)

unsigned long  tempoattuale;

unsigned long  tempoprecedente;           
long tempotrascorso = 0;       

int precisione ;  

byte frequenza2 =0;

byte melagiri =0;
byte peragiri =0;

int frequenza =0;




void setup(){

    Serial.begin(9600);
    pinMode(17, OUTPUT); 
   // pinMode(19, INPUT); 
    
   // digitalWrite  (19, HIGH);



}

void loop(){
  
 

  tone (17, 31);  
  
precisione = 1000;
if (analogRead(A5)>555 && melagiri ==0) (melagiri =1, frequenza = frequenza +1);

  if (analogRead(A5) < 555 ) melagiri=0;

if (peragiri == 0) tempoprecedente = millis(),  peragiri =1;

  if (analogRead(A5)>555 && melagiri ==0) (melagiri =1, frequenza = frequenza +1);

  if (analogRead(A5) < 555 ) melagiri=0;
  
 

if (millis() - tempoprecedente > 1000)Serial.print ("giri   "), Serial.println (frequenza), peragiri = 0 ;
//if (millis() - tempoprecedente > 1000)Serial.print ("giri   ")  peragiri = 0, frequenza = 0  ;




if (millis() - tempoprecedente > 1000)frequenza = 0  ;

Questo é un esempio di nomi variabili parlanti (ma parlano della frutta non di cosa significano le variabili), programmazione incasinata, Sketch dato incompleto (manca almeno una parentesi graffa finale) e interpretazione di sintassi Tua ma non quella del C.

Non hai bisogno di usare la lettura analogica del segnale, usa il digitale.

if (peragiri == 0) tempoprecedente = millis(),  peragiri =1;

Un IF senza parentesi graffe si riferisce solo alla funzione/istruzione seguente non a tutte della riga. peragiri =1; viene eseguito a ogni passaggio.

if (analogRead(A5)>555 && melagiri ==0) (melagiri =1, frequenza = frequenza +1);

Dicevo parentesi graffe non parentesi tonde.

ok, avevi un brutto giorno e dimentichiamo quel sketch. Ciao Uwe

Premesso che devi usare un pin digitale per leggere la frequenza, non ha senso usare l'ADC per questa cosa, non riesci a leggere nulla sotto i 31 Hz perch√© sotto questo valore la tone funziona male, p.e. con 30 genera una frequenza di circa 1.6 kHz. Dato che la tone usa il timer2 per generare le frequenze il limite minimo sono proprio i 31 Hz visto che il suo prescaler arriva 1:1024 e la sua risoluzione √® otto bit, un semplice conto ci dice che effettivamente non si pu√≤ andare sotto i 31 HZ, 16000000/1024 /256 = 61 Hz come velocit√† minima cambio stato pin, dato che servono due semiperiodi per ottenere per ottenere un'onda quadra la reale frequenza minima sono 30.5 Hz. Anche in questo caso il reference √® carente di informazioni visto che non riporta il limite minimo, solo quello massimo inteso come il numero pi√Ļ grosso rappresentabile con un unsigned int, ovvero 65535 Hz.

ok allora il sospetto mi era venuto (giuro) :) ho messo il blink senza delay nello sketc e selezionato il pin 17 come ledoutput, (eliminato il tone)

cosi legge bene anche gli impulsi bassi :)

per il fatto di adoperare l'analogRead la trovo molto comodo prendere il segnale da cose analogiche che variano poco il suo valore, si puo sempre impostare la soglia, non devo superare i 46 Hertz come lettura

uwefed: Questo é un esempio di nomi variabili parlanti (ma parlano della frutta non di cosa significano le variabili), programmazione incasinata, Sketch dato incompleto (manca almeno una parentesi graffa finale) e interpretazione di sintassi Tua ma non quella del C.

Non hai bisogno di usare la lettura analogica del segnale, usa il digitale.

if (peragiri == 0) tempoprecedente = millis(),  peragiri =1;

Un IF senza parentesi graffe si riferisce solo alla funzione/istruzione seguente non a tutte della riga. peragiri =1; viene eseguito a ogni passaggio.

if (analogRead(A5)>555 && melagiri ==0) (melagiri =1, frequenza = frequenza +1);

Dicevo parentesi graffe non parentesi tonde.

ok, avevi un brutto giorno e dimentichiamo quel sketch. Ciao Uwe

beh... i nomi di frutti li metto come semplici segnali/bandierine per farli passare da zero a uno o (qualcosa di molto semplice)

per il fatto di adoperare l'analogRead la trovo molto comodo prendere il segnale da cose analogiche che variano poco il suo valore,

il fatto delle parentesi graffa (adesso verifico ]:D ) , ero convinto che le cose separate da virgola venivano eseguite una appresso all'altra), ne ho quasi la certezza, altrimenti questa riga stamperebbe solo la prima cosa e invece fa tutto il resto

if (millis() - tempoprecedente > 1000) Serial.print ("giri "), Serial.println (frequenza), peragiri = 0 ;