Advertisement
Guest User

Untitled

a guest
Jan 25th, 2020
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.96 KB | None | 0 0
  1. #include <LiquidCrystal_I2C.h>
  2. LiquidCrystal_I2C lcd(0x27,20,4);
  3.  
  4. //constantes
  5. const int monedaspin = 2; //pin de interrupciones
  6. const int sensorcaudalpin = 3;
  7. const int pulsadorpin = 4;
  8. const int sensorbotellapin = 5;
  9. const int dispensadorpin = 12;
  10. const int intervaloMostrandoTarifas = 3000; //3 segundos
  11. const float mlTipo1 = 0.125;
  12. const float mlTipo2 = 0.500;
  13. const float mlTipo3 = 1.000;
  14. const float costoTipo1 = 0.10;
  15. const float costoTipo2 = 0.30;
  16. const float costoTipo3 = 0.50;
  17. const float factor_conversion = 12.35; //para convertir de frecuencia a caudal
  18.  
  19. //variables
  20. volatile float montoMonedas = 0.00;
  21. volatile int escenario = 0;
  22. volatile int cambioPantalla = 0;
  23. volatile int botonPresionado = 1;
  24. volatile int pulsadorPresionado = 0;
  25. volatile int sensorBotellaActivado = 0;
  26. volatile int numPulsos;
  27. volatile unsigned long tiempoInicial = 0;
  28. long dt = 0; //variación de tiempo por cada bucle
  29. long t0 = 0; //millis() del bucle anterior
  30.  
  31. void setup() {
  32. // put your setup code here, to run once:
  33. Serial.begin(9600);
  34. pinMode(pulsadorpin, INPUT);
  35. pinMode(sensorbotellapin, INPUT);
  36. pinMode(dispensadorpin, OUTPUT);
  37. attachInterrupt(digitalPinToInterrupt(monedaspin), monedaInterrupcion, FALLING);
  38. attachInterrupt(digitalPinToInterrupt(sensorcaudalpin), contarPulsos, RISING);
  39. lcd.begin();
  40. lcd.backlight();
  41. t0 = millis();
  42. escenario = 0;
  43. }
  44.  
  45. void monedaInterrupcion() {
  46. montoMonedas += 0.1;
  47. cambioPantalla = 1;
  48. }
  49.  
  50. void contarPulsos ()
  51. {
  52. numPulsos++; //incrementamos la variable de pulsos
  53. }
  54.  
  55. int ObtenerFrecuencia()
  56. {
  57. int frecuencia=0;
  58. numPulsos = 0; //Ponemos a 0 el número de pulsos
  59. delay(1000); //muestra de 1 segundo
  60. frecuencia = numPulsos; //Hz(pulsos por segundo)
  61. return frecuencia;
  62. }
  63.  
  64. void imprimirBienvenida(){
  65. lcd.setCursor(0, 0);
  66. lcd.print("Hola, Ecofiller!");
  67. lcd.setCursor(0, 1);
  68. lcd.print("Coloca tu botella");
  69. lcd.setCursor(0, 2);
  70. lcd.print("e inserta tus");
  71. lcd.setCursor(0, 3);
  72. lcd.print("monedas");
  73. }
  74.  
  75. void imprimirMonto(){
  76. lcd.setCursor(0,0);
  77. lcd.print("Monto:");
  78. lcd.setCursor(0,2);
  79. lcd.print("S/");
  80. lcd.print(montoMonedas);
  81. }
  82.  
  83. void imprimirMontoRestante(float volumen){
  84. lcd.setCursor(0,0);
  85. lcd.print("Volumen Restante:");
  86. lcd.setCursor(0,2);
  87. lcd.print(montoMonedas);
  88. lcd.print(" L");
  89. }
  90.  
  91. void imprimirTarifas(){
  92. lcd.setCursor(0,0);
  93. lcd.print("Las tarifas son:");
  94. lcd.setCursor(0,2);
  95. lcd.print("S/");
  96. lcd.print(costoTipo1);
  97. lcd.print("S/");
  98. lcd.print(costoTipo2);
  99. lcd.print("S/");
  100. lcd.print(costoTipo3);
  101. }
  102.  
  103. void imprimirTiempoRestante(int tiempoRestante){
  104. lcd.setCursor(0,0);
  105. lcd.print("Tienes ");
  106. lcd.print(tiempoRestante);
  107. lcd.print(" segundos");
  108. lcd.setCursor(0,2);
  109. lcd.print("para recargar agua");
  110. }
  111.  
  112. void imprimirInsertarBotella(){
  113. lcd.setCursor(0,0);
  114. lcd.print("Necesario insertar botella");
  115. lcd.setCursor(0,2);
  116. lcd.print("para dispensar agua");
  117. }
  118.  
  119. void imprimirDespedida(){
  120. lcd.setCursor(0,0);
  121. lcd.print("¡Muchas gracias!");
  122. lcd.setCursor(0,2);
  123. lcd.print("Hemos ahorrado 1 botella");
  124. }
  125.  
  126. void encenderDispensarAgua(){
  127. digitalWrite(dispensadorpin,HIGH);
  128. }
  129.  
  130. void apagarDispensarAgua(){
  131. digitalWrite(dispensadorpin,LOW);
  132. }
  133.  
  134. void limpiarPantalla(){
  135. if(cambioPantalla == 1){
  136. lcd.clear();
  137. cambioPantalla = 0;
  138. }
  139. }
  140.  
  141. void loop() {
  142. // put your main code here, to run repeatedly:
  143. while(escenario == 0){
  144. limpiarPantalla();
  145. imprimirBienvenida();
  146. if(montoMonedas > 0.0){
  147. escenario = 1;
  148. }
  149. }
  150. while(escenario == 1){
  151. limpiarPantalla();
  152. imprimirMonto();
  153. pulsadorPresionado = digitalRead(pulsadorpin);
  154. if(pulsadorPresionado == HIGH){
  155. if(montoMonedas == costoTipo1 || montoMonedas == costoTipo2 || montoMonedas >= costoTipo3){
  156. escenario = 2;
  157. }
  158. else{
  159. int tiempoInicio = millis();
  160. limpiarPantalla();
  161. while(millis() - tiempoInicio <= intervaloMostrandoTarifas && cambioPantalla == 0){
  162. imprimirTarifas();
  163. }
  164. }
  165. cambioPantalla = 1;
  166. }
  167. }
  168. if(escenario == 2){
  169. float volumen = 0;
  170. while(escenario == 2){
  171. pulsadorPresionado = digitalRead(pulsadorpin);
  172. //sensorBotellaActivado = digitalRead(sensorbotellapin);
  173. sensorBotellaActivado = HIGH;
  174. if(pulsadorPresionado == HIGH){
  175. if(sensorBotellaActivado == HIGH){
  176. digitalWrite(dispensadorpin, HIGH);
  177. t0 = millis();
  178. float frecuencia = ObtenerFrecuencia(); //obtenemos la frecuencia de los pulsos en Hz
  179. dt = millis() - t0; //calculamos la variación de tiempo
  180. float caudal_L_m = frecuencia / factor_conversion; //calculamos el caudal en L/m
  181. volumen += (caudal_L_m / 60) * (dt / 1000);
  182. cambioPantalla = 1;
  183. limpiarPantalla();
  184. imprimirMontoRestante(volumen);
  185. }
  186. else{
  187. cambioPantalla = 1;
  188. limpiarPantalla();
  189. imprimirInsertarBotella();
  190. delay(2000);
  191. }
  192. }
  193. else{
  194. digitalWrite(dispensadorpin, LOW);
  195. int tiempoRestante = 30;
  196. int tiempoInicio = millis();
  197. while(tiempoRestante>0 && cambioPantalla == 0){
  198. imprimirTiempoRestante(tiempoRestante);
  199. while(millis() - tiempoInicio <= 1000 && cambioPantalla == 0){
  200. pulsadorPresionado = digitalRead(pulsadorpin);
  201. if(pulsadorPresionado == HIGH){
  202. cambioPantalla = 1;
  203. }
  204. }
  205. tiempoInicio = millis();
  206. tiempoRestante -= 1;
  207. cambioPantalla = 1;
  208. }
  209. if(tiempoRestante<=0){
  210. cambioPantalla = 1;
  211. escenario = 3;
  212. }
  213. }
  214.  
  215. if(volumen >= 2.0){
  216. cambioPantalla = 1;
  217. escenario = 3;
  218. }
  219. }
  220. }
  221. while(escenario == 3){
  222. imprimirDespedida();
  223. delay(3000);
  224. escenario = 0;
  225. cambioPantalla = 1;
  226. }
  227. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement