Luz nocturna procedente de una bombilla antigua, basada en Arduino y WS2812. Tareas para una solución independiente.

Probablemente todo el mundo tuvo un sueño en la infancia (y más de uno). Incluso puedes intentar recordar el sentimiento que llena el alma de un niño cuando su sueño se hace realidad, o ese brillo lejano y familiar en sus ojos... Cuando era niño soñaba con tener mi propia luz de noche.

Ahora soy estudiante de cuarto año en BSUIR, y cuando nos dijeron que un proyecto de curso sobre diseño de circuitos no se puede hacer en papel, sino en una pieza de hardware, me di cuenta: la luz nocturna que tanto deseaba como Yo mismo puedo hacer un niño. Además, no cree simplemente un objeto que ilumine la habitación en la oscuridad, sino un dispositivo que pueda controlarse fácilmente para adaptarse a cualquier estado de ánimo. ¿Por qué no? Decidí agregar la capacidad de cambiar de color usando mis manos: cuanto más cerca está mi mano de la luz nocturna, más brillante se ilumina uno de los colores (RGB). También me gustaría controlar la luz nocturna con el mando a distancia.

Admito de inmediato que vi la idea en el sitio web cxem.net. Brevemente, este ejemplo utilizó una matriz RGB, que se controló mediante registros de desplazamiento y sensores de distancia ultrasónicos. Pero pensé que la matriz brilla solo en una dirección, pero quería que la luz nocturna brillara en los lados.

Justificación de los elementos del circuito.


Dirigí mi atención a los microcontroladores Arduino. UNO es una opción bastante adecuada para mi idea, en primer lugar porque es la plataforma más popular y la cantidad de pines no es demasiado grande, a diferencia de Mega, y en segundo lugar, puedes conectarle una fuente de alimentación externa, en mi caso es de 12V. , a diferencia de Nano , en tercer lugar... bueno, creo que podemos detenernos en estos dos puntos. La plataforma es extremadamente popular en todo el mundo debido a la conveniencia y simplicidad del lenguaje de programación, así como a su arquitectura abierta y código de programa.

Más información detallada Puede encontrar fácilmente información sobre este foro en Internet, por lo que no sobrecargaré el artículo.

Entonces, los requisitos básicos para el sistema. Requerido:
– sensores que rastrearán la distancia hasta un obstáculo para controlar el sistema;
– sensor para leer señales del control remoto control remoto;
– LED, que proporcionarán la funcionalidad de iluminación necesaria;
– una unidad de control que controlará todo el sistema.

El proyecto requiere telémetros como sensores de distancia, cada uno de los cuales corresponderá a un color específico: rojo, verde, azul. Los sensores de distancia controlarán la distancia de la mano a la luz nocturna y cuanto más se acerque la mano a un determinado sensor, más fuerte se iluminará el color correspondiente a este telémetro. Por el contrario, cuanto más alejada esté la mano, menos tensión se aplica al color correspondiente al sensor.

Los telémetros más populares en este momento estos son Sharp GP2Y0A21YK y HC-SR04. Sharp GP2Y0A21YK es un telémetro infrarrojo. Está equipado con un emisor de infrarrojos y un receptor de infrarrojos: el primero sirve como fuente del haz, cuyo reflejo es captado por el segundo. Al mismo tiempo, los rayos IR del sensor son invisibles para el ojo humano y, con tal intensidad, son inofensivos.

Comparado con el sensor ultrasónico HC-SR04, este sensor tiene ventajas y desventajas. Las ventajas incluyen neutralidad e inocuidad. Las desventajas son un alcance más corto y la dependencia de interferencias externas, incluidos algunos tipos de iluminación.

Utilizados como sensores de distancia para el proyecto: telémetros ultrasónicos HC-SR04.
El principio de funcionamiento del HC-SR04 se basa en el conocido fenómeno de la ecolocalización. Al utilizarlo, el emisor genera una señal acústica que, reflejada en el obstáculo, regresa al sensor y es registrada por el receptor. Conociendo la velocidad de propagación del ultrasonido en el aire (aproximadamente 340 m/s) y el tiempo de retardo entre la señal emitida y recibida, es fácil calcular la distancia a la barrera acústica.

La entrada TRIG se conecta a cualquier pin del microcontrolador. Se debe aplicar un pulso a este pin. señal digital duración 10 µs. Basado en la señal en la entrada TRIG, el sensor envía un paquete de pulsos ultrasónicos. Después de recibir la señal reflejada, el sensor genera una señal de pulso en el pin ECHO, cuya duración es proporcional a la distancia al obstáculo.

Sensor de infrarrojos. Por supuesto, la señal necesaria para el control remoto será leída y decodificada desde este sensor. TSOP18 se diferencian entre sí sólo en la frecuencia. Se seleccionó el sensor VS1838B TSOP1838 para el proyecto.

El proyecto se basó en la idea de iluminar la habitación en cualquier color, lo que significa que necesitarás 3 colores primarios de los cuales se obtendrá la iluminación: rojo, verde, azul. Por lo tanto, se eligió el modelo LED SMD 5050RGB, que hará frente a la tarea a la perfección.

Dependiendo de la cantidad de voltaje suministrado a cada LED, cambiarán la intensidad de esta iluminación. El LED debe conectarse a través de una resistencia, de lo contrario corremos el riesgo de arruinarlo no solo a él, sino también al Arduino. La resistencia es necesaria para limitar la corriente en el LED a un valor aceptable. El hecho es que la resistencia interna del LED es muy baja y, si no usa una resistencia, entonces pasará tal corriente a través del LED que simplemente quemará tanto el LED como el controlador.

Las tiras de LED utilizadas en el proyecto funcionan con 12V.

Debido a que el voltaje en los LED en el estado "apagado" es de 6 V y es necesario regular la fuente de alimentación, que excede los 5 V, es necesario agregar transistores al circuito en el modo de conmutación. Mi elección recayó en el modelo BC547c.

Consideremos brevemente, para aquellos que lo hayan olvidado, el principio de funcionamiento. transistor npn. Si no aplica voltaje en absoluto, sino que simplemente cortocircuita los terminales de la base y el emisor, incluso si no es un cortocircuito, sino a través de una resistencia de varios ohmios, resulta que el voltaje base-emisor es cero. En consecuencia, no hay corriente de base. El transistor está cerrado, la corriente del colector es insignificante, la misma corriente inicial. En este caso, se dice que el transistor está en estado de corte. El estado opuesto se llama saturación: cuando el transistor está completamente abierto, de modo que no hay ningún lugar donde abrirse más. Con este grado de apertura, la resistencia de la sección colector-emisor es tan baja que es simplemente imposible encender el transistor sin una carga en el circuito colector, se quemará instantáneamente. En este caso, la tensión residual en el colector puede ser sólo de 0,3...0,5V.

Estos dos estados, saturación y corte, se utilizan cuando el transistor opera en modo de conmutación, como un contacto de relé normal. El significado principal de este modo es que una pequeña corriente de base controla una gran corriente de colector, que es varias decenas de veces mayor que la corriente de base. Se obtiene una gran corriente de colector debido a fuente externa energía, pero aún así la ganancia actual, como dicen, es obvia. En nuestro caso, el microcircuito, cuyo voltaje de funcionamiento es de 5V, incluye 3 tiras con LED que funcionan desde 12V.

Calculemos el modo de funcionamiento de la cascada de claves. Es necesario calcular el valor de la resistencia en el circuito base para que los LED se quemen a máxima potencia. Una condición necesaria al calcular es que la ganancia de corriente sea mayor o igual al cociente de dividir la máxima corriente de colector posible por la mínima corriente de base posible:

Por lo tanto, las tiras pueden tener un voltaje de funcionamiento de 220 V y el circuito base se puede controlar desde un microcircuito con un voltaje de 5 V. Si el transistor está diseñado para funcionar con tal voltaje en el colector, los LED se encenderán sin problemas.
La caída de voltaje a través de la unión base-emisor es de 0,77 V, siempre que la corriente de la base sea de 5 mA y la corriente del colector sea de 0,1 A.
El voltaje a través de la resistencia base será:

Según la ley de Ohm:

De la gama estándar de resistencias seleccionamos una resistencia de 8,2 kOhm. Esto completa el cálculo.

Me gustaría llamar su atención sobre un problema que encontré. Al usar la biblioteca IRremote, el Arduino se congeló al ajustar el color azul. Después de una larga y exhaustiva búsqueda en Internet, resultó que esta biblioteca utiliza Timer 2 de forma predeterminada para este modelo de Arduino. Los temporizadores se utilizan para controlar las salidas PWM.

Temporizador 0 (hora del sistema, PWM 5 y 6);
Temporizador 1 (PWM 9 y 10);
Temporizador 2 (PWM 3 y 11).

Inicialmente utilicé PWM 11 para regular el color azul. Por lo tanto, tenga cuidado al trabajar con PWM, temporizadores y bibliotecas de terceros que puedan utilizarlos. Es extraño que pagina de inicio No se dijo nada sobre este matiz en Github. Si lo desea, puede descomentar la línea con el temporizador 1 y comentar la 2.

La conexión de los elementos en la placa se ve así:

