Capire se c'è tensione in un circuito o no.

Ragazzi ciao, sto impazzendo con una operazione credo abbastanza semplice.

Ho una pila da 5v (sarebbe l'alimentatore breadboard per alimentare i componenti di arduino che assorbono piu di 20mA) che tiene acceso un led. QUINDI generatore 5V in serie resistenza 220ohm in serie led, massa. Il circuito piu semplice del mondo.

Il problema sta qui: ho il mio arduino alimentato da USB per i fatti suoi. Voglio leggere solo se passa corrente sul led. ovunque metta il cavetto del pin analogico (in lettura) non vede nulla usando il resistore da 10K come pulldown mi da sempre 0!! Se collego ai 5v di arduino mi dice che c'è tensione.

Da qui ho provato ad unire le masse ma nulla. come mai????

devo solo capire se la batteria che accende quel led è collegata o no!

ciao

Arduino non può leggere correnti ma solo tensioni.
Non riesco a capire come lo hai collegato.
Meglio che alleghi uno schema.

ciao
pippo72

Se unisci le masse e colleghi l' entrata analogica sul LED ( tra LED e resistenza) dovresti leggere una tensione tra 1,6 e 3,4V a secondo del colore del LED se questo é illuminato.

Ciao Uwe

Certo uwe, ma non è cosi.

Allego foto del collegamento. Ho tolto led e la pulldown per semplificare.

Dunque: la cosa strana è che accendendo la basetta nella maglia girano 5v e circa 20mA causa resistore da 220ohm. Il led se lo inserisco si accende.

Il cavo arancio che entra in A2 di arduino non rileva i 5v se messo a monte della resistenza.

CASO STRANO se il cavetto blu lo metto nella sorgente 5v di arduino... il pin A2 legge la tensione! Non la legge solo se la emette la basetta, ma perchè??? la tensione c'è!!!!

Aiuto...

ecco il codice

void setup() {
Serial.begin(9600);
pinMode(A2, INPUT);
}

void loop() {
int lettura = analogRead(2);
float volts = (lettura / 1023)* 5;
Serial.println(volts);
}

pippo72:
ciao

Arduino non può leggere correnti ma solo tensioni.
Non riesco a capire come lo hai collegato.
Meglio che alleghi uno schema.

ciao
pippo72

Allegato nel post sopra. A me serve leggere proprio la tensione... non mi interessa il valore esatto ma sapere solo se diversa da zero o no. devo capire solo se la maglia è accesa (led acceso) o no. :frowning:

No vabbe, vorrei capire chi ha scritto il compilatore... ha delle ore che sbatto per nulla!!

Il problema non era nella circuitistica ma nella programmazione!!!!!!
E' assurdo che float rilevi il valore 0,4 come 0.0!!
Il calcolo dei volts seguendo la legge matematica piu idonea si dovrebbe fare con la seguente proporzione, ovvero 1023:5=lettura:x

il prodotto dei medi "aiuta" il tipo float ad avere un valore maggiore da dividere. Sto facendo delle prove con numeri diversi ma non c'è alcuna affidabilità.

Scusate ma è assurda una approssimazione cosi esagerata. che tipi di dati usate per fare calcoli con i decimali? Se dicessi in giro che 420 / 1023 facesse zero assoluto.............. ahahahhahahahaah

Poi uno perchè tira i piatti...

Comunque rispondetemi sul tipo di dati per favore.... con gli interi non posso fare nemmeno divisioni.. :frowning:

Luca32:
No vabbe, vorrei capire chi ha scritto il compilatore... ha delle ore che sbatto per nulla!! ......

Mi spiace ma debbo darti torto e dire che NON è colpa del compilatore, ma della TUA scarsa conoscenza del C ! :smiling_imp:

int lettura = analogRead(2);
float volts = (lettura / 1023)* 5;

lettura è un intero, se il valore diviso 1023 è inferiore a zero viene troncato e risulta ZERO, altrimenti comunque viene troncato all'intero !!!

Per ciò che vuoi fare tu, la giusta sintassi, utilizzando l'operatore di cast, è :

int lettura = analogRead(2);
float volts = ((float)lettura / 1024.0)* 5.0;

... ovvero dicendo al compilatore di trattare il numero intero come fosse un float e trasformare i valori costanti anche essi in float.

Guglielmo

P.S.: ... e il valore va diviso per 1024 e non per 1023

Io nasco come programmatore BASIC, sviluppo software da quando avevo 16 anni ed ero sicuro che dovesse funzionare. Ho aperto Visual Basic 6 proprio per non incorrere negli aggiornamenti del .Net (che unifica le potenzialità dei linguacci, incluso il C) ed ho scritto:

Dim x As Integer
Dim z As Currency
x = 420
z = (x / 1024) * 5
MsgBox z

magicamente FUNZIONA !!!

Z essendo una specie float come lo chiamate in C ottiene 2,05 proprio in virtù del fatto che X sarà pur intero ma contiene un dividendo non il risultato. Il risultato passa a Z... non tocca X minimamente.

Immaginate di scrivere su una calcolatrice... scrivi 420 che è intero (che dovrai dividere poi per un altro numero)? Qualunque operazione sceglierai dopo aver digitato 420 ti darà un intero! Assurdo!

Nessuna offesa, scherzo semplicemente...
devo letteralmente studiare il casting su C... boh

No, devi proprio studiare TUTTO il 'C' che è un linguaggio serio, no quel affare che non è degno di chiamarsi linguaggio (Visual Basic) :smiley: :smiley: :smiley:

Sempre senza offesa e sempre scherzando eh ... :wink:

Guglielmo

P.S.: Per inciso, programmo da qualche anno prima di te ... :grin:

Ahahahahahahahaahah mio padre direbbe: l'albero si dovrebbe raddrizzare quando è piccolo!!!! Oramai sono proprio storto ahaha

gpb01:
int lettura = analogRead(2);
float volts = ((float)lettura / 1024.0)* 5.0;

una cosa, Guglielmo, fa differenza scrivere 5.0 con 5.000 ad esempio? Rappresenta forse il numero dei decimali ammessi?

No, non fa differenza.
Se scrivi 5 viene interpretato come intero senza cifre decimali.
Se scrivi 5.0 é un float con cifre decimali che sono zero.
Ciao Uwe
PS non vedo LED nella foto.

Luca32:
una cosa, Guglielmo, fa differenza scrivere 5.0 con 5.000 ad esempio? Rappresenta forse il numero dei decimali ammessi?

... oltre a quanto detto da Uwe, tieni sempre conto di quanto scritto nel reference e del fatto che sei su una piccola MCU a 8 bit per cui :

Floating-point numbers can be as large as 3.4028235E+38 and as low as -3.4028235E+38. They are stored as 32 bits (4 bytes) of information.

Floats have only 6-7 decimal digits of precision. That means the total number of digits, not the number to the right of the decimal point. Unlike other platforms, where you can get more precision by using a double (e.g. up to 15 digits), on the Arduino, double is the same size as float.

e, proprio per come sono memorizzati :

Floating point numbers are not exact, and may yield strange results when compared. For example 6.0 / 3.0 may not equal 2.0. You should instead check that the absolute value of the difference between the numbers is less than some small number.

Guglielmo