Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Servo.h>
- #include <LiquidCrystal.h>
- // Se inicializan los pines para la pantalla LCD
- const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
- LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
- // Identificacion de pines digitales tanto para los botones así como para los leds
- int const pinButton = 10;
- int const pinRed = 7;
- int const pinGreen = 6;
- // Identificacion de pines analogicos (solo sensor de temperatura)
- int const pinTempSensor = A0;
- // Umbrales temperatura para activar las alertas corerspondientes
- int const thresholdRed = 28;
- // Pin donde estara conectado el motor
- int const pinMotor = 13;
- // Objeto para controlar el servomotor y el pin donde se conecta
- Servo servo;
- int const pinServo = 9;
- // Pin para llamar al Buzzer
- int const pinBuzzer = 8;
- // Variable para comandar la posicion del servo
- int posServo = 0;
- bool reverse = false;
- // Definimos las variables relativas a los periodos y sus costes
- int periodoA=100;
- int costeA=24;
- long lastA=0;
- int periodoB=200;
- int costeB=20;
- long lastB=0;
- int periodoC=1000;
- int costeC=16;
- long lastC=0;
- int periodoD=25;
- int costeD=1;
- long lastD=0;
- //Determinación del tiempo secundario
- long cicloSecundario = 1000;
- float temperature; // Variable para almacenar la temperatura
- float averageTemp; // Variable para almacenar la temperatura promedio
- // Funcion para la tarea A o 1 (Sensorizacion, senalizacion basica y control de temperatura)
- void taskA() {
- String stringA;
- Serial.println("Task A: ");
- long beginA = millis();
- long ta = beginA-lastA;
- lastA=beginA;
- stringA = "Periodo: ";
- stringA = stringA + ta;
- Serial.println(stringA);
- int sensorVal; // Variable para almacenar el valor del sensor
- float voltage; // Variable para almacenar el valor del voltaje
- long startTime; // Variable para almacenar el tiempo de inicio
- int counter = 0; // Variable para almacenar el numero de lecturas mayores al umbral
- long tmpTemp = 0; // Variable para almacenar la temperatura temporal
- startTime = millis(); // Se obtiene el tiempo de inicio
- sensorVal = analogRead(pinTempSensor); // Se lee el valor del sensor
- voltage = (sensorVal/1024.0)*5.00; // Se calcula el voltaje en base a la formula indicada
- temperature = (voltage)*100; // Se calcula la temperatura en base a la formula indicada
- tmpTemp += temperature; // Se almacena la temperatura temporal
- // Se verifica si la temperatura es mayor al umbral y se incrementa el contador
- if(temperature > thresholdRed) {
- counter += 1;
- }
- Serial.print(" Degrees: (1) "); // Se imprime el valor de la temperatura
- Serial.println(temperature); // Se imprime el valor de la temperatura
- // delay(10 - (millis() - startTime));
- // Se repite igual que para la primera lectura
- startTime = millis();
- sensorVal = analogRead(pinTempSensor);
- voltage = (sensorVal/1024.0)*5.0;
- temperature = (voltage)*100;
- tmpTemp += temperature;
- if(temperature > thresholdRed) {
- counter += 1;
- }
- Serial.print(" Degrees: (2) ");
- Serial.println(temperature);
- // delay(10 - (millis() - startTime));
- sensorVal = analogRead(pinTempSensor);
- voltage = (sensorVal/1024.0)*5.0;
- temperature = (voltage)*100;
- tmpTemp += temperature;
- Serial.print(" Degrees: (3) ");
- Serial.println(temperature);
- // Se verifica si la temperatura es mayor al umbral y se incrementa el contador
- if((temperature > thresholdRed && counter != 0) || counter == 2) { // Si se cumple la condicion se encienden los leds y se activa el motor
- digitalWrite(pinRed, HIGH);
- digitalWrite(pinGreen, LOW);
- analogWrite(pinMotor, 255);
- } else { // Si no se cumple la condicion se apagan los leds y se detiene el motor
- digitalWrite(pinRed, LOW);
- digitalWrite(pinGreen, HIGH);
- analogWrite(pinMotor, 0);
- }
- averageTemp += tmpTemp / 3.0; // Se calcula la temperatura promedio
- stringA = "Duración: ";
- long da = millis()-beginA;
- stringA = stringA + da;
- Serial.println(stringA);
- }
- // Funcion para la tarea B o 2 (senalizacion avanzada con LCD)
- void taskB() {
- String stringB;
- Serial.println("Task B: ");
- long beginB = millis();
- long tb = beginB-lastB;
- lastB=beginB;
- stringB = "Periodo: ";
- stringB = stringB + tb;
- Serial.println(stringB);
- // set the cursor to column 0, line 1
- // (note: line 1 is the second row, since counting begins with 0):
- lcd.setCursor(5, 0);
- // print the number of seconds since reset:
- lcd.print(temperature);
- // set the cursor to column 0, line 1
- // (note: line 1 is the second row, since counting begins with 0):
- lcd.setCursor(5, 1);
- // print the number of seconds since reset:
- lcd.print(averageTemp);
- stringB = "Duración: ";
- long db = millis()-beginB;
- stringB = stringB + db;
- Serial.println(stringB);
- }
- // Funcion para la tarea C o 3 (senalizacion avanzada con servomotor para reflejar el tiempo)
- void taskC() {
- String stringC;
- Serial.println("Task C: ");
- long beginC = millis();
- long tc = beginC-lastC;
- lastC=beginC;
- stringC = "Periodo: ";
- stringC = stringC + tc;
- Serial.println(stringC);
- // Activamos el servomotor moviendose 3 grados en cada iteración
- for (int i = 0; i < 3; i++) {
- if (posServo == 0) {
- reverse = false;
- } else if (posServo == 180) {
- reverse = true; // Cambiamos la dirección
- }
- if (reverse) {
- posServo -= 1;
- } else {
- posServo += 1;
- }
- Serial.println(posServo);
- servo.write(posServo);
- delay(5); // Delay para que el servomotor se mueva
- }
- stringC = "Duración: ";
- long dc = millis()-beginC;
- stringC = stringC + dc;
- Serial.println(stringC);
- }
- // Funcion para la tarea D o 4 (senalizacion avanzada con buzzer para reflejar el estado del boton)
- void taskD() {
- String stringD;
- Serial.println("Task D: ");
- long beginD = millis();
- long td = beginD-lastD;
- lastD=beginD;
- stringD = "Periodo: ";
- stringD = stringD + td;
- Serial.println(stringD);
- // Se verifica el estado del boton y se emite un sonido
- if(digitalRead(pinButton) == HIGH) {
- tone(pinBuzzer, 1000);
- } else {
- noTone(pinBuzzer);
- }
- stringD = "Duración: ";
- long dd = millis()-beginD;
- stringD = stringD + dd;
- Serial.println(stringD);
- }
- void setup() {
- // Configuracion de pines digitales como entrada
- pinMode(pinButton, INPUT);
- // Configuracion de pines digitales como salida
- pinMode(pinRed, OUTPUT);
- pinMode(pinGreen, OUTPUT);
- pinMode(pinMotor, OUTPUT);
- pinMode(pinServo, OUTPUT);
- // Inicializacion de Button
- digitalWrite(pinButton, LOW);
- // Inicializacion de LEDs (todos encendios durante 2 segundos para saber que empieza aplicacion)
- digitalWrite(pinRed, HIGH);
- digitalWrite(pinGreen, HIGH);
- delay(2000);
- digitalWrite(pinRed, LOW);
- digitalWrite(pinGreen, LOW);
- // Inicializacion motor
- // digitalWrite(pinMotor, LOW);
- analogWrite(pinMotor, 0);
- // Acoplar el objeto del servo con el pin en el que estara conectado
- servo.attach(pinServo);
- // Inicializacion servo
- servo.write(0);
- // Inicializar el buzzer
- pinMode(pinBuzzer, OUTPUT);
- // set up the LCD's number of columns and rows:
- lcd.begin(16, 2);
- // Print a message to the LCD.
- lcd.print("ULT: ");
- // set up the LCD's number of columns and rows:
- lcd.setCursor(0, 2);
- // Print a message to the LCD.
- lcd.print("MED: ");
- // Inicializacion comunicacion serie PC-Arduino
- Serial.begin(9600);
- }
- void loop() {
- long currentMillis = millis();
- averageTemp = 0;
- // Ejecutamos las tareas en el orden especificado segun la planificacion
- taskA();
- taskD();
- taskB();
- taskD();
- taskA();
- taskD();
- taskC();
- taskD();
- //Dormimos el tiempo necesario para adaptarnos al periodo del ciclo secundario
- long remainingTime = cicloSecundario - (millis() - currentMillis); // Calculamos el tiempo restante
- if(remainingTime>0) { // Si el tiempo restante es mayor a 0 dormimos el tiempo restante
- delay(remainingTime);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement