En aquesta pràctica, el nostre objectiu serà encendre un LED mitjançant ara un sensor de llum, un component electrònic capaç de detectar la llum del voltant.
PHOTO RESISTOR
Un "photo resistor" és un component electrònic que varia la seva resistència elèctrica en funció de la quantitat de llum que rep. És molt útil en aplicacions en les quals es vol mesurar la intensitat lumínica, com ara en càmeres fotogràfiques, sensors de llum, aparells d'il·luminació automàtics, etc.
ESQUEMA ELÈCTRIC
Aquest circuit està en realitat format per dos diferents: el del LED el qual va connectat entre el "pin 9" i el "ground" amb un resistència de 560 ohms i el del foto resistor que va connectat als 5V i al "pin 0" a la vegada també amb una resistència però de 10.000 ohms.
CIRCUIT 1
Amb aquest circuit farem que el LED s'encengui més o menys en funció de la llum que detecti
Primerament, es declaren dues variables "integer" de nom "lightPin" i "ledPin" la primera actuarà com a "magatzem" per guardar els valors detectats pel foto resistor i la segona simplement serà el "pin" on anirà connectat el LED
Seguidament, en la funció "setup()", s'estableix el mode del "pin" que actuarà com a sortida. Després, en la funció "loop()", es crearà una altra variable de nom "lightLevel" que serà l'equivalent al resultat de llegir el valor de la variable "lightPin" de forma analògica amb la funció "analogRead".
A continuació, per ajustar la intensitat del LED a la intensitat de llum que rep el fotoresistor, es fa servir la funció "map()", que converteix el valor llegit per "lightLevel" de l'interval 0 a 900 a un valor entre 0 i 255, que és el rang de valors que entren dins els que pot utilitzar l'Arduino.
D'aquesta manera, per assegurar que el valor resultant estigui dins dels límits permesos, es fa servir la funció "constrain()" per establir que el valor de "lightLevel" estigui entre 0 i 255. Finalment, s'escriu el valor resultant a través de la funció analogWrite() encendrem el LED a la intensitat equivalent al valor de "lightLevel".
int lightPin = 0
int ledPin = 9;
void setup()
{
pinMode(ledPin, OUTPUT);
}
void loop()
{
int lightLevel analogRead(lightPin);
lightLevel = map(lightLevel, 0, 900, 0, 255);
lightLevel = constrain(lightLevel, 0, 255);
analogWrite(ledPin, lightLevel);
}
CIRCUIT 1.2
#include <Servo.h>
int sensorPin = A0;
int sensorValue = 0;
Servo myservo;
void setup() {
myservo.attach(9);
}
void loop() {
sensorValue = analogRead(sensorPin);
sensorValue = constrain( map( sensorValue, 400, 500, 0, 180 ), 0, 180 );
myservo.write(sensorValue);
}
Aquest codi és una variant de l'anterior mitjançant el qual en comptes d'encendre un LED mourem un servo.
Per fer-ho, afegirem algunes instruccions:
Primerament, amb la funció "#include <Servo.h>" permetrem a l'Arduino accedir a la biblioteca addicional d'informació perquè l'Arduino pugui utilitzar aquest component.
A continuació, es declara una variable "integer" anomenada "sensorPin" (que seria l'equivalent a la variable "ledPin") que contindrà el valor del pin analògic A0, i també es declara una altra variable "integer" anomenada "sensorValue" (que seria l'equivalent a la variable "lightPin") de valor 0 i que servirà per emmagatzemar el valor llegit pel foto resistor.
A la següent línia es declara una variable del tipus "Servo" anomenada "myservo", que s'utilitzarà per controlar el motor servo i per últim, a l'hora de declarar el "setup" se li assigna al servo el valor 9 equivalent al pin d'aquest nombre.
A continuació, la resta del codi té exactament la mateixa estructura que l'anterior canviant les variables principals.
Per últim, la instrucció final que s'encarrega de moure el servo, en comptes d'escriure "analogWrite" escriurem "myservo.write".
CIRCUIT 2
Mitjançant aquest programa, farem que el LED s'encengui quan el foto resistor detecti que la llum es troba per sobre d'un llindar establert i que s'apagui quan el que detecti es trobi per sota.
Primerament, la funció loop(), es crea una variable "integer" "threshold" amb un valor de 300 que serà, bàsicament, el valor de llindar perquè el LED s'encengui o no, en aquest cas 300.
A continuació, es fa un "if" mitjançant el qual si el valor obtingut és superior al llindar definit, s'encendrà el LED mitjançant la funció "digitalWrite". En cas contrari ("else"), s'apagarà el LED amb la mateixa instrucció.
void loop(){
int threshold = 300;
if(analogRead(lightPin) > threshold){
digitalWrite(ledPin, HIGH);
}else{
digitalWrite(ledPin, LOW);
}
}