//Control de posición de un servo motor dependiendo del porcentaje de intensidad lumínica
//Materiales:
//Arduino UNO, Servo Motor, Photoresistor (LDR), 5 Resistencias 220 ohms, 5 LEDs, Pantalla LCD 16x2 con módulo I2C
#include <LiquidCrystal_I2C.h> //incluímos la librería de la pantalla
LiquidCrystal_I2C lcd (0x27,16,2); //creamos una variable LiquidCrystal_I2C llamada lcd indicando la dirección de memoria interna y el tamaño de 16 columnas y 2 filas, se comienzan a enumerar desde el 0 (propia de la librería)
#include <Servo.h> //incluímos la librería del servo motor
Servo motor; //creamos una variable Servo llamada motor (propia de la librería)
int val; //creamos una variable entera (nos servirá para los grados del motor, gira de 0° a 180°)
int led1=13,led2=12,led3=11,led4=10,led5=9; //indicamos los pines donde irán conectados los LEDs
#define LDR A0 //indicamos donde conectaremos el sensor (señal análoga)
float luminosidad,luz,porcentaje=100.0/1015.0; //variables que nos servirán para el escalamiento y el control, 1023 => valor máximo del sensor (10 bits), 100 => porcentaje máximo
void setup() {
pinMode(led1, OUTPUT); //definimos pines de entrada INPUT y salida OUTPUT
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(LDR, INPUT);
lcd.begin(16,2); //iniciamos la LCD
lcd.backlight (); //encendimos la LCD
lcd.clear (); //limpiamos la LCD
motor.attach(6); //indicamos que el motor se conecta en el pin 6 (debe ser un pin con PWM ~)
}
void loop() {
luminosidad=analogRead(LDR); //leemos la señal del sensor y se guarda en luminosidad (a más luz, menos valor)
luz=100-luminosidad*porcentaje; //determinamos el porcentaje de luz
lcd.setCursor (0,0); //indicamos dónde se comienza a escribir en la LCD (columna 0, fila 0 primer caracter de la izquierda arriba)
lcd.print("% de luminosidad"); //mensaje que aparece en la LCD
lcd.setCursor (0,1); //indicamos dónde comienza a escribir en la LCD (columna 0, fila 1 primer caracter de la izquierda abajo)
lcd.print(luz); //valor del porcentaje determinado en la linea 29
lcd.setCursor(6,1); //indicamos dónde comienza a escribir en la LCD (columna 6, fila 1)
lcd.print("%"); //unidad de la lectura (en este caso es % de intensidad lumínica)
val = map(luz, 0, 100, 0, 180); //escalamiento para el motor => luz de 0% a 100%, giro del motor de 0° a 180°
motor.write(val); //movemos el motor la cantidad de grados escalados anteriormente
delay(15); //esperamos 15 milisegundos para que el motor se mueva
if (luz>=0 && luz<20){ //si luz esta entre 0% y 20% => enciende LED1
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
}
if (luz>=20 && luz<40){ //si luz esta entre 20% y 40% => enciende LED1 y LED2
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
}
if (luz>=40 && luz<=60){ //si luz esta entre 40% y 60% => enciende LED1, LED2 y LED3
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
}
if (luz>=60 && luz<=80){ //si luz esta entre...
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
digitalWrite(led5, LOW);
}
if (luz>=80 && luz<=100){
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
digitalWrite(led5, HIGH);
}
}