Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <LiquidCrystal_I2C.h>
- LiquidCrystal_I2C lcd(0x27,20,4);
- //constantes
- const int monedaspin = 2; //pin de interrupciones
- const int sensorcaudalpin = 3;
- const int pulsadorpin = 4;
- const int sensorbotellapin = 5;
- const int dispensadorpin = 12;
- const int intervaloMostrandoTarifas = 3000; //3 segundos
- const float mlTipo1 = 0.125;
- const float mlTipo2 = 0.500;
- const float mlTipo3 = 1.000;
- const float costoTipo1 = 0.10;
- const float costoTipo2 = 0.30;
- const float costoTipo3 = 0.50;
- const float factor_conversion = 12.35; //para convertir de frecuencia a caudal
- //variables
- volatile float montoMonedas = 0.00;
- volatile int escenario = 0;
- volatile int cambioPantalla = 0;
- volatile int botonPresionado = 1;
- volatile int pulsadorPresionado = 0;
- volatile int sensorBotellaActivado = 0;
- volatile int numPulsos;
- volatile unsigned long tiempoInicial = 0;
- long dt = 0; //variación de tiempo por cada bucle
- long t0 = 0; //millis() del bucle anterior
- void setup() {
- // put your setup code here, to run once:
- Serial.begin(9600);
- pinMode(pulsadorpin, INPUT);
- pinMode(sensorbotellapin, INPUT);
- pinMode(dispensadorpin, OUTPUT);
- attachInterrupt(digitalPinToInterrupt(monedaspin), monedaInterrupcion, FALLING);
- attachInterrupt(digitalPinToInterrupt(sensorcaudalpin), contarPulsos, RISING);
- lcd.begin();
- lcd.backlight();
- t0 = millis();
- escenario = 0;
- }
- void monedaInterrupcion() {
- montoMonedas += 0.1;
- cambioPantalla = 1;
- }
- void contarPulsos ()
- {
- numPulsos++; //incrementamos la variable de pulsos
- }
- int ObtenerFrecuencia()
- {
- int frecuencia=0;
- numPulsos = 0; //Ponemos a 0 el número de pulsos
- delay(1000); //muestra de 1 segundo
- frecuencia = numPulsos; //Hz(pulsos por segundo)
- return frecuencia;
- }
- void imprimirBienvenida(){
- lcd.setCursor(0, 0);
- lcd.print("Hola, Ecofiller!");
- lcd.setCursor(0, 1);
- lcd.print("Coloca tu botella");
- lcd.setCursor(0, 2);
- lcd.print("e inserta tus");
- lcd.setCursor(0, 3);
- lcd.print("monedas");
- }
- void imprimirMonto(){
- lcd.setCursor(0,0);
- lcd.print("Monto:");
- lcd.setCursor(0,2);
- lcd.print("S/");
- lcd.print(montoMonedas);
- }
- void imprimirMontoRestante(float volumen){
- lcd.setCursor(0,0);
- lcd.print("Volumen Restante:");
- lcd.setCursor(0,2);
- lcd.print(montoMonedas);
- lcd.print(" L");
- }
- void imprimirTarifas(){
- lcd.setCursor(0,0);
- lcd.print("Las tarifas son:");
- lcd.setCursor(0,2);
- lcd.print("S/");
- lcd.print(costoTipo1);
- lcd.print("S/");
- lcd.print(costoTipo2);
- lcd.print("S/");
- lcd.print(costoTipo3);
- }
- void imprimirTiempoRestante(int tiempoRestante){
- lcd.setCursor(0,0);
- lcd.print("Tienes ");
- lcd.print(tiempoRestante);
- lcd.print(" segundos");
- lcd.setCursor(0,2);
- lcd.print("para recargar agua");
- }
- void imprimirInsertarBotella(){
- lcd.setCursor(0,0);
- lcd.print("Necesario insertar botella");
- lcd.setCursor(0,2);
- lcd.print("para dispensar agua");
- }
- void imprimirDespedida(){
- lcd.setCursor(0,0);
- lcd.print("¡Muchas gracias!");
- lcd.setCursor(0,2);
- lcd.print("Hemos ahorrado 1 botella");
- }
- void encenderDispensarAgua(){
- digitalWrite(dispensadorpin,HIGH);
- }
- void apagarDispensarAgua(){
- digitalWrite(dispensadorpin,LOW);
- }
- void limpiarPantalla(){
- if(cambioPantalla == 1){
- lcd.clear();
- cambioPantalla = 0;
- }
- }
- void loop() {
- // put your main code here, to run repeatedly:
- while(escenario == 0){
- limpiarPantalla();
- imprimirBienvenida();
- if(montoMonedas > 0.0){
- escenario = 1;
- }
- }
- while(escenario == 1){
- limpiarPantalla();
- imprimirMonto();
- pulsadorPresionado = digitalRead(pulsadorpin);
- if(pulsadorPresionado == HIGH){
- if(montoMonedas == costoTipo1 || montoMonedas == costoTipo2 || montoMonedas >= costoTipo3){
- escenario = 2;
- }
- else{
- int tiempoInicio = millis();
- limpiarPantalla();
- while(millis() - tiempoInicio <= intervaloMostrandoTarifas && cambioPantalla == 0){
- imprimirTarifas();
- }
- }
- cambioPantalla = 1;
- }
- }
- if(escenario == 2){
- float volumen = 0;
- while(escenario == 2){
- pulsadorPresionado = digitalRead(pulsadorpin);
- //sensorBotellaActivado = digitalRead(sensorbotellapin);
- sensorBotellaActivado = HIGH;
- if(pulsadorPresionado == HIGH){
- if(sensorBotellaActivado == HIGH){
- digitalWrite(dispensadorpin, HIGH);
- t0 = millis();
- float frecuencia = ObtenerFrecuencia(); //obtenemos la frecuencia de los pulsos en Hz
- dt = millis() - t0; //calculamos la variación de tiempo
- float caudal_L_m = frecuencia / factor_conversion; //calculamos el caudal en L/m
- volumen += (caudal_L_m / 60) * (dt / 1000);
- cambioPantalla = 1;
- limpiarPantalla();
- imprimirMontoRestante(volumen);
- }
- else{
- cambioPantalla = 1;
- limpiarPantalla();
- imprimirInsertarBotella();
- delay(2000);
- }
- }
- else{
- digitalWrite(dispensadorpin, LOW);
- int tiempoRestante = 30;
- int tiempoInicio = millis();
- while(tiempoRestante>0 && cambioPantalla == 0){
- imprimirTiempoRestante(tiempoRestante);
- while(millis() - tiempoInicio <= 1000 && cambioPantalla == 0){
- pulsadorPresionado = digitalRead(pulsadorpin);
- if(pulsadorPresionado == HIGH){
- cambioPantalla = 1;
- }
- }
- tiempoInicio = millis();
- tiempoRestante -= 1;
- cambioPantalla = 1;
- }
- if(tiempoRestante<=0){
- cambioPantalla = 1;
- escenario = 3;
- }
- }
- if(volumen >= 2.0){
- cambioPantalla = 1;
- escenario = 3;
- }
- }
- }
- while(escenario == 3){
- imprimirDespedida();
- delay(3000);
- escenario = 0;
- cambioPantalla = 1;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement