Ayuda con programa

Cerrado
RaulFonseca94 - Modificado el 15 may 2018 a las 20:48
 RaulFonseca94 - 17 may 2018 a las 01:53
Buenas tardes, necesito ayuda de caracter urgente para saber que errores estoy cometiendo en el programa. Mi proyecto es una bomba de infusion, estoy utilizando un sensor parecido al YF S201, el que utilizo es el DIGITEN 308T, este tiene un rango de medicion de 0.3-10 L, y utilizo una bomba peristaltica de 12VDC. Lo que pretendo hacer es que mi aparato presente 3 botones, los cuales son volumenes diferentes, al presiones cualquier boton en el codigo que se mande a invocar unas funciones para encender y apagar la bomba. Estoy utilizando Arduino para la programacion.

Quisiera que alguien por favor, me ayudara a encontrar mis errores en la logica de programacion, ya que eso me falla horriblemente. De antemano, gracias.

Aqui el programa:

#include <LiquidCrystal.h>

// Pines de conexion de LCD a Arduino
LiquidCrystal lcd(12, 11, 7, 6, 5, 4);

//Definiendo los pines para los botones, se utilizaron estos botones porque tienen proveen PWM con la funcion
// analogWrite, la cual utilizaremos para encender y apagar la bomba...

const int boton1 = 10; //Opcion para 20 ml, pin 10
const int boton2 = 9; //Opcion para 50 ml, pin 9
const int boton3 = 3; //Opcion para 100 ml, pin 3

// Se utilizo este lenguaje, ya que utilizando directo el numero en la funcion de interrupcion no la detectaba **DESCONOCEMOS LA RAZON**, tomamos el consejo de un amigo
byte interrupcionsensor = 0;

// Pin para el sensor, para interrupcion
byte pinsensor = 2;

// El sensor produce 23 pulsos por segundo por lit/min
int factorcalibracion = 23;

// Se declaro volatile como lo sugirio, variable para contabilizar los pulsos emitidos por el sensor
volatile byte contapulsos;

//tasa del flujo lit/min
float litmin;

// mililitros
unsigned int mililitros;
unsigned long totalmililitros;

// Tiempo pasado
unsigned long tiempopasado;

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void setup() {

// Inicializando una conexion serial de 9600 bps
Serial.begin(9600);
// Inicializamos la LCD, indicando numero de columnas y filas respectivamente
lcd.begin(16,2);
// Posiciona el cursor en la columa y fila 0,0
lcd.setCursor(0,0);
// Imprimimos el nombre de nuestra empresa
lcd.print(" BioCALI ");
// Posiciona el cursor en columna 0 y fila 1
lcd.setCursor(0,1);
lcd.print(" Electronics");
delay(2000); // Espera 3 segundos
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Bienvenido ");
lcd.setCursor(0,1);
lcd.print("Espere...");
delay(2000);
lcd.clear();

// Configuramos el estado del sensor
pinMode(pinsensor, INPUT);
// Configurando el estado de los botones para las opciones
pinMode(boton1, INPUT);
pinMode(boton2, INPUT);
pinMode(boton3, INPUT);

// Colocamos todas las variables en 0
contapulsos = 0;
litmin = 0;
mililitros = 0;
totalmililitros = 0;
tiempopasado= 0;

//Conectamos el sensor al pin 2 del Arduino para utilizar la interrupcion, incpulsos es la funcion que utilizaremos para contabilizar las interrupciones,
// utilizaremos FALLING para la transicion de ALTO a BAJO
attachInterrupt(interrupcionsensor, incpulsos, FALLING);
}

