Go Down

Topic: problema con codice (Read 1 time) previous topic - next topic

Dec 14, 2012, 08:05 pm Last Edit: Dec 15, 2012, 11:27 am by UweFederer Reason: 1
ho un problema con il codice...vorrei che un led si accendesse quando c'e` luce e che si spegnesse quando non c'e ne e che un'altro led si accendesse quando non c'e` luce e si spegnesse quando c'e`

Code: [Select]
int sensorValue;
int sensorLow = 0;
int sensorHigh = 1023;

void setup() {  
 pinMode(12, OUTPUT);
 pinMode(13, OUTPUT);
}

void loop() {
 sensorValue = analogRead(A0);
if (sensorValue < 1023 )
   {  
  digitalWrite(12, HIGH);
  digitalWrite(13,LOW);  
    }
   else       
     digitalWrite(13,HIGH);
     digitalWrite(12,LOW);
 }


sono un principiante quindi non so` benissimo come fare per impostarle il codice,e se riuscite datemi anche una spiegazione.

grazie mille   :)

qsecofr

#1
Dec 14, 2012, 08:27 pm Last Edit: Dec 15, 2012, 11:28 am by UweFederer Reason: 1
1023 è il massimo valore raggiungibile dall'analog read quindi avrai pressochè sempre l'esecuzione del test < 1023... il ramo else ce l'hai solo se metti proprio 5 volt sul pinanalogico...

hai fatto un po' di partitore di tensione? prova a mettere 512 anzichè 1023 e coprire la fotoresistenza...

occhio anche alle parentesi del else che sono da mettere...
Code: [Select]
void loop() {
 sensorValue = analogRead(A0);
if (sensorValue < 512 )
   {
  digitalWrite(12, HIGH);
  digitalWrite(13,LOW);  
}
   else {    
     digitalWrite(13,HIGH);
     digitalWrite(12,LOW);
     } ;  //end else
 }  //end loop

adesso si accende l'altro led. ma se copro la fotoresistenza cambia niente

qsecofr


adesso si accende l'altro led. ma se copro la fotoresistenza cambia niente


bisogna capire quanti volt stai mettendo dentro su questo piedino A0.... che resistenze hai usato? fatto bene il collegamento? hai un tester per vedere quanti volt hai sul piedino a0? 512 corrisponde in teoria a 2.5 volt...

riesci a vedere il file che ho allegato?

qsecofr


riesci a vedere il file che ho allegato?


nisba... però tu basta che mi misuri con l'ohmetro che resistenze hai messo...


qsecofr


10 kilohm


10K tra a0 e massa?  e quanto ti fa la fotoresistenza tra 5v e a0? ... di media...

si, tra a0 e la ho collegata direttamente alla massa
non so quanto faccia la fotoresistenza...

qsecofr

#9
Dec 14, 2012, 09:28 pm Last Edit: Dec 14, 2012, 09:36 pm by qsecofr Reason: 1

si, tra a0 e la ho collegata direttamente alla massa
non so quanto faccia la fotoresistenza...


imho 10 k sono un po' troppi perchè la fotoresistenza che ho io è dai 1 ai 4 k... in ogni caso sono andato di zucca e non ti ho dato la soluzione semplice:

dopo sensorValue = analogRead scrivi

Serial.println (sensorValue);
delay(200);

....nel setup
void setup(void) {
  // We'll send debugging information via the Serial monitor
  Serial.begin(9600);   
}

e poi apri il monitor seriale dell'ide....leggerai i valori in input, copri e scopri la resistenza e vedi come sei.

leo72

@steveborty:
qsecofr sta cercando di spiegarti che la situazione in cui da un pin analogico leggi 1023 può capitare solo se hai tarato bene la resistenza accoppiata alla fotoresistenza.
In allegato una coppia di schemi di collegamento: sono equivalenti, solo si inverte la logica.

Poi questo link:
http://it.wikipedia.org/wiki/Partitore_di_tensione
così capisci il partitore e come calcolare il valore letto dal pin.

Infine ti consiglio di fare un po' di sperimentazione spedendo sulla seriale la lettura analogica per capire cos'è che "vede" l'Arduino sul pin analogico.


leo72

Non me l'ha preso. Eccolo.


#13
Dec 15, 2012, 12:52 pm Last Edit: Dec 15, 2012, 01:02 pm by UweFederer Reason: 1
Code: [Select]
// variable to hold sensor value
int sensorValue;
// variable to calibrate low value
int sensorLow = 0;
// variable to calibrate high value
int sensorHigh = 1023;

void setup() {
 Serial.begin(9600);
 pinMode(12, OUTPUT);
 pinMode(13, OUTPUT);
}

void loop() {
 //read the input from A0 and store it in a variable
 sensorValue = analogRead(A0);
 Serial.print(sensorValue);
 delay(200);

if (sensorValue < 512 )
   {  
  digitalWrite(12, HIGH);
  digitalWrite(13,LOW);  
}
   else       
     digitalWrite(13,HIGH);
     digitalWrite(12,LOW);
 }    


ho messo un po' a posto il codice...

il serial.begin serve?

quando copro la fotoresistenza la luce (pin 13)  si spegne (e fin qua` tutto ok) ma l'altra luce (pin 12) non si accende bene,cioe` si accende pochissimo e lampeggia...ma si vede appena che lampeggia. come mai?

uwefed

#14
Dec 15, 2012, 01:10 pm Last Edit: Dec 15, 2012, 01:21 pm by uwefed Reason: 1
Quote
quando copro la fotoresistenza la luce (pin 13)  si spegne (e fin qua` tutto ok)
ma l'altra luce (pin 12) non si accende bene,
cioe` si accende pochissimo e lampeggia...ma si vede appena che lampeggia.
come mai?

Ti aveva giá risposto qsecofr:

...
occhio anche alle parentesi del else che sono da mettere...
Code: [Select]
void loop() {
 sensorValue = analogRead(A0);
if (sensorValue < 512 )
   {
  digitalWrite(12, HIGH);
  digitalWrite(13,LOW);  
}
   else {    
     digitalWrite(13,HIGH);
     digitalWrite(12,LOW);
     } ;  //end else
 }  //end loop



Spiegazione dettagliata:
Code: [Select]

if (sensorValue < 512 )
    {  ... }
else      
     digitalWrite(13,HIGH);
     digitalWrite(12,LOW);


Questo pezzo di codice fa eseguire la funzione digitalWrite(13,HIGH); in dipendenza del if - else ma igitalWrite(12,LOW); viene eseguito sempre.
Devi aggiungere delle parentesi graffe:
Code: [Select]

if (sensorValue < 512 )
    {  ... }
else  
    {    
     digitalWrite(13,HIGH);
     digitalWrite(12,LOW);
    }


Il  serial.begin() serve per attivare l'nterfaccia seriale con la quale trasmetti i valori letti dal entrata analogica con Serial.print(sensorValue);  al PC

Go Up