Italian Banalità....

Spectre

Active Member
Licensed User
Ciao a tutti sono Spectre nuovo utente...
Una banalità forse... ma venendo da VB.Net e C++ a volte sbatto la testa.
Devo dichiarare questo variabile come float e dargli un valore.

float y = 4.5f;

Come si dichiara in b4a???

Grazie mille...
 

lock255

Well-Known Member
Licensed User
Se ho ben capito la tua domanda, la risposta dovrebbe essere:
B4X:
Dim y As Float
 

Spectre

Active Member
Licensed User
Se ho ben capito la tua domanda, la risposta dovrebbe essere:
B4X:
Dim y As Float
Ciao, scusa non la dichiarazione... ahha fino li diciamo che ci arrivo...
Quando attribuisco il valore, mi da errore...

B4X:
dim Y as Float
y = 4.5f;
 

Spinter

Active Member
Licensed User
dim Y as Float
y = 4
dim pippo as string
pippo="ciao"
dim pippo as string
pippo=1
dim pippo as int
pippo=10
 

Spectre

Active Member
Licensed User
dim Y as Float
y = 4
dim pippo as string
pippo="ciao"
dim pippo as string
pippo=1
dim pippo as int
pippo=10
Non ci siamo capiti......

Devo attribuire quel valore alla variabile Float Y....

Posto il codice....
B4X:
Dim  m_FilteringFactor As Float
    m_FilteringFactor=  4.5f;
    Dim m_Value As Float
    Float m_Value = 0.0f
    Dim m_Value As Double
    Dim i_Value As Double
    i_Value=Values(0)
   
    m_Value =  m_Value * (1.0f - m_FilteringFactor) + i_Value * m_FilteringFactor;
 

LucaMs

Expert
Licensed User
Una volta dichiarata la variabile come float, l'assegnazione:

var = 0.5

Tutto qua

(tutte quelle f non servono, non so nemmeno se siano accettate dal compilatore)
 

Spectre

Active Member
Licensed User
A vole la
Una volta dichiarata la variabile come float, l'assegnazione:

var = 0.5

Tutto qua

(tutte quelle f non servono, non so nemmeno se siano accettate dal compilatore)
A volte si cerca quello che con la semplicità si ottiene.....

Garzie...
 

lock255

Well-Known Member
Licensed User
Aahahah ho riscritto il codice su B4A non l'ho messa e non mi dava errore, non mi ero accorto della virgola a forza di vedere codici in C e Java mi era sfuggita.
 

Spectre

Active Member
Licensed User
Ummm... però ripensandoci mi sa che non funzia senza quei valori....
Avete un'idea per un filtro da applicare al sensore magnetico?
 

LucaMs

Expert
Licensed User
Una delle cose belle di b4a (e delle varie versioni di basic) è proprio l'editor: ma quanto è brutto Java, con quelle graffe, quei punti e virgola? :)

Il mio glorioso smartphone di marca italiana non conosce sensori, è insensibile, quindi anche quello magnetico: sto fetente, manco il GPS gli funziona, anche se quello ce l'ha (scusate lo sfogo, prima o poi lo frullo contro un muro, hehehe).

Posso solo dirti, quindi, che le variabili dichiarate in quel modo, funzionano.

Se mi spieghi meglio cosa vuoi ottenere, forse posso tentare di darti una mano.

Cosa dovrebbe fare questa riga?
B4X:
m_Value =  m_Value * (1.0f - m_FilteringFactor) + i_Value * m_FilteringFactor;
che poi sarebbe:
B4X:
m_Value =  m_Value * (1 - m_FilteringFactor) + i_Value * m_FilteringFactor
 

Spectre

