Go Down

Topic: perche questo sketch non legge gli impulsi sotto i 31 hertz (Read 575 times) previous topic - next topic

gingardu

Nov 05, 2012, 08:56 am Last Edit: Nov 05, 2012, 09:00 am by gingardu Reason: 1
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  ]:)

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)

Code: [Select]

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  ;



 
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

uwefed

#1
Nov 05, 2012, 09:27 am Last Edit: Nov 05, 2012, 09:29 am by uwefed Reason: 1
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.
Code: [Select]
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.
Code: [Select]
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

astrobeed

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.


gingardu

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
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

gingardu


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.
Code: [Select]
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.
Code: [Select]
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 ;
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Go Up