Alvaroskinoski

Bote de basura inteligente

Apr 10th, 2021 (edited)
359
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Arduino 10.77 KB | None | 0 0
  1. /*Proyecto curso Arduino con Prof. Camila Camacho -  Por Alvaro Ballesteros
  2.  * Bote de basura robótico que abre tapa con servomotor activado por ultrasónico, por botón o por monitor serie
  3.  * incluye detector de gas que activa buzzer y cambia color led RGB dependiendo del nivel de gas
  4.  * también se incluye un sensor de temperatura LM-335
  5.  */
  6.  
  7. #include <Servo.h>  // Librería para control de servomotor
  8.  
  9. const int trigPin = 7;  // Pin verde de sensor ultrasónico
  10. const int echoPin = 6;  // cable azul sensor ultrasónico
  11. const int termistor = A1; // pin analógico para leer el valor de sensor temperatura
  12.  
  13. float temp =25;  // asigna un valor inicial a la temperatura para evitar ruido
  14. int d = 0;    // define la variable para almacenar y calcular la distancia del ultrasonido
  15. int t = 0;      // tiempo para sensor ultrasónico
  16. int total=0;  // suma de distancias que luego se utilizará para promedio
  17. int estadoboton=1;  // asigna nivel HIGH a estadobotón pulsador
  18. int ultimoestadoboton=1; //asigna nivel high a ultimoestadobotón pulsador
  19.  
  20. //  Conexiones sensor de Gas Señal A2 cable verde, VCC cable rojo a 5V y GND cable negro
  21. // Led con ánodo común
  22. #define rled 11         // cátodo rojo led
  23. #define gled 10         // cátodo verde Led
  24. #define bled 9          // cátodo azul led
  25. #define buzzer 8        // pin cátodo buzzer
  26. #define servomot 5      // pin del servomotor
  27. #define pulsador 3      // pin del botón pulsador
  28. //BLUETOOTH BLE 4.0 conectado a pin 14 RX y 15 TX que son los pines de comunicación SERIAL3 en arduino Mega estos no los
  29. //tenemos que definir aquí ya que se iniciarán cuando se active la comunicación serial 3
  30.  
  31. int valor;//variable para almacenar lectura valor analógico de sensor de gas
  32.  
  33. Servo myservo;  // crea el objeto myservo para controlar el servomotor
  34.  
  35. int pos = 0;    // variable para guardar la posición del servo
  36.  
  37. void setup() {
  38.   //Inicializa los pines digitales
  39.   pinMode(trigPin,OUTPUT);
  40.   pinMode(echoPin,INPUT);
  41.   pinMode(pulsador,INPUT_PULLUP); // para no colocar resistencia física se ocupa la instrucción PULLUP para evitar estado flotante
  42.   pinMode(rled,OUTPUT);
  43.   pinMode(gled,OUTPUT);
  44.   pinMode(bled,OUTPUT);
  45.   pinMode(buzzer,OUTPUT);
  46.   myservo.attach(servomot);  // Conecta motor
  47.   Serial.begin(9600);  // Inicia comunicación serial con computadora
  48.   myservo.write(180);  //posición inicial para cerrar la tapa
  49.   Serial3.begin(9600); // Comunicacion serie entre Arduino y el modulo Bluetooth conectado a pin 14 y 15
  50. }
  51.  
  52.  
  53. /*Comienza con función para color.   Se trata de un led de ánodo común, por lo que la señal es lo opuesto al color que se quiere
  54.  * esto es, si queremos verde, la pata del ánodo está conectada a positivo y una resistencia de 270 ohms, ese sería el
  55.  * mayor voltaje, pero para que fluya la corriente y tengamos un led encendido verde tendremos que colocar  verde en 0,
  56.  * rojo en 255, y azul en 255.  Si queremos rojo, rojo en 0, verde 255, azul 255
  57.  */
  58.  
  59. void Color(byte R, byte G, byte B) {
  60. analogWrite(gled, G) ; // escribirá el valor al pin cátodo Verde de la función color
  61. analogWrite(bled, B) ; // mismo para azul Azul
  62. analogWrite(rled, R) ; //mismo para rojo Rojo
  63. }
  64.  
  65.  
  66. /*función para cerrar la tapa, que corresponde a la posición de 180° del servomotor, se podría utilizar un for, para que se mueva
  67.  * más lento
  68.  */
  69.  
  70. void cerrar(){
  71.  
  72.     myservo.write(180);              // indica la nueva posición del servomotor 180 está cerrado
  73.     delay(10);                       // espera 10 milisegundos
  74.   }
  75.  
  76. /*función para abrir la tapa, que corresponde a la posición de 0° del servomotor.
  77.  *
  78.  */
  79. void abrir(){
  80.  
  81.     myservo.write(0);              // Posición en grados del servomotor 0 es totalmente abierto
  82.     }
  83.  
  84.  
  85. /*Función para hacer las mediciones del sensor de distancia, al menos 4 mediciones para sacar un promedio y que no haya tanto error
  86.  * Se puede reducir el valor
  87.  */
  88. void sensordist(){
  89.   total=0;
  90.   for(int x=0;x<3;x++){// la instrucción se repetirá (3+1) = 4 veces veces que se repetirá la instrucción debajo del for
  91.   digitalWrite(trigPin, LOW); //pare quitar cualquier ruido se apaga por 2 microsegundos el trigPin
  92.   delayMicroseconds(2);
  93.   digitalWrite(trigPin, HIGH); //lanza una señal de sonido por 10 microsegundos
  94.   delayMicroseconds(10);
  95.   digitalWrite(trigPin, LOW);
  96. t = pulseIn(echoPin, HIGH); //lee el valor de tiempo transcurrido al momento de que regresó el sonido
  97.  
  98. /* el sonido viaja a 344 m/s que es igual a 0.000344 m/microsegundo = 0.0344 cm/microsegundo =
  99.  *  pero debemos considerar que ha recorrido doble distancia de la emisión a la recepción
  100.  *  entonces distncia = 0.0344 * t / 2 = 0.0172 * t    para una distancia en cm que es lo mismo también
  101.  *  que t/58.4 visto en clase
  102.  */
  103. d = t*0.0172; //escalamos el tiempo a una distancia en cm
  104. total = abs(total + d);//va sumando la distancia para sacar el promedio
  105.   delay(2);
  106. }
  107. }
  108.  
  109. void loop() {
  110.   temp = analogRead(termistor);       //le el valor del pin del sensor de temperatura
  111.   temp = temp*500/1024-273.15;        // convierte la lectura a °C al dividir 500 mV entre la escala del pin analógico y restando 273.15
  112.   estadoboton=digitalRead(pulsador);  //almacena el valor del pulsador en una variable estadoboton
  113.   ultimoestadoboton=estadoboton;      //asigna el valor a otra variable ultimoestadoboton
  114.   char lecturaserial;               //almacena un caracter recibido por el monitor serie
  115.  
  116.  
  117.   Serial.println(myservo.read());     //escribe el valor del ángulo del servo
  118.   Serial.println(lecturaserial);      //muestra el dato de lo que se escribe en pantalla
  119.  
  120.     if(ultimoestadoboton==LOW && myservo.read()==180){  //como el botón está en pullup su estado normal es en HIGH, solo al pulsar
  121.                                                          //cambia a LOWsi se dan las 2 condiciones que el ultimo estado de boton sea bajo
  122.                                                         //y la tapa esté cerrada (180 grados), entonces se abre
  123.       Serial.println("Boton presionado");  //imprime tanto en monitor serial (computadora) como en comunicación serial con BT
  124.       Serial3.println("Boton presionado");
  125.       abrir();                            // manda llamar la función para abrir la tapa
  126.       digitalWrite(buzzer,HIGH);          // emite un pitido durante 0.2 segundos
  127.       delay(200);
  128.       digitalWrite(buzzer,LOW);
  129.       delay(50);
  130.       ultimoestadoboton=1;                //asigna el valor HIGH a la variable últimoestado botón para que no se repida el abrir
  131.           }
  132.     if(ultimoestadoboton==LOW && myservo.read()==0){
  133.       cerrar();
  134.       delay(50);
  135.       ultimoestadoboton=1;                //asigna el valor HIGH a la variable últimoestado botón para que no se repida el abrir
  136.     }
  137.     /*Cierra y abre tapa desde comando monitor serial, si se ingresa letra a, abre, si se ingresa letra c, cierra
  138.      * si se ingresa otro caracter no hace nada
  139.      */
  140.     while (Serial.available()){         //si detecta disponibilidad del monitor serial ejecuta código debajo
  141.       char lecturaserial = (char) Serial.read();
  142.      if(lecturaserial =='a' && myservo.read()==180){  //si se dan las 2 condiciones que el ultimo caracter ingresado
  143.                                                       //sea a y la tapa esté cerrada, entonces se abre
  144.       Serial.println("Letra a ingresado");  // imprime en los puertos seriales la letra ingresada
  145.       Serial3.println("letra a ingresada");
  146.       abrir();
  147.       digitalWrite(buzzer,HIGH);            // activa por 0.2 segundos un pitido en el zumbador
  148.       delay(200);
  149.       digitalWrite(buzzer,LOW);
  150.       delay(50);
  151.       }
  152.      if(lecturaserial =='c' && myservo.read()==0) {  //si el caracter es c y la tapa estaba abierta, entonces se cierra
  153.       cerrar();
  154.       delay(50);
  155.            
  156.      }
  157.    
  158. }
  159.  
  160. /*Cierra y abre tapa desde comando modulo Bluetoth en serial3, si se ingresa letra a, abre, si se ingresa letra c, cierra
  161.      * si se ingresa otro caracter no hace nada
  162.      */
  163.     while (Serial3.available()){
  164.       char lecturaserial3 = (char) Serial3.read();
  165.      if(lecturaserial3 =='a' && myservo.read()==180){  //si se dan las 2 condiciones que el ultimo caracter ingresado sea a y la tapa esté cerrada, entonces se abre
  166.       Serial.println("Boton BT presionado");
  167.       Serial3.println("Boton BT presionado");
  168.       abrir();
  169.       digitalWrite(buzzer,HIGH);
  170.       delay(200);
  171.       digitalWrite(buzzer,LOW);
  172.       delay(50);
  173.       }
  174.      if(lecturaserial3 =='c' && myservo.read()==0) {  //si el caracter es c y la tapa estaba abierta, entonces se cierra
  175.       cerrar();
  176.       delay(50);
  177.            
  178.      }
  179.    
  180. }
  181.  
  182. sensordist();  //llama la función de medición de distancia
  183. d=total/4;   // saca el promedio de la distancia
  184. Serial.print("Distancia =  ");   //imprime el valor en monitor serial
  185. Serial.println(d);
  186. Serial3.print("Distancia =  *d");  // el *d funciona para que la aplicación Bluetooth electronics detecte que se necesita leer
  187.                                    // el valor de distancia, termina de leer cuando ve otro asterisco *
  188. Serial3.println(d);
  189. Serial3.print("*");
  190.   delay(1);        // promedio entre lecturas para estabilidad
  191.  
  192. if (d<=10){
  193.     abrir();
  194.     delay(5000);
  195.     cerrar();
  196. }
  197.  
  198.   valor = analogRead(A2); //toma la lectura del sensor de gas
  199.   Serial.print("Lectura Sensor de gas =  ");
  200.   Serial.println(valor);
  201.   Serial.print("Temperatura =");
  202.   Serial.print(temp);
  203.   Serial3.print("Lectura Sensor de gas =*G");  // el dato *G manda el valor a la aplicación Bluetooth electronics
  204.   Serial3.println(valor);
  205.   Serial3.print("*");
  206.   Serial3.print("*t");  //*t manda el valor de temperatura a la aplicación Bluetooth electronics
  207.   Serial3.print(temp,1);
  208.   Serial3.print("*");
  209.   delay(100);
  210.  
  211.   if(valor <=80){  // si la lectura del sensor de gas está por debajo de 90, prende led verde
  212.     Color(255,0,255);//color verde para led RGB con ánodo común
  213.     delay(500);
  214.   }
  215.  
  216.     if(valor>=81 && valor <= 190){  // si la lectura del sensor de gas está por arriba de 91 pero menos de 180
  217.         // manda una advertencia cambiando el led a amarillo y sonando rápidamente un pitido de 10 milisegundos
  218.       Color(125,0,255);//Color amarillo para led RGB ánodo común
  219.       delay(30);
  220.       Color(255,255,255);//apagado
  221.       delay(20);
  222.       digitalWrite(buzzer,HIGH);
  223.       delay(10);
  224.       digitalWrite(buzzer,LOW);
  225.    
  226.     }
  227.       if(valor >= 191){  // si la lectura del sensor de gas está por arriba de 181 el led cambia a rojo y el buzzer
  228.         // suena con pitidos más largos para llamar la atención
  229.       Color(0,255,255);//color Rojo para led de ánodo común
  230.       digitalWrite(buzzer,HIGH);
  231.       delay(300);
  232.       Color(255,255,255);//apagado
  233.       digitalWrite(buzzer,LOW);
  234.       delay(100);
  235.            
  236.      
  237.      
  238.      }
  239. }
Add Comment
Please, Sign In to add comment