void loop() {

// La funcion millis nos permite contar los milisegundos desde cuando el programa se ejecuta
// Optamos por esta estructura debido a que la anterior, utilizando la funcion sei y cli, y entre ellos un delay, no funciono
// Si los miliseg transcurridos - el tiempo es mayor a un segundo entonces procesara los contadores una vez por segundo
if((millis() - tiempopasado) > 1000)
{
// Desactivamos la interrupcion mientras hacemos el calculo del flujo
detachInterrupt(interrupcionsensor);

// Debido al error anterior planteado, que el ciclo no se completa en 1 seg exact., calculam,os
//los miliseg que han transcurrido hasta la ultima ejecucion, esto dividido entre el factor que nos da el sensor
// esto con el fin de que la salida en funcion ndel numero de pulsos x seg x unidad de medida que proveniene del sensor
// **esta es la funcion que nos da el sensor: ~ F=23* lit/min ~, en este caso agregamos la ecuacion de la frecuencia = 1/T ,es decir, 1000/tiempo transcurrido hasta ahora - tiempo vejo**

litmin = ((1000 / (millis() - tiempopasado)) * contapulsos) / factorcalibracion;

// Teniendo en cuenta que se desactivaron las interrupciones el tiempo millis, ya no se sigue incrementando, devolviendo el valor justo antes de que se activasen

tiempopasado = millis();

// Dividimos los lit/min / 60 para determinar cuantos litros han pasado a traves del sensor en 1 seg, se multiplica por 1000
// para convertirlo en mililitros
mililitros = (litmin / 60) * 1000;

// Le agremos los mililitros pasados en este seg para acumular el total

totalmililitros += mililitros;

if(digitalRead(boton1)== 1)
{
op20ml();
lcd.setCursor(0,0);
lcd.print("Volumen 20 ml");
lcd.setCursor(0,1);
lcd.print(totalmililitros);
lcd.print(" mL");
}
if(digitalRead(boton2)== 1)
{
op50ml();
lcd.setCursor(0,0);
lcd.print("Volumen 50 ml");
lcd.setCursor(0,1);
lcd.print(totalmililitros);
lcd.print(" mL");
}
if(digitalRead(boton3)== 1)
{
op100ml();
lcd.setCursor(0,0);
lcd.print("Volumen 100 ml");
lcd.setCursor(0,1);
lcd.print(totalmililitros);
lcd.print(" mL");
}


// Reseteamos el contador de pulsos de nuevo para poder incrementar otra vez, si no utilizamos esto, los ml se siguen contando sin parar...
contapulsos = 0;

//Desactivamos la interrupcion de nuevo ahora que terminamos de enviar los resultaods
attachInterrupt(interrupcionsensor, incpulsos, FALLING);
}
}

// Incrementa los pulsos que han sido detectados

void incpulsos()
{
contapulsos++;
}

//Funciones para encender la bomba

void op20ml(){
analogWrite(boton1,255); // arrancar bomba
delay(3000); // TENGO QUE SACAR PROMEDIO DE TIEMPO QUE TARDA EN LLENAR
analogWrite(boton1,0); // Apagar bomba
}

void op50ml(){
analogWrite(boton2,255); // arrancar bomba
delay(3000); // TENGO QUE SACAR PROMEDIO DE TIEMPO QUE TARDA EN LLENAR
analogWrite(boton2,0); // Apagar bomba
}

void op100ml(){
analogWrite(boton3,255); // arrancar bomba
delay(3000); // TENGO QUE SACAR PROMEDIO DE TIEMPO QUE TARDA EN LLENAR
analogWrite(boton3,0); // Apagar bomba
}




Consulta también:

1 respuesta

misterdekus Mensajes enviados 473 Fecha de inscripción miércoles, 10 de enero de 2018 Estatus Miembro Última intervención miércoles, 27 de julio de 2022 127
17 may 2018 a las 01:10
buenas Raul

no se mucho de cosas led o Arduino , pero a lo mejor esto es de importancia

la función delay(); está en la libreria DOS.h

no se si te sirva mucho.... xD

Saludos
0
RaulFonseca94
17 may 2018 a las 01:53
Soy nuevo igual no se mucho sobre esto, pero muchas gracias, vere si ese es el problema jajaja XD

Estoy atareado de tanto estres jjajaa
0