Después de las pruebas en la placa, comenzaron las fases “Colocar elementos en la placa” y “Trabajar con un soldador”. Después de la primera prueba del tablero terminado, me viene a la cabeza un pensamiento: algo salió mal. Y aquí comienza la fase familiar para muchos: "El trabajo minucioso con el probador". Sin embargo, los problemas (varios contactos adyacentes se soldaron accidentalmente) se solucionaron rápidamente y aquí está la tan esperada y traviesa luz de los LED.

Entonces era sólo una cuestión del cuerpo. Por este motivo se cortó madera contrachapada con agujeros para nuestros sensores. Contraportada se hizo especialmente removible para que pudieras disfrutar de la vista desde el interior y, si lo deseas, terminar o rehacer algo. También dispone de 2 orificios para reprogramar la placa y la fuente de alimentación.

La carrocería se pegó con cola epoxi de dos componentes. Vale la pena señalar la peculiaridad de este pegamento para quienes no lo han encontrado antes. Este producto viene en dos envases separados y cuando se mezclan los contenidos, se produce una reacción química instantánea. Después de mezclar hay que actuar rápidamente, en 3-4 minutos. Para su uso posterior, debe mezclar una nueva porción. Así que si estás intentando repetir esto, mi consejo para ti es que mezcles en pequeñas porciones y actúes muy rápido, no habrá mucho tiempo para pensar. Por lo tanto, vale la pena pensar de antemano cómo y dónde pegar el cuerpo. Además, esto no se puede hacer de una sola vez.

Para montar tiras con LED en la cubierta superior Se insertó un tubo por el que pasaron perfectamente todos los cables.

Cuando surgió el tema de la pantalla, recordé que cuando era niña hacía manualidades con simples hilos, pegamento y un globo, que me servía de base. El principio para la pantalla es el mismo, pero envolver un poliedro resultó más difícil que una bola. Debido a la presión que ejercían los hilos sobre la estructura, esta comenzó a estrecharse hacia arriba y los hilos comenzaron a caerse. Con urgencia, con las manos cubiertas de pegamento, se decidió reforzar la estructura desde arriba. Y entonces el CD vino al rescate. El resultado final es esta luz nocturna:

¿Qué te gustaría decir al final?

¿Qué debo cambiar en el proyecto? Para suministrar la señal TRIG a los sensores de distancia, se podría utilizar una salida Arduino en lugar de tres. También proporcionaría un orificio para el sensor de infrarrojos (que me olvidé), que, lamentablemente, todavía está oculto en el caso del cual, naturalmente, no puede leer las señales del control remoto. Sin embargo, ¿quién dijo que no se puede soldar ni perforar nada?

Me gustaría señalar que este fue un semestre interesante y una gran oportunidad para intentar hacer algo que no esté en el papel, gracias a lo cual puedo poner otra marca junto al elemento "sueño de infancia". Y si crees que probar algo nuevo es difícil y no sabes qué hacer primero, no te preocupes. Muchas personas tienen una idea rondando por su cabeza: ¿por dónde empezar y cómo se puede hacer? Hay muchas tareas en la vida en las que puedes confundirte, pero una vez que lo intentas, notarás que con un brillo en tus ojos puedes mover montañas, aunque tengas que esforzarte un poco para ello.

Para una tarea adicional

    1 LED más

    1 resistencia más con un valor nominal de 220 Ohmios

    2 cables más

Diagrama esquemático

Esquema en el tablero.

nota

    En este experimento instalamos un fotorresistor entre la fuente de alimentación y la entrada analógica, es decir. para posicionar R1 en el circuito divisor de voltaje. Necesitamos esto para que cuando la iluminación disminuya, recibamos menos voltaje en la entrada analógica.

    Intente colocar los componentes de manera que el LED no ilumine el fotorresistor.

Bosquejo

p050_night_light.ino #definir LED_PIN 13 #definir LDR_PIN A0 #definir POT_PIN A1 configuración vacía() ( pinMode(LED_PIN, SALIDA) ; ) bucle vacío() ( // leer el nivel de luz. Por cierto, anuncia // puedes asignarle una variable y un valor a la vez int luminosidad = analogRead(LDR_PIN); // leemos el valor del potenciómetro con el que regulamos // valor umbral entre oscuridad y luz condicional umbral int = lectura analógica (POT_PIN); // declaramos una variable booleana y le asignamos un valor // "Está oscuro ahora." Variables booleanas, a diferencia de // números enteros, pueden contener sólo uno de dos valores: // verdadero o falso. tales valores // también llamado booleano. booleano tambiénOscuro = (luminosidad< threshold) ; // usar ramificación del programa: el procesador ejecutará uno de // dos bloques de código dependiendo de la ejecución de la condición. // Si (“if” en inglés) es demasiado oscuro... si (demasiado oscuro) ( // ...encender la iluminación escritura digital (LED_PIN, ALTA); ) demás ( // ...de lo contrario no se necesita la luz - apágala escritura digital (LED_PIN, BAJO); ) )

