Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*Proyecto curso Arduino con Prof. Camila Camacho - Por Alvaro Ballesteros
- * Bote de basura robótico que abre tapa con servomotor activado por ultrasónico, por botón o por monitor serie
- * incluye detector de gas que activa buzzer y cambia color led RGB dependiendo del nivel de gas
- * también se incluye un sensor de temperatura LM-335
- */
- #include <Servo.h> // Librería para control de servomotor
- const int trigPin = 7; // Pin verde de sensor ultrasónico
- const int echoPin = 6; // cable azul sensor ultrasónico
- const int termistor = A1; // pin analógico para leer el valor de sensor temperatura
- float temp =25; // asigna un valor inicial a la temperatura para evitar ruido
- int d = 0; // define la variable para almacenar y calcular la distancia del ultrasonido
- int t = 0; // tiempo para sensor ultrasónico
- int total=0; // suma de distancias que luego se utilizará para promedio
- int estadoboton=1; // asigna nivel HIGH a estadobotón pulsador
- int ultimoestadoboton=1; //asigna nivel high a ultimoestadobotón pulsador
- // Conexiones sensor de Gas Señal A2 cable verde, VCC cable rojo a 5V y GND cable negro
- // Led con ánodo común
- #define rled 11 // cátodo rojo led
- #define gled 10 // cátodo verde Led
- #define bled 9 // cátodo azul led
- #define buzzer 8 // pin cátodo buzzer
- #define servomot 5 // pin del servomotor
- #define pulsador 3 // pin del botón pulsador
- //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
- //tenemos que definir aquí ya que se iniciarán cuando se active la comunicación serial 3
- int valor;//variable para almacenar lectura valor analógico de sensor de gas
- Servo myservo; // crea el objeto myservo para controlar el servomotor
- int pos = 0; // variable para guardar la posición del servo
- void setup() {
- //Inicializa los pines digitales
- pinMode(trigPin,OUTPUT);
- pinMode(echoPin,INPUT);
- pinMode(pulsador,INPUT_PULLUP); // para no colocar resistencia física se ocupa la instrucción PULLUP para evitar estado flotante
- pinMode(rled,OUTPUT);
- pinMode(gled,OUTPUT);
- pinMode(bled,OUTPUT);
- pinMode(buzzer,OUTPUT);
- myservo.attach(servomot); // Conecta motor
- Serial.begin(9600); // Inicia comunicación serial con computadora
- myservo.write(180); //posición inicial para cerrar la tapa
- Serial3.begin(9600); // Comunicacion serie entre Arduino y el modulo Bluetooth conectado a pin 14 y 15
- }
- /*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
- * esto es, si queremos verde, la pata del ánodo está conectada a positivo y una resistencia de 270 ohms, ese sería el
- * mayor voltaje, pero para que fluya la corriente y tengamos un led encendido verde tendremos que colocar verde en 0,
- * rojo en 255, y azul en 255. Si queremos rojo, rojo en 0, verde 255, azul 255
- */
- void Color(byte R, byte G, byte B) {
- analogWrite(gled, G) ; // escribirá el valor al pin cátodo Verde de la función color
- analogWrite(bled, B) ; // mismo para azul Azul
- analogWrite(rled, R) ; //mismo para rojo Rojo
- }
- /*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
- * más lento
- */
- void cerrar(){
- myservo.write(180); // indica la nueva posición del servomotor 180 está cerrado
- delay(10); // espera 10 milisegundos
- }
- /*función para abrir la tapa, que corresponde a la posición de 0° del servomotor.
- *
- */
- void abrir(){
- myservo.write(0); // Posición en grados del servomotor 0 es totalmente abierto
- }
- /*Función para hacer las mediciones del sensor de distancia, al menos 4 mediciones para sacar un promedio y que no haya tanto error
- * Se puede reducir el valor
- */
- void sensordist(){
- total=0;
- 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
- digitalWrite(trigPin, LOW); //pare quitar cualquier ruido se apaga por 2 microsegundos el trigPin
- delayMicroseconds(2);
- digitalWrite(trigPin, HIGH); //lanza una señal de sonido por 10 microsegundos
- delayMicroseconds(10);
- digitalWrite(trigPin, LOW);
- t = pulseIn(echoPin, HIGH); //lee el valor de tiempo transcurrido al momento de que regresó el sonido
- /* el sonido viaja a 344 m/s que es igual a 0.000344 m/microsegundo = 0.0344 cm/microsegundo =
- * pero debemos considerar que ha recorrido doble distancia de la emisión a la recepción
- * entonces distncia = 0.0344 * t / 2 = 0.0172 * t para una distancia en cm que es lo mismo también
- * que t/58.4 visto en clase
- */
- d = t*0.0172; //escalamos el tiempo a una distancia en cm
- total = abs(total + d);//va sumando la distancia para sacar el promedio
- delay(2);
- }
- }
- void loop() {
- temp = analogRead(termistor); //le el valor del pin del sensor de temperatura
- 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
- estadoboton=digitalRead(pulsador); //almacena el valor del pulsador en una variable estadoboton
- ultimoestadoboton=estadoboton; //asigna el valor a otra variable ultimoestadoboton
- char lecturaserial; //almacena un caracter recibido por el monitor serie
- Serial.println(myservo.read()); //escribe el valor del ángulo del servo
- Serial.println(lecturaserial); //muestra el dato de lo que se escribe en pantalla
- if(ultimoestadoboton==LOW && myservo.read()==180){ //como el botón está en pullup su estado normal es en HIGH, solo al pulsar
- //cambia a LOWsi se dan las 2 condiciones que el ultimo estado de boton sea bajo
- //y la tapa esté cerrada (180 grados), entonces se abre
- Serial.println("Boton presionado"); //imprime tanto en monitor serial (computadora) como en comunicación serial con BT
- Serial3.println("Boton presionado");
- abrir(); // manda llamar la función para abrir la tapa
- digitalWrite(buzzer,HIGH); // emite un pitido durante 0.2 segundos
- delay(200);
- digitalWrite(buzzer,LOW);
- delay(50);
- ultimoestadoboton=1; //asigna el valor HIGH a la variable últimoestado botón para que no se repida el abrir
- }
- if(ultimoestadoboton==LOW && myservo.read()==0){
- cerrar();
- delay(50);
- ultimoestadoboton=1; //asigna el valor HIGH a la variable últimoestado botón para que no se repida el abrir
- }
- /*Cierra y abre tapa desde comando monitor serial, si se ingresa letra a, abre, si se ingresa letra c, cierra
- * si se ingresa otro caracter no hace nada
- */
- while (Serial.available()){ //si detecta disponibilidad del monitor serial ejecuta código debajo
- char lecturaserial = (char) Serial.read();
- if(lecturaserial =='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
- Serial.println("Letra a ingresado"); // imprime en los puertos seriales la letra ingresada
- Serial3.println("letra a ingresada");
- abrir();
- digitalWrite(buzzer,HIGH); // activa por 0.2 segundos un pitido en el zumbador
- delay(200);
- digitalWrite(buzzer,LOW);
- delay(50);
- }
- if(lecturaserial =='c' && myservo.read()==0) { //si el caracter es c y la tapa estaba abierta, entonces se cierra
- cerrar();
- delay(50);
- }
- }
- /*Cierra y abre tapa desde comando modulo Bluetoth en serial3, si se ingresa letra a, abre, si se ingresa letra c, cierra
- * si se ingresa otro caracter no hace nada
- */
- while (Serial3.available()){
- char lecturaserial3 = (char) Serial3.read();
- 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
- Serial.println("Boton BT presionado");
- Serial3.println("Boton BT presionado");
- abrir();
- digitalWrite(buzzer,HIGH);
- delay(200);
- digitalWrite(buzzer,LOW);
- delay(50);
- }
- if(lecturaserial3 =='c' && myservo.read()==0) { //si el caracter es c y la tapa estaba abierta, entonces se cierra
- cerrar();
- delay(50);
- }
- }
- sensordist(); //llama la función de medición de distancia
- d=total/4; // saca el promedio de la distancia
- Serial.print("Distancia = "); //imprime el valor en monitor serial
- Serial.println(d);
- Serial3.print("Distancia = *d"); // el *d funciona para que la aplicación Bluetooth electronics detecte que se necesita leer
- // el valor de distancia, termina de leer cuando ve otro asterisco *
- Serial3.println(d);
- Serial3.print("*");
- delay(1); // promedio entre lecturas para estabilidad
- if (d<=10){
- abrir();
- delay(5000);
- cerrar();
- }
- valor = analogRead(A2); //toma la lectura del sensor de gas
- Serial.print("Lectura Sensor de gas = ");
- Serial.println(valor);
- Serial.print("Temperatura =");
- Serial.print(temp);
- Serial3.print("Lectura Sensor de gas =*G"); // el dato *G manda el valor a la aplicación Bluetooth electronics
- Serial3.println(valor);
- Serial3.print("*");
- Serial3.print("*t"); //*t manda el valor de temperatura a la aplicación Bluetooth electronics
- Serial3.print(temp,1);
- Serial3.print("*");
- delay(100);
- if(valor <=80){ // si la lectura del sensor de gas está por debajo de 90, prende led verde
- Color(255,0,255);//color verde para led RGB con ánodo común
- delay(500);
- }
- if(valor>=81 && valor <= 190){ // si la lectura del sensor de gas está por arriba de 91 pero menos de 180
- // manda una advertencia cambiando el led a amarillo y sonando rápidamente un pitido de 10 milisegundos
- Color(125,0,255);//Color amarillo para led RGB ánodo común
- delay(30);
- Color(255,255,255);//apagado
- delay(20);
- digitalWrite(buzzer,HIGH);
- delay(10);
- digitalWrite(buzzer,LOW);
- }
- if(valor >= 191){ // si la lectura del sensor de gas está por arriba de 181 el led cambia a rojo y el buzzer
- // suena con pitidos más largos para llamar la atención
- Color(0,255,255);//color Rojo para led de ánodo común
- digitalWrite(buzzer,HIGH);
- delay(300);
- Color(255,255,255);//apagado
- digitalWrite(buzzer,LOW);
- delay(100);
- }
- }
Add Comment
Please, Sign In to add comment