Go Down

Topic: E' possibile ottenere un pdf del Reference e l'elenco totale dei comandi? (Read 2 times) previous topic - next topic

PaoloP

Secondo me quello che ti serve è una piccola funzione che ti scali il valore in base alle tue esigenze.
Potresti creare una classe che ragiona in questo modo

parteintera = converti.intero(unsigned long, scala) // dove per scala metti KILO, MEGA, GIGA CHE VARREBBERO 3, 6 E 9. si possono usare dei define
partedecimale = converti.decimale(unsigned long, scala)

il metodo non dove fare altro che contare le cifre del numero originale e dividerla nei due campi.

In questo modo non modifichi il valore di partenza ma hai le due parti da mostrare su display o su seriale.
Credo non ti serva l'oggetto String.

Chiedo ovviamente l'aiuto degli utenti del forum.  :smiley-red:
Io le classi ancora non le ho bene affrontate.  :smiley-sweat:

per stampare ad esempio su lcd faresti
Code: [Select]
lcd.print(converti.intero(unsigned long, scala));
lcd.print(".");
lcd.print(converti.decimale(unsigned long, scala));


Manca solo tutto il resto del codice...  :smiley-mr-green:

EDIT2: Mi correggo.... basterebbe anche una funzione con passaggio di tre parametri.
Code: [Select]
lcd.print(converti(INTERO, unsigned long, scala));
lcd.print(".");
lcd.print(converti(DECIMALE, unsigned long, scala));
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

gpb01


Allora inizio a cercare un testo sul C ANSI. P.es. ciò che mi sta facendo perdere la testa è la scarsissima precisione del float e sulla double è scritto chiaramente che è presente per compatibilità ma è identica alla float. Alllora ho pensato che in realtà io le letture le faccio su INTERI (10 cifre espresse in Hz), volendo poter leggere le frequenze anche in k e M, invece di fare una divisione x1000.0 o per 1000000.0, mi basterebbe infilare un "." al posto giusto e manterrei la precisione all'Hz anche nelle letture di valori in GHz. Quindi trasformo l'INT in string, leggo la lunghezza, ed in base alla scala attuale e quella di destinazione aggiungo il "." dopo la 3a o 6a cifra a partire da dx, aggiungendo "0" davanti se necessario (penso alla lettura di 1Hz sulla scala kHz, p.es.). Con le funzioni del Qbasic avrei impiegato un secondo, qui non c'è soluzione :smiley-sad-blue:

Buonasera,
forse questo link, e la relativa libreria, potrebbero risolvere i tuoi problemi con numeri piuttosto "grossi" : http://arduino.cc/forum/index.php/topic,85692.0.html ... o almeno spero ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

Michele Menniti

:smiley-sweat: io parlo di stringhe perché quelle le so manipolare, se esistono altri etodi diretti sulle cifre per me è uguale; non capisco come trasformare un numero a 6 cifre in un numero a 3 cifre, moltiplicando quest'ultimo per mille mi ricaverei i decimali.
Es. lettura 123456Hz da convertire in kHz (123.456kHz)
Se riesco ad estrapolare 123 (interi) lo moltiplico x 1000 (123000) e lo sottraggo all'originale ottenendo i decimali (123456-123000=456); ma da qui in avanti sempre di stringa dovrei lavorare, la verità è che non ho capito molto della tua idea :D

@ Guglielmo: grazie! mi sembra estremamente interessante, anche se forse eccessivo per ciò che devo fare io, provo a dargli un'occhiata :)
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

PaoloP

Devo uscire... continuo dopo

Code: [Select]
#define INTERO (byte)0
#define DECIMALE (byte)1
#define KILO (byte)3
#define MEGA (byte)6
#define GIGA (byte)9

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

void loop() {
  Serial.print(convert(INTERO, 112347293, MEGA));
  Serial.print(".");
  Serial.print(convert(DECIMALE, 45235424, KILO));
  delay(10000);
}

unsigned long convert(byte t, unsigned long n, byte s)
{
  byte len = 0;
  unsigned long x = n;
  do {
    x /= 10;
    len++;
  }
  while (x != 0);
  // len contiene il numero di cifre del numero
  if (len < s) .....

    if (t = INTERO)
  {

    return n;
  }
  else
    if (t = DECIMALE)
    {

      return n;
    }
    else return 0;
}
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

astrobeed


Con le funzioni del Qbasic avrei impiegato un secondo, qui non c'è soluzione :smiley-sad-blue:


Quello che vuoi fare è molto semplice da mettere in pratica, ti sconsiglio caldamente di utilizzare la classe string perché è molto pesante da gestire ed è vorace di ram, anzi più in generale evitare sempre l'uso del C++ sulle piccole MCU.
Domani ti passo io il codice, ben spiegato, per quello che vuoi fare partendo da un valore long int, tutto realizzato con le normali funzioni per la gestione delle stringhe del C ANSI, lo posterò in questo topic così rimane disponibile per chi ha problemi simili, sono abbastanza comuni e mi capita di vedere soluzioni che fanno venire la pelle d'oca  :smiley-mr-green:

Go Up