funzioni matematiche

...ma ciao!
sto utilizzando un sensore a infrarosso della sharp, di quelli che restituiscono un uscita analogica inversamente proporzionale alla distanza.

ho realizato uno sketch per trasformare la lettura in distanza ma qualcosa non funziona, credo sia un problema di sintassi delel formule matematiche ma noncapisco perchè.
Qui il mio sketch:

float distFR;
int x;
float y;
void setup() {
  Serial.begin(9600);
}

void loop() 
{
  distFR=rilevadistanzaFR();
  Serial.println(distFR);
  delay (500);
}  

float rilevadistanzaFR()
{
  float distanzafrontale;
  x=analogRead(2);
  y= 31,8 + (160,7 * x);
  distanzafrontale= 2076 / (y - 11);
  return distanzafrontale;
}

Y resta sempre a 31,8 e di conseguenza distanzafrontale resta 103,8.
QUindi sembrerebbe che il valore di X non viene considerato nella formula sottostante ma che x sia 0.
Dove sbaglio?

dimenticavo di dire che se modifico cosi' il codice:

float rilevadistanzaFR()
{
  float distanzafrontale;
  distanzafrontale=analogRead(2);
  //y= 31,8 + (160,7 * x);
  //distanzafrontale= 2076 / (y - 11);
  return distanzafrontale;
}

vedo che la lettura analogica avviene correttamente.

ma nel codice per separare gli interi dai decimali usi il punto o la virgola? La sintassi corretta è usare il punto.

ma nel codice per separare gli interi dai decimali usi il punto o la virgola? La sintassi corretta è usare il punto.

Infatti, ma quel codice non dovrebbe neanche compilare correttamete, cioè dovresti ricevere degli errori in fase di verifica.

Ciao.

quoto

se poi il problema persiste trasforma x in un float

MauroTec:

ma nel codice per separare gli interi dai decimali usi il punto o la virgola? La sintassi corretta è usare il punto.

Infatti, ma quel codice non dovrebbe neanche compilare correttamete, cioè dovresti ricevere degli errori in fase di verifica.

Ciao.

..sapevo che era una ca...ta!!!

Anche io mi sarei aspettato che mi desse qualche errore di compilazione, invece probabilmenet con le virgole al posto dei punti messe dov'erano, si formava una sintassi valida.
Grazie a tutti dell'aiuto...so che dal titolo sembrava una cosa piu' interessante, sorry! :slight_smile:

Ciao, è la prima volta che uso questo forum, forse si capisce, ma penso sia il posto giusto per sottorvi un problema che non riesco a risolvere da 2 giorni.
Dovrei inserire in un programma questa formula per ottenere in uscita i valori di puntamento di una parabola. Secondo i dati di latitudine, longitudine GPS e latitudine del satellite, dovrei ottenere in uscita circa 172° di azimut e 39° di elevazione, cosa che dicono le tabelle e anche programmi tipo Satfinder.
Io invece ottengo 181 e 0 se inserisco la formula in Arduino e 157 e 32 se la implemento nel software Android.
(uso Arduino UNO r3, IDE 1.05)

ecco la formula:

v1 = 6,612 * cos(LAT)*cos(LONG-SATLONG)-1
v2 = 6,612 * sqrt(1-(cos(LAT)^2) * (cos(LONG-SATLONG))^2)
Elevazione = atan(v1/v2)
Azimut = 180 + atan( tan(LONG-SATLONG) / sin(SATLONG) )
POLARIZZAZIONE = -atan( sin(LONG-SATLONG)/tan(LAT) );

dove:
• LONG è la longitudine del luogo dove è posizionata la parabola;
• SATLONG è la longitudine del satellite;
• LAT è la latitudine del luogo dove è posizionata la parabola.
• sqrt è la radice quadrata
La costante 6,612 è pari al rapporto tra il raggio di un'orbita geostazionaria e il raggio terrestre.

e questo il programma:

/* calcolo elevazione e azimut immettendo i valori delle coordinate
latitudine,longitudine del GPS e longitudine satellite
*******************************************************************/
float orbita=6.612;
float latitudine=45.0400;
float longitudine=7.6600;
const byte longSAT = 13;
float v1;
float v2;
float elev;
float azimut;

void setup() {
  Serial.begin(9600);
  }

void loop() {
  v1=orbita*cos(latitudine)*cos(longitudine-longSAT)-1;
  float v2a = pow(cos(latitudine),2);
  float v2b = cos(longitudine-longSAT);
  v2=orbita*sqrt(pow(1-(v2a*v2b),2));
//  v2=orbita*sqrt(pow(1-(pow(cos(latitudine),2)*cos(longitudine-longSAT)),2));
  elev = atan(v1/v2);
  azimut = 180+atan(tan(longitudine-longSAT)/sin(longSAT));

Serial.print("v1.....: ");
Serial.println(v1);
Serial.print("v2.....: ");
Serial.println(v2);
Serial.print("v2a....: ");
Serial.println(v2a);
Serial.print("v2b....: ");
Serial.println(v2b);
Serial.print("Azimut.: ");
Serial.println(azimut);
Serial.print("Elevaz.: ");
Serial.println(elev);
Serial.print('\n');
delay(500);
}

apri una discussione a parte.

in generale:
i float di arduino (e anche i double, chein arduino sono float) NON hanno abbastanza precisione per lavorare con il GPS, se non in determenate situazioni.

In oltre è possibile che cos, sin, e compania bella siano meno corrette per ottimizzarte i tempi di esecuzione, mentre una CPU con più potenza di calcolo (e normalmente una FPU che in generale velocizza di molto i conti float, tanto che normalmente un calcolo più preciso con FPU può essere più veloce di un calcolo meno preciso via sofware) può permettersi di perdere qualche clock in più

Ricordati che le funzioni trigonometri lavorano in RADIANTI mentre generalmente gli angoli sono espressi in GRADI.
Il core di Arduino mette a disposizione 2 costanti predefinite, DEG_TO_RAD e RAG_TO_DEG.
Ad esempio:
v1 = 6,612 * cos(LAT)*cos(LONG-SATLONG)-1

diventa

float V1 = 6.612 * cos(LAT * DEG_TO_RAD) * cos((LONG-STALONG) * DEG_TO_RAD) - 1;

ecc

Grazie leo, non è che queste 2 funzioni, peraltro molto importanti siano tanto reclamizzate, comunque le ho provate così:

Prima:
azimut = 180+atan(tan(longitudine-longSAT)/sin(longSAT));
// risultato 181,27

Dopo:
azimut = 180+atan(tan((longitudine-longSAT)DEG_TO_RAD)/sin(longSATDEG_TO_RAD));
// risultato 179,71

Diciamo che se non è zuppa è pan bagnato ma pian pianino(molto pianino) ci stiamo avvicinando a 172°.
Lesto mi dice di aprire una discussione a parte, come si fa?
Come mai qui non va bene?
Grazie.

Con Arduino non avrai mai grosse precisioni sui numeri decimali.
Il compilatore supporta solo 6/7 cifre per i numeri float, ed i double (cioè i float a doppia precisione) non sono supportati: il compilatore accetta la dichiarazione ma li sostituisce con i float.

PS:
diciamo che la discussione sui numeri si potrebbe anche trattare in un thread a parte nell'area Software, visto che in questa si stava discutendo non proprio di questo