Programa para llenar un tanque de una cisterna por medio de un control de cámara sony. el sistema puede emitir sonidos por medio de un módulo de voz de Parallax EMIC.
Fork of Sanitario_IRDA by
Revision 7:79b0dc5d537e, committed 2016-05-05
- Comitter:
- tony63
- Date:
- Thu May 05 06:34:08 2016 +0000
- Parent:
- 6:8cc9f4849678
- Commit message:
- Sistema de llenado autom?tico de sanitarios con agua gris. Para hacer la apertura de la v?lvula de llenado se usa un control infrarrojo Sony. el sistema detecta si no fluye agua por la tuber?a y da un aviso por voz. El sistema usa sensor de flujo.
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r 8cc9f4849678 -r 79b0dc5d537e main.cpp --- a/main.cpp Tue Apr 26 08:58:19 2016 +0000 +++ b/main.cpp Thu May 05 06:34:08 2016 +0000 @@ -4,12 +4,19 @@ //control remoto sony disparo camara //puede convertir la trama en un entero //para cualquier tecla +InterruptIn H2O(PTA13);//sensor de pulsos PulseInOut irda(PTD5);// en este puerto se pone el sensor infrarrojo Serial pc(USBTX, USBRX); -DigitalOut led(LED1); -DigitalOut dir(PTA1); -DigitalOut breake(PTA2); -DigitalOut led2(LED2); +//DigitalOut ledrojo(LED3); +//DigitalOut ledverde(LED2); +//DigitalOut ledazul(LED1); +DigitalOut LedVerde(PTE4);//leds sobre la FRDMKL25Z +DigitalOut LedRojo(PTE2); +DigitalOut LedAzul(PTE5); + +DigitalOut dir(PTD6); //puerto dem puente H +DigitalOut breake(PTD7);//puerto del puente H +Timer t; //Configura el timer int header =0; //tiempo de cabecera pulso abajo const int head_H = 2976; //+10% medida con osciloscopio en microsegundos const int head_L = 1984;//-10% medida con osciloscopio @@ -19,38 +26,73 @@ const int num_bits = 20;//ponga su numero de bits int num[num_bits];//cadena para almacenar todos los tiempos que conforman los bits de datos int dato; // tiempo de cada dato que se lee +int tiempo,j,f,k; int numero; int binM[20]; int bin_max[20]; -Serial GSM(PTE0,PTE1); //puertos del FRDM para el modem -//GSM.printf("AT+CMGL=0\n\r"); +Serial GSM(PTE0,PTE1); //puertos del FRDM para el modulo de voz Emic 2 (parallax) pasa de texto a voz + +//***********************configuro funciones que seran llamadas por las interupciones****************************************** +//que se disparan con los dos flancos de los pulsos del sensor de flujo de agua***************** + +void H2O_Cae(void) //esta me dispara el timer iniciando en 0.0000, se llama con el flanco de caida +{ + t.reset(); + t.start(); + i=0; //note que si i=0 es por que se dio pulso completo +} +void H2O_Sube(void) //esta detiene el timer (primero) y luego lee el valor en microsegundos, con tiempo en valor entero +{ + t.stop(); + tiempo=t.read_us(); + +} + +//*********************************************Inicia el programa principal**************************************************** int main(){ +LedAzul=1; +LedVerde=1; +LedRojo=1; +LedAzul=0; +__disable_irq(); // inabilito interupciones GSM.baud(9600); -GSM.format(8,Serial::None,1); -breake=0; -dir=0; -wait(4); -breake=1; +GSM.format(8,Serial::None,1);//formato de la comunicacion serie +breake=0; //cero es moverse (sin freno) +dir=0; //direccion de cerrado +wait(5); //hay que esperar +breake=1; //frenarse +LedAzul=1; +LedRojo=0; +//*************se indaga por las posibles interupciones******************************************************************** + H2O.fall(&H2O_Cae); + H2O.rise(&H2O_Sube); +//************************************se configura la parte ciclica del programa puede ser un ciclo inutil***idle cycle**** + GSM.printf("N1\r\n"); //comando del modulo emic2 + wait(1);//espero un poco + GSM.printf("W230\r\n");//comando del modulo emic2 + wait(1); + GSM.printf("L2\r\n");//comando del moduloemic2 + wait(1); + tiempo=0; //hacerlo cero para, evitar releerlo + while(1){ -ini1: fflush( stdin ); - header=0; - led2=1; - led=1; + +ini1: fflush( stdin ); //borrar bufer serial por si toca leer cadenas + header=0;//cabecera en cero header = irda.read_low_us(); //funcion para leer un pulso de caida o bajo en header if (header > head_L && header < head_H) goto seguir;//verificar que este en la tolerancia +-20% - else goto ini1; - + goto ini1; seguir: - //leo los datos de la trama y se meten a un arreglo + LedVerde=0; + //leo los datos de la trama y se meten a un arreglo wait_us(40);// ES EL TIEMPO DE HEADER QUE NO SE Lee O EL ALTO - led2=1; for(i=0;i<(num_bits-1);++i){ // POR OSCILOSCOPIO se determina que llegan (num_bits),datos dato = irda.read_low_us(); //leer un bit de datos que es pulso arriba en este control num[i]=dato; - wait_us(400); + wait_us(400);//insero algo de tiempo entre bits para rechazar ruido } - wait(0.5); //espero un poquito luego de leer todo el arreglo y ponerlo en pantalla + wait(0.1); //espero un poquito luego de leer todo el arreglo y ponerlo en pantalla //pc.printf(",%d",header); for(i=0;i<(num_bits-1);++i){ //pc.printf(",%d",num[i]); @@ -78,42 +120,86 @@ } pc.printf("numero=%d",numero); - if (numero==466221){ - led2=0; - wait(1); - led2=1; - GSM.printf("N1\r\n"); - wait(1); - GSM.printf("W230\r\n"); - wait(1); - GSM.printf("L2\r\n"); - wait(1); - breake=0; + if (numero==466221){//si el codigo es el esperado inicio apertura de la valvula y mensajes de voz + LedVerde=0; + LedRojo=1; + breake=0; //abro la valvula dir=1;//abrir - wait(4);//esperar que abra - breake=1;//parar - GSM.printf("S se inicia llenado del tanque\r\n"); - wait(70);//espera que llene - dir=0;//CERRAR - breake=0; - wait(4);//esperar que cierre + wait(4);//esperar que abra y paro la valvula breake=1;//parar - GSM.printf("Sel tanque esta lleno\r\n"); - wait(3); - GSM.printf("Spuede vaciar el sanitario\r\n"); - wait(3); - GSM.printf("Sno olvide\r\n"); - wait(4); - GSM.printf("Srecuerde que JA JA JA JA JA\r\n"); - wait(2); - wait(2); + GSM.printf("S se inicia llenado del tanque\r\n"); + wait(6); // espero un poco la respuesta estable del sensor de flujo + __enable_irq(); // Habilito interupciones + + //*****en esta situacion hay que esta indagando por los pulsos de flujo para dar + // alarma si estos faltan que es indicio de que no pasa agua al tanque o eñll agua se ha acabado + // en este caso toca cerar la valvula de inmediato. + +lop2: i++; //usa la variable i para detectar perdida de pulsos si i crece es por que se perdieron + wait_ms(400); + pc.printf("Tus=%d,Perdidos=%d\n",tiempo,i);//para hacer debugging con la pc + if(i>4){//umbral de reaccion de perdida de pulsos + //si no hay pulsos y la valvula esta ompletamente abierta es por que + //se acabo el agua o no baja del tanque + //cerrar la valvula inmediaramente y emitir mensaje de voz + GSM.printf("Shay problemas\r\n"); + wait(2); + GSM.printf("Shay problemas\r\n"); + wait(2); + GSM.printf("Sel agua se ha agotado o hay taponamiento\r\n"); + wait(5); + GSM.printf("se va a cerrar la valvula de nuevo\r\n"); + breake=0; + dir=0;//direccion de cerrado + LedVerde=1; + LedRojo=0; + wait(5); //esperamos a que se cierre y inabilitamos las interupciones para dar cabida + //sin molestias de los pulsos IRDA + breake=1; + i=4; + __disable_irq(); // desabilito interupciones + tiempo=0; + goto ini1; + + } + + else{ //no hacer nada todo esta normal + LedVerde=0; + LedRojo=1; + LedAzul=1; + k++;// cuenta ciclos de 1 ms para ajustar temporizacion + wait_ms(450);//espera que llene + if (k>70) goto cerrarOK; + LedVerde=0; + LedRojo=1; + goto lop2; + cerrarOK: __disable_irq(); // Disable Interrupts + dir=0;//CERRAR + k=0; + breake=0; + LedVerde=1; + LedRojo=0; + wait(5);//esperar que cierre + breake=1;//parar + GSM.printf("Sel tanque esta lleno\r\n"); + wait(3); + GSM.printf("Spuede vaciar el sanitario\r\n"); + wait(3); + GSM.printf("Sno olvide limpiarse muy bien su trasero\r\n"); + wait(4); + GSM.printf("Srecuerde que lo estoy viendo ja ja ja ja ja ja ja ja\r\n"); + goto ini1; + } //i>3 + }//chequeo numero + + //chequeo el oro numero + if (numero==466231){ + LedAzul=0; + wait(2); + LedAzul=1; goto ini1; - } - if (numero==466231){ - led=0; - wait(2); - led=1; - goto ini1; - } - } - } \ No newline at end of file + } + + //***************************************** + } // while + } //main \ No newline at end of file