Explicaciones para el código.

    Usamos un nuevo tipo de variable: booleana, que almacena solo los valores verdadero (verdadero, 1) o falso (falso, 0). Estos valores son el resultado de evaluar expresiones booleanas. En este ejemplo, la expresión booleana es luminosidad.< threshold . На человеческом языке это звучит как: «освещенность ниже порогового уровня». Такое высказывание будет истинным, когда освещенность ниже порогового уровня. Микроконтроллер может сравнить значения переменных lightness и threshold , которые, в свою очередь, являются результатами измерений, и вычислить истинность логического выражения.

    Ponemos esta expresión lógica entre corchetes sólo para mayor claridad. Siempre es mejor escribir código legible. En otros casos, los paréntesis pueden afectar el orden de las operaciones, como en la aritmética ordinaria.

    En nuestro experimento, la expresión booleana será verdadera cuando el valor de luminosidad sea menor que el valor umbral porque usamos el operador< . Мы можем использовать операторы > , <= , >= , == , != , que significan “mayor que”, “menor o igual que”, “mayor o igual que”, “igual a”, “diferente a”, respectivamente.

    Ten especial cuidado con el operador lógico == y no lo confundas con el operador de asignación = . En el primer caso comparamos los valores de las expresiones y obtenemos un valor lógico (verdadero o falso), y en el segundo caso asignamos el valor del operando derecho al operando izquierdo. El compilador no conoce nuestras intenciones y no emitirá un error, pero podemos cambiar accidentalmente el valor de alguna variable y luego pasar mucho tiempo buscando un error.

    La declaración condicional if es una de las claves en la mayoría de los lenguajes de programación. Con su ayuda, podemos realizar no solo una secuencia de acciones estrictamente definida, sino también tomar decisiones sobre qué rama del algoritmo seguir, dependiendo de ciertas condiciones.

    La expresión lógica ligereza< threshold есть значение: true или false . Мы вычислили его и поместили в булеву переменную tooDark («слишком темно»). Таким образом мы как бы говорим «если слишком темно, то включить светодиод»

    Con el mismo éxito podríamos decir “si la iluminación es inferior al nivel umbral, entonces enciende el LED”, es decir. pase la expresión lógica completa a si:

