Conversione analogico/digitale

Volevo chiedere se era possibile tramite arduino fare una conversione da analogico a digitale.... Mi spiego meglio: se io collego un potenziometro o leggo sui pin analogici un segnale variabile tra 0 e 5V, è possibile convertirlo in una serie di bit contenente solo 0 o 1 (convertire quindi una variazione di resistenza o di tensione in binario) ? e quindi successivamente memorizzarlo in una variabile per poterlo poi trasmettere tramite moduli rf? ho cercato in rete e ho visto che è presente l'istruzione byte(); se non ho male interpretato mi sembra che possa essere utilizzata per convertire in binario o sbaglio?

quale "l'istruzione byte();" ??

La visualizzazione di un numero avviene in modo "leggibile" per l' uomo normalmente in forma decimale. nel ambito tecnico sono disponibila anche esadecimale, ottale e binario. È comunque solo una visualizzazione. nei circuiti digitali quasi esclusivamnete usi solo numeri binari.

Spiega meglio il Tuo problema magari con unao sketch.

Ciao Uwe

ardufisher:
Volevo chiedere se era possibile tramite arduino fare una conversione da analogico a digitale....

La risposta a questa prima parte è SI, la MCU di Arduino contiene al suo interno un ADC a 10 bit. Leggiti il REFERENCE per l'istruzione analogRead().

Per il resto ti ha già risposto Uwe ... stai facendo confusione tra il "tipo" di un dato, i formati di visualizzazione, ecc. ecc.

Guglielmo

Conversioni

char( )
Converte un valore in un dato di tipo char
Sintassi
char(x)
Il parametro x è un valore di qualsiasi tipo.
La funzione restituisce un dato di tipo char.
Esempio
int x = 126 ; // 126 è il valore che viene memorizzato in x
char y;
y=char(x); // y è la conversione in char corrispondente a 126

byte( )
Converte un valore in un dato di tipo byte
Sintassi
byte(x)
Il parametro x rappresenta un valore di qualsiasi tipo.
La funzione restituisce un dato di tipo byte
Esempio
int x = 126 ; // 126 è il valore che viene memorizzato in x
byte y;
y=byte(x); // y è la conversione in byte corrispondente a 126

int( )
Converte un valore in un dato di tipo int
Sintassi
int(x)
Il parametro x rappresenta un valore di qualsiasi tipo.
La funzione restituisce un dato di tipo int
Esempio
byte x = 200 ; // 200 è il valore che viene memorizzato in x
int y;
y=int(x); // y è la conversione in int corrispondente a 200

quello a cui mi riferivo per cio che avevo detto era questo.... questi spezzoni li ho trovati in una guida contenente molte istruzioni utilizzabili in programmazione con arduino ma probabilmente mi hanno confuso un po le idee. per quanto mi avete appena esposto vi ringrazio e credo di aver capito.... i formati di visualizzazione sono diversi bin dec hex ecc
appena riesco comunque metto uno sketch e provo a chiarire nuovamente il problema .... intanto grazie :slight_smile:

Mah ... mi sembrano funzioni piuttosto inutili ... per queste cose c'è il più comune operatore di casting ...

In pratica, senza chiamare delle funzioni, semplicemente dici al compilatore di convertire il dato nel "tipo" che vuoi ... :wink:

Guglielmo

ciao guglielmo, intanto ti volevo ringraziare cosi come a uwe
lo sketch che avevo preparato e che dovra essere poi modificato (questo era solo per una prova) è questo qui (allego una foto):
praticamente il comportamento è questo: se il pulsante non è premuto mi restituisce 0, essendo normalmente basso, avendolo collegato a massa. quando premo il pulsante mi restituisce 255 ossia high, avendo chiuso i contatti del pulsante. quello che volevo realizzare era una cosa di questo tipo: se non è premuto mi restituisce 0000 e se invece viene premuto 1111 o comunque un numero binario. in ogni caso quelli che mi vengono restituiti sono valori digitali giusto?
p.s guglielmo ho seguito il tuo consiglio..... priam non riuscivo ad ottenere la conversione con le istruzioni che avevo trovato :slight_smile:
Matteo

Ma allora non ti serve una lettura analogica ma digitale del pin.
Se il pin non è non premuto ti restituisce 0, se è premuto ti restituisce 1.

Oppure non ho capito perché scomodare l'analogRead. :sweat_smile:

@Leo : Mi auguro fosse solo per fare una prova, e che dopo debba leggere una "serie" di valori e non solo on/off ... XD XD XD

@ ardufisher : la analogRead() ti restituisce un "int" con 10 bit significativi, quindi un numero che va da 0 a 1023. Cosa rappresenta questo numero lo decidi con la analogReference(), ovvero impostando il limite superiore.

Es. nel caso di default dei 5v fondo scala, avrai che ogni passo da 0 a 1023 indica circa 0.00488v ...
... nel tuo esempio con un pulsante, quando avrai 0v la analogRead() ti ritornerà 0 e quando avrai 5v ti ritornerà 1023.

Guglielmo

ok ora credo di aver capito...... al di la del pulsante che lo ho utilizazto solo per una prova per vedere l'effetto della conversione (in altre prove che ho fatto il pulsante lo ho collegato sui pin digitali cosi da avere high o low per poter controllare un led ecc); se io collego un segnale variabile (tensione da 0 a 5V) all' analogReference se questo è 0 avro 0, se questo è 5 avro 1023 e se dovessi avere un valore intermedio avro un valore compreso tra 0 e 1023. giusto?
scusate ma sono ancora alle prime armi e molti esempi potrebbero o sono stupidi, sto ancora imparando.....
cmq grazie per l'aiuto

Come ti hanno già spiegato nei post precedenti, se vuoi misurare un segnale analogico, quindi che vada da 0 a 5v devi usare la funzione analogRead(), Ma perché vuoi che sia salvato il numero binario? quale richiesta tecnica hai che te lo consiglia? Se tu volessi mandarlo alla seriale, ti basterebbe fare: Serial.print(Variabile, BIN); dove Variabile è dichiarata regolarmente come byte o int o unsigned int ecc, Non conosco il sistema RF quindi oltr non saprei dirti.

Anch'io sono alle prime armi con programmazione C/C++ di Arduino, ma stando a sentire i preziosi consigli di queste persone sul forum che ho imparato quello che so, quindi ti consiglio di fare attenzione alle loro risposte!!

ardufisher:
... l'istruzione byte(); se non ho male interpretato mi sembra che possa essere utilizzata per convertire in binario o sbaglio?

Sbagli, come detto da @uwe.
Solo per puntualizzare (ma forse ti sei solo espresso male): qualsiasi computer ragiona in numeri binari.
Se da programma scrivi int x=64 oppure quel valore lo leggi da un sensore, la macchina memorizza una cifra binaria 01000000 che in esadecimale è 0x40
Sempre la stessa cifra è. Se lo stampi a video puoi visualizzarlo in decimale (64), esa (40) oppure binario (01000000)
Poi un valore tra 0-255 può essere interpretato come carattere nella tabella ascii. Ad esempio 64 è la chiocciola @, 65=A, etc.