Active Member
Licensed User
Ciao.... I dati Row o "grezzi" del sensore magnetico sono molto variabili, quindi se applicati direttamente a qualsiasi forma di lettura o altro rendo la app molto poco affidabile, ad esempio se leggo il campo magnetico o l'azimuth value(0) del sensore magnetico si avranno continue oscillazioni.
Volevo applicare a questi dati un filtro in modo da livellare la curva dir risposta del sensore, e quindi avere letture meno instabili, invece di continui numeri che oscillano anche a tel fermo. L'esempio sopra è un filtro bassa basso che dovrebbe fare appunto questo.
Non volevo applicare un timer di lettura, che lo tengo come ultima risorsa. Vi posto una altro esempio di AVG (media) dei dati che anche lui funziona male.
Credevo che esistesse già nativamente un filtro da applicare come ad esempio su piattaforma.
 

LucaMs

Expert
Licensed User
Quindi, il problema non sta in b4a o nelle variabili float, ma in una formula che stai cercando di ricavare.

Da quel poco che ho capito, "i dati arrivano anche a tel fermo"; e questi saranno, immagino, valori molto più bassi di quando il tel è in movimento.
Quindi, penso che dovresti usare degli arrotondamenti:

Round2(n, x) where x=number of decimal places

Cmq, ti consiglio di postare la domanda nel forum generale in inglese, forse qualcuno avrà già affrontato il problema.
Oppure cercare sul Web, dato che è una questione più generale sui sensori, più che di linguaggio utilizzato.

Mi spiace non poterti aiutare di più.

Ciao
 

klaus

Expert
Licensed User
What exactly doesn't work ?
The equation is a low pass filter for a series of values. Look at the bottom of this wikipedia page, in english, the italian page doesn't show the equations.
How do you use it ?

Instead of the code in post #6 try this code:
B4X:
Dim  m_FilteringFactor, m_Value As Double

m_FilteringFactor =  4.5
m_Value = 0
m_Value =  m_Value * (1 - m_FilteringFactor) + Values(0) * m_FilteringFactor
Don't use Float use Double, internally B4A calculates with Doubles..
You can use the NumberFormat function for the display.
You may also 'play' with the FilteringFactor.

Sorry, I don't speak italian.
 

lock255

Well-Known Member
Licensed User
What exactly doesn't work ?
The equation is a low pass filter for a series of values. Look at the bottom of this wikipedia page, in english, the italian page doesn't show the equations.
How do you use it ?

Instead of the code in post #6 try this code:
B4X:
Dim  m_FilteringFactor, m_Value As Double

m_FilteringFactor =  4.5
m_Value = 0
m_Value =  m_Value * (1 - m_FilteringFactor) + Values(0) * m_FilteringFactor
Don't use Float use Double, internally B4A calculates with Doubles..
You can use the NumberFormat function for the display.
You may also 'play' with the FilteringFactor.

Sorry, I don't speak italian.
Excellent as always, we would be honored to see you more often in the Italian forum :)
 

Spectre

Active Member
Licensed User
Hi Klaus... I already tried with the filter and with other readings, and still get very unstable ...
 

klaus

Expert
Licensed User
Do you have an example, on what you get and what you want ?
Or better a small test program to test ?
 

Spectre

Active Member
Licensed User
I move on to not disturb the general forum here ..

I just need to get the sensor readings magnets more stable and precise as it continues to move forward even when stationary.

Code module: Global



B4X:
Sub Sensor_SensorChanged (Values() As Float)

MylblDeg.text=MovingAVG(values(0))

end sub


Sub MovingAVG(MagneticRow As Float)

    ' ******************FILTER SENSOR *********************************************************
    CurValue=Round2(MagneticRow,1)
    If CurValue = OldValue  OR CurValue + 0.1 = OldValue OR CurValue - 0.1 = OldValue Then

        Return Glob_SensorFilter
    Else
        Glob_SensorFilter = (Glob_SensorFilter * Glob_MayFilter) + (MagneticRow * (1.0 - Glob_MayFilter))
        OldValue=CurValue
        Return Glob_SensorFilter
    End If
End Sub
 
Top