si (ligereza< threshold) { // ... }

    Detrás operador condicional if necesariamente sigue a un bloque de código que se ejecuta si la expresión lógica es verdadera. ¡No te olvides de las dos llaves ()!

    Si la expresión es verdadera, solo necesitamos ejecutar uno instrucción, se puede escribir inmediatamente después si (...) sin llaves:

si (ligereza< threshold) digitalWrite(LED_PIN, HIGH) ;

    La declaración if se puede ampliar con una construcción else. El bloque de código, o la única instrucción que le sigue, solo se ejecutará si la expresión booleana if se evalúa como falsa. Las reglas con respecto a las llaves son las mismas. En nuestro experimento, escribimos "si está demasiado oscuro, encienda el LED; de lo contrario, apáguelo".

Los sensores de luz (iluminación), construidos sobre la base de fotorresistores, se utilizan con bastante frecuencia en proyectos reales de Arduino. Son relativamente sencillos, económicos y fáciles de encontrar y comprar en cualquier tienda online. El fotorresistor Arduino te permite controlar el nivel de luz y responder a sus cambios. En este artículo veremos qué es un fotorresistor, cómo funciona un sensor de luz basado en él y cómo conectar correctamente el sensor a las placas Arduino.

Un fotorresistor, como su nombre indica, está directamente relacionado con las resistencias, que suelen encontrarse en casi cualquier circuito electrónico. La principal característica de una resistencia convencional es el valor de su resistencia. El voltaje y la corriente dependen de ello; mediante una resistencia configuramos los modos de funcionamiento requeridos de otros componentes. Como regla general, el valor de resistencia de una resistencia prácticamente no cambia en las mismas condiciones de funcionamiento.

A diferencia de una resistencia convencional, fotorresistor Puede cambiar su resistencia dependiendo del nivel de luz ambiental. Esto significa que en circuito electrónico Los parámetros cambiarán constantemente; en primer lugar, nos interesa la caída de voltaje a través del fotorresistor. Al registrar estos cambios de voltaje en los pines analógicos del Arduino, podemos cambiar la lógica del circuito, creando así dispositivos que se adaptan a las condiciones externas.

Los fotorresistores se utilizan de forma bastante activa en una amplia variedad de sistemas. La aplicación más común es el alumbrado público. Si cae la noche sobre la ciudad o se nubla, las luces se encienden automáticamente. Puede fabricar una bombilla económica para el hogar a partir de un fotorresistor que no se enciende según un horario, sino según la iluminación. Incluso puede crear un sistema de seguridad basado en un sensor de luz, que se activará inmediatamente después de que se abra e ilumine un gabinete cerrado o una caja fuerte. Como siempre, el ámbito de aplicación de cualquier sensor Arduino está limitado únicamente por nuestra imaginación.

¿Qué fotorresistores se pueden comprar en las tiendas online?

Los más populares y opción asequible Los sensores en el mercado son modelos de producción en masa de empresas chinas, clones de productos del fabricante VT. No siempre es posible saber quién y qué produce exactamente este o aquel proveedor, pero para empezar con los fotorresistores, la opción más sencilla es bastante adecuada.

Se puede recomendar a un usuario novato de Arduino que compre un módulo fotográfico ya preparado que se ve así:


Este módulo ya contiene todos los elementos necesarios para fácil conexión fotorresistor a la placa Arduino. Algunos módulos implementan un circuito comparador y proporcionan una salida digital y una resistencia de ajuste para control.

Se puede recomendar a un radioaficionado ruso que recurra al sensor de megafonía ruso. Disponibles a la venta son FR1-3, FR1-4, etc. - fueron producidos en la época soviética. Pero, a pesar de esto, FR1-3 es un detalle más preciso. De esto se desprende la diferencia de precio: para FR no piden más de 400 rublos. FR1-3 costará más de mil rublos cada uno.

Marcado de fotorresistencia

El etiquetado moderno de los modelos producidos en Rusia es bastante sencillo. Las dos primeras letras son PhotoResistor, los números después del guión indican el número de desarrollo. FR -765 - fotorresistor, desarrollo 765. Generalmente marcado directamente en el cuerpo de la pieza.

El sensor VT tiene un rango de resistencia indicado en el diagrama de marcado. Por ejemplo:

  • VT83N1 - 12-100kOhm (12K – iluminado, 100K – en la oscuridad)
  • VT93N2 - 48-500kOhm (48K – iluminado, 100K – en la oscuridad).

A veces, para aclarar información sobre los modelos, el vendedor proporciona un documento especial del fabricante. Además de los parámetros de funcionamiento, allí también se indica la precisión de la pieza. Todos los modelos tienen un rango de sensibilidad en la parte visible del espectro. Coleccionando sensor de luz Debe comprender que la precisión de la operación es un concepto relativo. Incluso para modelos del mismo fabricante, del mismo lote o de la misma compra, puede diferir en un 50% o más.

En la fábrica, las piezas se ajustan a longitudes de onda que van desde la luz roja a la verde. La mayoría de la gente también “ve” la radiación infrarroja. Piezas especialmente precisas pueden detectar incluso la luz ultravioleta.

Ventajas y desventajas del sensor.

La principal desventaja de los fotorresistores es la sensibilidad espectral. Dependiendo del tipo de luz incidente, la resistencia puede variar en varios órdenes de magnitud. Las desventajas también incluyen baja velocidad Reacciones a los cambios de iluminación. Si la luz parpadea, el sensor no tiene tiempo de reaccionar. Si la frecuencia de cambio es bastante alta, la resistencia generalmente dejará de “ver” que la iluminación está cambiando.

Las ventajas incluyen simplicidad y accesibilidad. Cambiar directamente la resistencia en función de la luz que incide sobre ella le permite simplificar diagrama eléctrico conexiones. El fotorresistor en sí es muy económico, está incluido en numerosos kits y constructores de Arduino y, por lo tanto, está disponible para casi cualquier fabricante principiante de Arduino.

Conexión de un fotorresistor a Arduino

en proyectos arduino El fotorresistor se utiliza como sensor de luz. Al recibir información de él, la placa puede encender o apagar relés, arrancar motores y enviar mensajes. Naturalmente, debemos conectar el sensor correctamente.

El diagrama de conexión del sensor de luz al Arduino es bastante sencillo. Si utilizamos un fotorresistor, en el diagrama de conexión el sensor se implementa como un divisor de voltaje. Un brazo cambia según el nivel de iluminación, el segundo suministra voltaje a la entrada analógica. En el chip controlador, este voltaje se convierte en datos digitales a través de un ADC. Porque Cuando la resistencia del sensor disminuye cuando la luz incide sobre él, el valor del voltaje que lo atraviesa también disminuirá.

Dependiendo de en qué brazo del divisor coloquemos el fotorresistor, se suministrará voltaje aumentado o disminuido a la entrada analógica. Si una pata del fotorresistor está conectada a tierra, entonces el valor máximo de voltaje corresponderá a la oscuridad (la resistencia del fotorresistor es máxima, casi todo el voltaje cae a través de él), y el valor mínimo corresponderá a una buena iluminación (la resistencia es cerca de cero, el voltaje es mínimo). Si conectamos el brazo del fotorresistor a la fuente de alimentación el comportamiento será el contrario.

La instalación de la placa en sí no debería causar ninguna dificultad. Dado que el fotorresistor no tiene polaridad, se puede conectar desde cualquier lado, se puede soldar a la placa, conectar con cables usando una placa de circuito o usar clips comunes (pinzas de cocodrilo) para la conexión. La fuente de alimentación del circuito es el propio Arduino. fotorresistor una pata está conectada al suelo y la otra a la placa ADC (en nuestro ejemplo, AO). Conectamos una resistencia de 10 kOhm al mismo pie. Naturalmente, es posible conectar un fotorresistor no sólo al pin analógico A0, sino también a cualquier otro.

Algunas palabras sobre la resistencia adicional de 10 K. Tiene dos funciones en nuestro circuito: limitar la corriente en el circuito y formar voltaje requerido en un circuito con un divisor. La limitación actual es necesaria en una situación en la que un fotorresistor completamente iluminado reduce drásticamente su resistencia. Y la generación de voltaje es para valores predecibles en el puerto analógico. En realidad para operación normal Con nuestros fotorresistores es suficiente una resistencia de 1K.

Al cambiar el valor de la resistencia podemos "desplazar" el nivel de sensibilidad a los lados "oscuro" y "claro". Entonces, 10 K darán cambio rápido la aparición de la luz. En el caso de 1K, el sensor de luz detectará con mayor precisión niveles altos de luz.

Si estas usando módulo listo sensor de luz, entonces la conexión será aún más sencilla. Conectamos la salida del módulo VCC al conector 5V de la placa, GND a masa. Conectamos los pines restantes a los conectores Arduino.

Si la placa tiene salida digital, la enviamos a pines digitales. Si es analógico, entonces pasa a analógico. En el primer caso, recibiremos una señal de activación: se ha excedido el nivel de iluminación (el umbral de activación se puede ajustar mediante una resistencia de ajuste). De los pines analógicos podremos obtener un valor de voltaje proporcional al nivel de iluminación real.

Un boceto de ejemplo de un sensor de luz en un fotorresistor.

Conectamos el circuito con el fotorresistor al Arduino y nos aseguramos de que todo se hiciera correctamente. Ahora solo queda programar el controlador.

Escribir un boceto para un sensor de luz es bastante sencillo. Solo necesitamos eliminar el valor del voltaje actual del pin analógico al que está conectado el sensor. Esto se hace usando la función analogRead() que todos conocemos. Luego podremos realizar algunas acciones dependiendo del nivel de luz.

Escribamos un boceto para un sensor de luz que enciende o apaga un LED conectado según el siguiente circuito.

El algoritmo de funcionamiento es el siguiente:

  • Determine el nivel de señal del pin analógico.
  • Comparamos el nivel con el valor umbral. El valor máximo corresponderá a la oscuridad, el valor mínimo corresponderá a la iluminación máxima. Elijamos un valor umbral igual a 300.
  • Si el nivel es inferior al umbral, está oscuro, debe encender el LED.
  • De lo contrario, apague el LED.
#define PIN_LED 13 #define PIN_PHOTO_SENSOR A0 void setup() ( Serial.begin(9600); pinMode(PIN_LED, OUTPUT); ) void loop() ( int val = analogRead(PIN_PHOTO_SENSOR); Serial.println(val); if ( vale< 300) { digitalWrite(PIN_LED, LOW); } else { digitalWrite(PIN_LED, HIGH); } }

Cubriendo el fotorresistor (con las manos o con un objeto a prueba de luz), podemos observar cómo el LED se enciende y apaga. Al cambiar el parámetro de umbral en el código, podemos forzar que la bombilla se encienda/apague en diferentes niveles de iluminación.

Al realizar la instalación, intente colocar el fotorresistor y el LED lo más separados posible entre sí para que caiga menos luz del LED brillante sobre el sensor de luz.

Sensor de luz y cambio suave en el brillo de la retroiluminación.

Puedes modificar el proyecto para que el brillo del LED cambie dependiendo del nivel de iluminación. Agregaremos los siguientes cambios al algoritmo:

  • Cambiaremos el brillo de la bombilla vía PWM, enviando valores de 0 a 255 al pin con el LED usando analogWrite().
  • Para convertir el valor digital del nivel de luz del sensor de luz (de 0 a 1023) al rango PWM de brillo del LED (de 0 a 255), usaremos la función map().

Ejemplo de boceto:

#define PIN_LED 10 #define PIN_PHOTO_SENSOR A0 void setup() ( Serial.begin(9600); pinMode(PIN_LED, OUTPUT); ) void loop() ( int val = analogRead(PIN_PHOTO_SENSOR); Serial.println(val); int ledPower = map(val, 0, 1023, 0, 255); // Convierte el valor resultante en el nivel de señal PWM. Cuanto menor sea el valor de iluminación, menos potencia debemos suministrar al LED vía PWM. analogWrite(PIN_LED, ledPower) ; // Cambiar brillo)

En el caso de otro método de conexión, en el que la señal del puerto analógico es proporcional al grado de iluminación, será necesario "invertir" adicionalmente el valor restándolo del máximo:

Valor int = 1023 – lectura analógica(PIN_PHOTO_RESISTOR);

Circuito de sensor de luz mediante fotorresistor y relé.

En el artículo sobre programación de relés en Arduino se ofrecen ejemplos de bocetos para trabajar con relés. En este caso, no necesitamos realizar movimientos complejos: después de determinar la “oscuridad”, simplemente encendemos el relé y aplicamos el valor correspondiente a su pin.

#define PIN_RELAY 10 #define PIN_PHOTO_SENSOR A0 void setup() ( pinMode(PIN_RELAY, OUTPUT); digitalWrite(PIN_RELAY, HIGH); ) void loop() ( int val = analogRead(PIN_PHOTO_SENSOR); if (val< 300) { // Светло, выключаем реле digitalWrite(PIN_RELAY, HIGH); } else { // Темновато, включаем лампочку digitalWrite(PIN_RELAY, LOW); } }

Conclusión

Los proyectos que utilizan un sensor de luz basado en un fotorresistor son bastante sencillos y eficaces. Podrá implementar muchos proyectos interesantes y el costo del equipo no será alto. El fotorresistor se conecta mediante un circuito divisor de voltaje con resistencia adicional. El sensor se conecta a un puerto analógico para medir varios niveles de luz o a uno digital si lo único que nos importa es la oscuridad. En el boceto, simplemente leemos datos de un puerto analógico (o digital) y decidimos cómo reaccionar ante los cambios. Esperemos que ahora aparezcan “ojos” tan simples en tus proyectos.

En este experimento, el LED debería encenderse cuando el nivel de luz cae por debajo de un umbral establecido por un potenciómetro.

LISTA DE PIEZAS PARA EL EXPERIMENTO

- 1 placa Arduino Uno;

- 1 placa de pruebas sin soldadura;

- 1 LED;

- 1 fotorresistor;

- 1 resistencia con valor nominal de 220 Ohmios, 1 resistencia con valor nominal de 10 kOhmios;

- 1 resistencia variable (potenciómetro);

- 10 cables macho-macho.

DETALLES PARA TAREA ADICIONAL

1 LED más;

Otra resistencia de 1 valor nominal de 220 ohmios;

2 cables más.

DIAGRAMA DE CIRCUITO

DIAGRAMA EN PANEL

BOSQUEJO

descargar boceto para Arduino IDE
#define LED_PIN 13 #define LDR_PIN A0 #define POT_PIN A1 void setup() ( pinMode(LED_PIN, OUTPUT); ) void loop() ( // lee el nivel de luz. Por cierto, // puedes declarar una variable y asignarla un valor a la vez int lightness = analogRead(LDR_PIN); // leer el valor del potenciómetro, que usamos para ajustar // el valor umbral entre oscuridad condicional y luz int umbral = analogRead(POT_PIN); // declarar un variable lógica y asígnele el valor // "¿está oscuro ahora? Las variables booleanas, a diferencia de // las variables enteras, pueden contener sólo uno de dos valores: // verdadero o falso. Estos valores // también se denominan booleanos. booleano tambiénOscuro = (luminosidad< threshold); // используем ветвление программы: процессор исполнит один из // двух блоков кода в зависимости от исполнения условия. // Если (англ. «if») слишком темно... if (tooDark) { // ...включаем освещение digitalWrite(LED_PIN, HIGH); } else { // ...иначе свет не нужен — выключаем его digitalWrite(LED_PIN, LOW); } }

EXPLICACIONES DEL CÓDIGO

  • Estamos utilizando un nuevo tipo de variables: booleano, que almacenan sólo valores verdadero (cierto, 1) o FALSO (falso, 0). Estos valores son el resultado de evaluar expresiones booleanas. En este ejemplo, la expresión booleana es ligereza< threshold . En lenguaje humano esto suena como: “iluminación por debajo del nivel umbral”. Esta afirmación será cierta cuando la iluminación esté por debajo del nivel umbral. El microcontrolador puede comparar los valores de las variables. ligereza Y límite, que a su vez son los resultados de la medición, y calculan la verdad de la expresión lógica.
  • Ponemos esta expresión lógica entre corchetes sólo para mayor claridad. Siempre es mejor escribir código legible. En otros casos, los paréntesis pueden afectar el orden de las operaciones, como en la aritmética ordinaria.
  • En nuestro experimento, una expresión booleana será verdadera cuando el valor ligereza menos que el valor límite porque usamos el operador < . Podemos usar operadores. > , <= , >= , = = , != , que significan "mayor que", "menor que", "menor que o igual a", "mayor que o igual a", "igual a", "no igual a", respectivamente.
  • Tenga especial cuidado con el operador lógico = = y no lo confundas con el operador de asignación = . En el primer caso comparamos los valores de las expresiones y obtenemos un valor lógico (verdadero o falso), y en el segundo caso asignamos el valor del operando derecho al operando izquierdo. El compilador no conoce nuestras intenciones y no emitirá un error, pero podemos cambiar accidentalmente el valor de alguna variable y luego pasar mucho tiempo buscando un error.
  • Operador condicional siSi") es uno de los claves en la mayoría de los lenguajes de programación. Con su ayuda, podemos realizar no solo una secuencia de acciones estrictamente definida, sino también tomar decisiones sobre qué rama del algoritmo seguir, dependiendo de ciertas condiciones.
  • Para una expresión lógica ligereza< threshold hay un significado: verdadero o FALSO. Lo calculamos y lo pusimos en una variable booleana. demasiado oscuro("demasiado oscuro") Por lo tanto, parece que estamos diciendo "si está demasiado oscuro, entonces enciende el LED".
  • Con el mismo éxito podríamos decir “si la iluminación es inferior al nivel umbral, entonces enciende el LED”, es decir. transferir a si toda expresión lógica:
si (ligereza< threshold) { // ... }
  • Detrás de la declaración condicional si Debe haber un bloque de código que se ejecute si la expresión lógica es verdadera. No te olvides de ambas llaves {} !
  • Si la expresión es verdadera, solo necesitamos ejecutar uno instrucciones, se puede escribir inmediatamente después si (…) sin llaves:
si (ligereza< threshold) digitalWrite(LED_PIN, HIGH);
  • Operador si se puede ampliar por diseño demás("de lo contrario"). Un bloque de código o una sola declaración a continuación solo se ejecutará si la expresión lógica en si tiene el significado FALSO , « mentir" Las reglas con respecto a las llaves son las mismas. En nuestro experimento, escribimos "si está demasiado oscuro, encienda el LED; de lo contrario, apáguelo".

PREGUNTAS PARA PONERTE A PRUEBA

  1. Si instalamos un fotorresistor entre la entrada analógica y tierra, nuestro dispositivo funcionará a la inversa: el LED se encenderá cuando aumente la cantidad de luz. ¿Por qué?
  2. ¿Qué resultado del funcionamiento del dispositivo obtendremos si la luz del LED incide sobre el fotorresistor?
  3. Si instalamos el fotorresistor como se indicó en la pregunta anterior, ¿cómo debemos cambiar el programa para que el dispositivo funcione correctamente?
  4. Digamos que tenemos el código. si (condición) (acción;). ¿En qué casos se hará? acción ?
  5. ¿A qué valores y expresión x + y > 0 será cierto si x > 0 ?
  6. ¿Es necesario indicar qué instrucciones ejecutar si la condición está en la declaración? si¿FALSO?
  7. ¿Cuál es la diferencia entre el operador? = = del operador = ?
  8. Si utilizamos la construcción si (condición) acción1; otra acción2;, ¿podría darse una situación en la que no se ejecute ninguna de las acciones? ¿Por qué?

TAREAS PARA SOLUCIÓN INDEPENDIENTE

  1. Reescribe el programa sin usar la variable. demasiado oscuro manteniendo la funcionalidad del dispositivo.
  2. Agregue otro LED al circuito. Complete el programa de modo que cuando la iluminación caiga por debajo del valor umbral, se encienda un LED y cuando la iluminación caiga por debajo de la mitad del valor umbral, se enciendan ambos LED.
  3. Cambie el circuito y programe para que los LED se enciendan según el mismo principio, pero brillen tanto más intensamente cuanto menos luz incida sobre el fotorresistor.




Arriba