Advertisement
fm_manueljesus

EPD03 Arduino

Mar 29th, 2023
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.08 KB | None | 0 0
  1. #include <Servo.h>
  2. #include <LiquidCrystal.h>
  3.  
  4. // Se inicializan los pines para la pantalla LCD
  5. const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
  6. LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
  7.  
  8. // Identificacion de pines digitales tanto para los botones así como para los leds
  9. int const pinButton = 10;
  10. int const pinRed = 7;
  11. int const pinGreen = 6;
  12.  
  13. // Identificacion de pines analogicos (solo sensor de temperatura)
  14. int const pinTempSensor = A0;
  15.  
  16. // Umbrales temperatura para activar las alertas corerspondientes
  17. int const thresholdRed = 28;
  18.  
  19. // Pin donde estara conectado el motor
  20. int const pinMotor = 13;
  21.  
  22. // Objeto para controlar el servomotor y el pin donde se conecta
  23. Servo servo;
  24. int const pinServo = 9;
  25.  
  26. // Pin para llamar al Buzzer
  27. int const pinBuzzer = 8;
  28.  
  29. // Variable para comandar la posicion del servo
  30. int posServo = 0;
  31. bool reverse = false;
  32.  
  33. // Definimos las variables relativas a los periodos y sus costes
  34. int periodoA=100;
  35. int costeA=24;
  36. long lastA=0;
  37.  
  38. int periodoB=200;
  39. int costeB=20;
  40. long lastB=0;
  41.  
  42. int periodoC=1000;
  43. int costeC=16;
  44. long lastC=0;
  45.  
  46. int periodoD=25;
  47. int costeD=1;
  48. long lastD=0;
  49.  
  50.  
  51. //Determinación del tiempo secundario
  52. long cicloSecundario = 1000;
  53.  
  54. float temperature; // Variable para almacenar la temperatura
  55. float averageTemp; // Variable para almacenar la temperatura promedio
  56.  
  57. // Funcion para la tarea A o 1 (Sensorizacion, senalizacion basica y control de temperatura)
  58. void taskA() {
  59.  
  60. String stringA;
  61. Serial.println("Task A: ");
  62.  
  63. long beginA = millis();
  64. long ta = beginA-lastA;
  65. lastA=beginA;
  66.  
  67. stringA = "Periodo: ";
  68. stringA = stringA + ta;
  69. Serial.println(stringA);
  70.  
  71. int sensorVal; // Variable para almacenar el valor del sensor
  72. float voltage; // Variable para almacenar el valor del voltaje
  73. long startTime; // Variable para almacenar el tiempo de inicio
  74. int counter = 0; // Variable para almacenar el numero de lecturas mayores al umbral
  75. long tmpTemp = 0; // Variable para almacenar la temperatura temporal
  76.  
  77. startTime = millis(); // Se obtiene el tiempo de inicio
  78.  
  79. sensorVal = analogRead(pinTempSensor); // Se lee el valor del sensor
  80. voltage = (sensorVal/1024.0)*5.00; // Se calcula el voltaje en base a la formula indicada
  81. temperature = (voltage)*100; // Se calcula la temperatura en base a la formula indicada
  82. tmpTemp += temperature; // Se almacena la temperatura temporal
  83.  
  84. // Se verifica si la temperatura es mayor al umbral y se incrementa el contador
  85. if(temperature > thresholdRed) {
  86. counter += 1;
  87. }
  88.  
  89. Serial.print(" Degrees: (1) "); // Se imprime el valor de la temperatura
  90. Serial.println(temperature); // Se imprime el valor de la temperatura
  91.  
  92. // delay(10 - (millis() - startTime));
  93.  
  94. // Se repite igual que para la primera lectura
  95. startTime = millis();
  96.  
  97. sensorVal = analogRead(pinTempSensor);
  98. voltage = (sensorVal/1024.0)*5.0;
  99. temperature = (voltage)*100;
  100. tmpTemp += temperature;
  101.  
  102. if(temperature > thresholdRed) {
  103. counter += 1;
  104. }
  105.  
  106. Serial.print(" Degrees: (2) ");
  107. Serial.println(temperature);
  108.  
  109. // delay(10 - (millis() - startTime));
  110.  
  111. sensorVal = analogRead(pinTempSensor);
  112. voltage = (sensorVal/1024.0)*5.0;
  113. temperature = (voltage)*100;
  114. tmpTemp += temperature;
  115.  
  116. Serial.print(" Degrees: (3) ");
  117. Serial.println(temperature);
  118.  
  119. // Se verifica si la temperatura es mayor al umbral y se incrementa el contador
  120. if((temperature > thresholdRed && counter != 0) || counter == 2) { // Si se cumple la condicion se encienden los leds y se activa el motor
  121. digitalWrite(pinRed, HIGH);
  122. digitalWrite(pinGreen, LOW);
  123. analogWrite(pinMotor, 255);
  124. } else { // Si no se cumple la condicion se apagan los leds y se detiene el motor
  125. digitalWrite(pinRed, LOW);
  126. digitalWrite(pinGreen, HIGH);
  127. analogWrite(pinMotor, 0);
  128. }
  129.  
  130. averageTemp += tmpTemp / 3.0; // Se calcula la temperatura promedio
  131.  
  132. stringA = "Duración: ";
  133. long da = millis()-beginA;
  134. stringA = stringA + da;
  135. Serial.println(stringA);
  136. }
  137.  
  138. // Funcion para la tarea B o 2 (senalizacion avanzada con LCD)
  139. void taskB() {
  140. String stringB;
  141. Serial.println("Task B: ");
  142.  
  143. long beginB = millis();
  144. long tb = beginB-lastB;
  145. lastB=beginB;
  146.  
  147. stringB = "Periodo: ";
  148. stringB = stringB + tb;
  149. Serial.println(stringB);
  150.  
  151. // set the cursor to column 0, line 1
  152. // (note: line 1 is the second row, since counting begins with 0):
  153. lcd.setCursor(5, 0);
  154. // print the number of seconds since reset:
  155. lcd.print(temperature);
  156. // set the cursor to column 0, line 1
  157. // (note: line 1 is the second row, since counting begins with 0):
  158. lcd.setCursor(5, 1);
  159. // print the number of seconds since reset:
  160. lcd.print(averageTemp);
  161.  
  162. stringB = "Duración: ";
  163. long db = millis()-beginB;
  164. stringB = stringB + db;
  165. Serial.println(stringB);
  166. }
  167.  
  168. // Funcion para la tarea C o 3 (senalizacion avanzada con servomotor para reflejar el tiempo)
  169.  
  170. void taskC() {
  171. String stringC;
  172. Serial.println("Task C: ");
  173.  
  174. long beginC = millis();
  175. long tc = beginC-lastC;
  176. lastC=beginC;
  177.  
  178. stringC = "Periodo: ";
  179. stringC = stringC + tc;
  180. Serial.println(stringC);
  181.  
  182. // Activamos el servomotor moviendose 3 grados en cada iteración
  183. for (int i = 0; i < 3; i++) {
  184. if (posServo == 0) {
  185. reverse = false;
  186. } else if (posServo == 180) {
  187. reverse = true; // Cambiamos la dirección
  188. }
  189.  
  190. if (reverse) {
  191. posServo -= 1;
  192. } else {
  193. posServo += 1;
  194. }
  195.  
  196. Serial.println(posServo);
  197. servo.write(posServo);
  198. delay(5); // Delay para que el servomotor se mueva
  199. }
  200.  
  201. stringC = "Duración: ";
  202. long dc = millis()-beginC;
  203. stringC = stringC + dc;
  204. Serial.println(stringC);
  205.  
  206. }
  207.  
  208. // Funcion para la tarea D o 4 (senalizacion avanzada con buzzer para reflejar el estado del boton)
  209. void taskD() {
  210. String stringD;
  211. Serial.println("Task D: ");
  212.  
  213. long beginD = millis();
  214. long td = beginD-lastD;
  215. lastD=beginD;
  216.  
  217. stringD = "Periodo: ";
  218. stringD = stringD + td;
  219. Serial.println(stringD);
  220.  
  221. // Se verifica el estado del boton y se emite un sonido
  222. if(digitalRead(pinButton) == HIGH) {
  223. tone(pinBuzzer, 1000);
  224. } else {
  225. noTone(pinBuzzer);
  226. }
  227.  
  228. stringD = "Duración: ";
  229. long dd = millis()-beginD;
  230. stringD = stringD + dd;
  231. Serial.println(stringD);
  232.  
  233. }
  234.  
  235. void setup() {
  236. // Configuracion de pines digitales como entrada
  237. pinMode(pinButton, INPUT);
  238.  
  239. // Configuracion de pines digitales como salida
  240. pinMode(pinRed, OUTPUT);
  241. pinMode(pinGreen, OUTPUT);
  242. pinMode(pinMotor, OUTPUT);
  243. pinMode(pinServo, OUTPUT);
  244.  
  245. // Inicializacion de Button
  246. digitalWrite(pinButton, LOW);
  247.  
  248. // Inicializacion de LEDs (todos encendios durante 2 segundos para saber que empieza aplicacion)
  249. digitalWrite(pinRed, HIGH);
  250. digitalWrite(pinGreen, HIGH);
  251. delay(2000);
  252. digitalWrite(pinRed, LOW);
  253. digitalWrite(pinGreen, LOW);
  254.  
  255. // Inicializacion motor
  256. // digitalWrite(pinMotor, LOW);
  257. analogWrite(pinMotor, 0);
  258.  
  259. // Acoplar el objeto del servo con el pin en el que estara conectado
  260. servo.attach(pinServo);
  261.  
  262. // Inicializacion servo
  263. servo.write(0);
  264.  
  265. // Inicializar el buzzer
  266. pinMode(pinBuzzer, OUTPUT);
  267.  
  268. // set up the LCD's number of columns and rows:
  269. lcd.begin(16, 2);
  270. // Print a message to the LCD.
  271. lcd.print("ULT: ");
  272. // set up the LCD's number of columns and rows:
  273. lcd.setCursor(0, 2);
  274. // Print a message to the LCD.
  275. lcd.print("MED: ");
  276.  
  277. // Inicializacion comunicacion serie PC-Arduino
  278. Serial.begin(9600);
  279. }
  280.  
  281. void loop() {
  282. long currentMillis = millis();
  283. averageTemp = 0;
  284.  
  285. // Ejecutamos las tareas en el orden especificado segun la planificacion
  286. taskA();
  287. taskD();
  288. taskB();
  289. taskD();
  290. taskA();
  291. taskD();
  292. taskC();
  293. taskD();
  294.  
  295. //Dormimos el tiempo necesario para adaptarnos al periodo del ciclo secundario
  296. long remainingTime = cicloSecundario - (millis() - currentMillis); // Calculamos el tiempo restante
  297. if(remainingTime>0) { // Si el tiempo restante es mayor a 0 dormimos el tiempo restante
  298. delay(remainingTime);
  299. }
  300. }
Tags: Arduino
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement