¿Te gustaría colaborar en un proyecto de software libre? Conoce P2PSP

×

Error

[sigplus] Critical error: Insufficient memory to carry out the requested operation on root/images/turnfan/IMG_20140817_171435.jpg, 1440000 bytes required, -18350080 bytes available.

Activando un ventilador por presencia con Arduino

[sigplus] Critical error: Insufficient memory to carry out the requested operation on root/images/turnfan/IMG_20140817_171435.jpg, 1440000 bytes required, -18350080 bytes available.

Comparte este artículo

Mi experiencia más reciente con Arduino ha consistido en activar y desactivar de forma automática un pequeño ventilador de escritorio. La idea es que el ventilador se mantenga en funcionamiento durante todo el tiempo que pase sentando frente al ordenador (o haciendo uso del escritorio) y se desactive cuando abandone mi lugar de trabajo. 

  

 Materiales

Esquema

Activar un relé mediante presencia con un sensor de ultrasonidos

 

El esquema es muy sencillo, el pin Trig del sensor de ultrasonidos HC-SR04 se conecta al pin 9 de arduino y el pin Echo al pin 10 de arduino. La entrada del relé (IN) se conecta al pin 2 de arduino. Además se ha añadido un LED que nos indica cuando se produce un cambio en el interruptor, dicho LED está conectado al pin 13 de arduino.

Las salidas del relé hacen de interruptor del ventilador por esa razón están conectadas al interruptor del ventilador directamente. Se puede apreciar en la imagen que aparece a continuación.

Detalle de la conexión del interruptor al relé

Código

A continuación se muestra el código fuente para Arduino. Está comentado para una fácil comprensión.

  1. /*
  2.  * Software: Controlling a fan with an ultrasonic sensor
  3.  * Date: 15/08/2014
  4.  * Author: Cristóbal Medina López
  5.  * Web: http://www.cristobalmedinalopez.es
  6.  * License:
  7.  * This program is free software: you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License as published by
  9.  * the Free Software Foundation, either version 3 of the License, or
  10.  * (at your option) any later version.
  11.  *
  12.  * This program is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15.  * GNU General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU General Public License
  18.  * along with this program. If not, see <http://www.gnu.org/licenses/>.
  19.  *
  20. */
  21.  
  22. const int ON=1, OFF=0;
  23. const int RELAY=2, LED=13; //Relay PIN 2, LED PIN 13
  24. const int TRIG=9, ECHO=10; //Trig PIN 9, Echo PIN 10
  25.  
  26. long cm=0;
  27. int current_state=OFF, lap=0;
  28.  
  29. int error_margin=2;
  30. int distance=65; // Distancia máxima para activar el ventilador en cm.
  31. int frequency=500; //Frecuencia en milisegundos
  32.  
  33. void setup(){
  34. pinMode(RELAY, OUTPUT);
  35. pinMode(LED, OUTPUT);
  36. pinMode(TRIG, OUTPUT);
  37. pinMode(ECHO, INPUT);
  38. digitalWrite(RELAY, HIGH); //OFF
  39. Serial.begin(9600);
  40. }
  41.  
  42. // Hacer parpadear el LED
  43. void alert(){
  44. digitalWrite(LED, HIGH);
  45. delay(500);
  46. digitalWrite(LED, LOW);
  47. }
  48.  
  49. //Interruptor para el ventilador
  50. void setFan(int state){
  51. if (state==ON){
  52. if (current_state==OFF){
  53. digitalWrite(RELAY, LOW); //ON
  54. current_state=ON;
  55. alert();
  56. }
  57. }else{
  58. if (current_state==ON){
  59. digitalWrite(RELAY, HIGH); //OFF
  60. current_state=OFF;
  61. alert();
  62. }
  63. }
  64. }
  65.  
  66. long ranging(){
  67. long duration;
  68.  
  69. // Un pulso a nivel bajo asegura un pulso a nivel alto limpio.
  70. digitalWrite(TRIG, LOW);
  71. delayMicroseconds(2);
  72.  
  73. // Un pulso a nivel alto >=2 ms dispara un ping en el sensor.
  74. digitalWrite(TRIG, HIGH);
  75. delayMicroseconds(10);
  76. digitalWrite(TRIG, LOW);
  77.  
  78. duration = pulseIn(ECHO, HIGH);
  79.  
  80. // La velocidad del sonido 340 m/s (29 ms/cm).
  81. // La distancia del objeto es la mitad de la distancia total.
  82. return duration / 29 / 2;
  83. }
  84.  
  85.  
  86.  
  87. void loop(){
  88. //Obtener la distancia
  89. cm=ranging();
  90. Serial.println(cm);
  91.  
  92. if (cm<=distance){
  93. lap++;
  94. }else{
  95. lap--;
  96. }
  97.  
  98. if (lap>=error_margin){
  99. lap=error_margin;
  100. setFan(ON);
  101. }
  102.  
  103. if (lap<=-error_margin){
  104. lap=-error_margin;
  105. setFan(OFF);
  106. }
  107.  
  108. delay(frequency);
  109. }
  110.  

El código actualizado está disponible en mi cuenta de Launchpad GitHub en el siguiente enlace: Código Arduino: Activando un ventilador por presencia

Galería

{gallery}turnfan{/gallery}

Comparte este artículo

Comentarios   

0 # Luis Alarcos 28-11-2017 13:21
Se podrían conectar dos sensores ultrasónicos en paralelo para que actúen por ejemplo para dos puestos distintos?
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 28-11-2017 19:15
Hola Luis,

Si te refieres a poner otro sensor de ultrasonidos y tener dos para controlar el mismo ventilador, si, no habría ningún problema. La forma más sencilla sería usar otros dos pines de arduino para el nuevo sensor y monitorizarlo. Podrías modificar la función ranging() para pasarle por parámetro los pines TRIG y ECHO.

Espero que te sea de ayuda.
Un Saludo.
Responder | Responder con una citación | Citar
0 # Julio 20-05-2018 11:00
Hola,para activarlo solo a partir de que me detecte a partir de 1,5 m en adelante modo ascendente(1,50 m hasta 2m) no mas de esa distancia y no tenga un consumo elevado el arduino y sensor ya que lo quiero alimentar con pila recargable(el ventilador tendría su alimentación independiente sin problemas de consumo) que configuracion me podrias recomendar.
Gracias de antemano..
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 21-05-2018 08:26
Hola Julio,
Para el tema de la distancia sólo tendrías que modificar la condición del IF para que coincida con tus preferencias. Respecto al tema de la energía, quizás sería más interesante trabajar con interrupciones en lugar de usar polling. Para más información puedes echar un vistazo a este link: arduino.cc/.../attachinterrupt

Un saludo.
Responder | Responder con una citación | Citar
0 # Julio 03-06-2018 09:50
Mil gracias Cristóbal por atenderme !!!!
Un saludo
Responder | Responder con una citación | Citar
0 # JOSUE 12-07-2018 04:33
Hola me podrian ayudar que debo de aumentarle para que se prendra con una orden y luego con otra orden se apague.
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 12-07-2018 07:21
Para controlar el encendido/apaga do se usa la función setFan. En concreto la orden:
digitalWrite(RELAY, LOW); //ON

Por tanto, deberías añadir la condición que necesites y cambiar el estado de LOW a HIGH según tus necesidades.
Responder | Responder con una citación | Citar

Escribir un comentario


Código de seguridad
Refescar

Se habla en el blog

Suscripción RSS

feed-image Blog