Ho creato al volo un breve codice.
Simulando la lettura dell'onda sinusoidale con la funzione Sin() , memorizzo l'ultima lettura in una variabile e la direzione dell'onda in un altra.
Per stabilire la direzione dell'onda (in salita o in discesa) confronto la lettura attuale con la precedente.
Se la direzione dei valori letti non cambia (sempre salita o sempre discesa) prosegue il ciclo con le letture.
Appena la lettura rivela che la direzione è cambiata lui aggiunge "1" al contatore. (c'è appena stato un picco)
Ovviamente i primi due valore li salto perché mi servono per stabilire in che modo l'onda sta partendo, in salita o in discesa.
Sub Process_Globals
'These global variables will be declared once when the application starts.
'These variables can be accessed from all modules.
Dim Count As Int
Dim Direzione As Int
Dim Ultimo As Double
End Sub
Sub Globals
'These global variables will be redeclared each time the activity is created.
'These variables can only be accessed from this module.
End Sub
Sub Activity_Create(FirstTime As Boolean)
'Do not forget to load the layout file created with the visual designer. For example:
'Activity.LoadLayout("Layout1")
Direzione=100
Count=0
For i=1 To 20
Conteggio(LetturaValori(i))
Log(i & ":" & LetturaValori(i))
Next
End Sub
Sub Activity_Resume
End Sub
Sub Activity_Pause (UserClosed As Boolean)
End Sub
Sub LetturaValori(i As Int) As Double
Return Sin((cPI*i)/5)
End Sub
Sub Conteggio(Valore As Double)
Select Direzione
Case 100
' lettura primo valore
Ultimo=Valore
Direzione=0
Case 0
''Ancora la direzione (ascesa o discesa) non é stata stabilita
If Ultimo<Valore Then
' inizia la lettura con una salita
Ultimo=Valore
Direzione=1
Else If Ultimo>Valore Then
' inizia la lettura con una discesa
Ultimo=Valore
Direzione=-1
Else
' valore uguale, NESSUNA OPERAZIONE,
End If
Case 1
' lettura precedenti in salita
If Ultimo<Valore Then
' Ancora in salita, nessun cambiamento
Ultimo=Valore
Else If Ultimo>Valore Then
' Cambiata direzione, conta un picco
Ultimo=Valore
Direzione=-1
Count=Count+1
Log("------------ " & Count)
Else
' valore uguale, NESSUNA OPERAZIONE,
End If
Case -1
' lettura precedenti in discesa
If Ultimo<Valore Then
' Cambiata direzione conta un picco
Ultimo=Valore
Direzione=1
Count=Count+1
Log("------------ " & Count)
Else If Ultimo>Valore Then
' Ancora in discesa, nessuna variazione
Ultimo=Valore
Else
' valore uguale, NESSUNA OPERAZIONE,
End If
End Select
End Sub
Non é molto raffinato ma da l'idea dell'algoritmo da sviluppare. Poi tu lo perfezionerai.
Una cosa da perfezionare ad esempio è se per errore di lettura alcuni valori arrivati potrebbero dare un falso picco.
Magari c'è una sequenza del tipo:
1.01
1.02
1.03
1.28 (imprecisione di lettura)
1.40
Questo si potrebbe perfezionare ...
Ma vado troppo di fretta.. alla prossima. Spero di esserti stato utile