Código para prender, apagar y controlar un PWM con un control de televisor
Fork of irda_V_aula by
main.cpp@4:790b7fce49bd, 2015-11-06 (annotated)
- Committer:
- GermanD
- Date:
- Fri Nov 06 21:01:23 2015 +0000
- Revision:
- 4:790b7fce49bd
- Parent:
- 3:82bebaf2a06a
C?digo para prender y apagar un pwm y controlarlo con las teclas de un control de tv.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
tony63 | 0:74d57f8ae247 | 1 | #include "mbed.h" |
tony63 | 0:74d57f8ae247 | 2 | #include <Pulse1.h> |
GermanD | 4:790b7fce49bd | 3 | #include <string.h> |
tony63 | 3:82bebaf2a06a | 4 | //control remoto videobeam aula |
tony63 | 2:6a15ab0305c8 | 5 | PulseInOut irda(PTD5);// en este puerto se pone el sensor infrarrojo |
tony63 | 0:74d57f8ae247 | 6 | Serial pc(USBTX, USBRX); |
GermanD | 4:790b7fce49bd | 7 | DigitalOut led(LED1); // indica que oprimí un botón |
GermanD | 4:790b7fce49bd | 8 | DigitalOut g1(PTD0); // salida para prender y apagar |
GermanD | 4:790b7fce49bd | 9 | PwmOut p1(PTA13); // salida para PWM |
GermanD | 4:790b7fce49bd | 10 | |
tony63 | 2:6a15ab0305c8 | 11 | int header =0; //tiempo de cabecera pulso abajo |
GermanD | 4:790b7fce49bd | 12 | const int head_H = 2400+2400*0.1; //+10% medida con osciloscopio en microsegundos |
GermanD | 4:790b7fce49bd | 13 | const int head_L = 2400-2400*0.1;//-10% medida con osciloscopio |
tony63 | 2:6a15ab0305c8 | 14 | int i=0; |
GermanD | 4:790b7fce49bd | 15 | const int T_alto=586;//ponga su tiempo de la prueba |
GermanD | 4:790b7fce49bd | 16 | const int T_bajo=1243;//ponga su tiempo de la prueba |
GermanD | 4:790b7fce49bd | 17 | const int num_bits = 13;//ponga su numero de bits |
tony63 | 2:6a15ab0305c8 | 18 | int num[num_bits];//cadena para almacenar todos los tiempos que conforman los bits de datos |
GermanD | 4:790b7fce49bd | 19 | int dato,prender,subir,bajar,rsubir,rbajar,conts,contb; // tiempo de cada dato que se lee |
GermanD | 4:790b7fce49bd | 20 | int bot[12]; // variable para guardar la trama del botón |
GermanD | 4:790b7fce49bd | 21 | |
tony63 | 0:74d57f8ae247 | 22 | |
tony63 | 0:74d57f8ae247 | 23 | int main(){ |
GermanD | 4:790b7fce49bd | 24 | p1=0; |
GermanD | 4:790b7fce49bd | 25 | rsubir=0; |
GermanD | 4:790b7fce49bd | 26 | rbajar=0; |
GermanD | 4:790b7fce49bd | 27 | conts=0; // contador para subir rapido |
GermanD | 4:790b7fce49bd | 28 | contb=0; // contador para bajar rapido |
GermanD | 4:790b7fce49bd | 29 | |
tony63 | 0:74d57f8ae247 | 30 | while(1){ |
tony63 | 3:82bebaf2a06a | 31 | ini1: fflush( stdin ); |
tony63 | 3:82bebaf2a06a | 32 | header=0; |
tony63 | 0:74d57f8ae247 | 33 | led=1; |
tony63 | 3:82bebaf2a06a | 34 | header = irda.read_low_us(); //funcion para leer un pulso de caida o bajo en header |
tony63 | 2:6a15ab0305c8 | 35 | if (header > head_L && header < head_H) goto seguir;//verificar que este en la tolerancia +-20% |
tony63 | 2:6a15ab0305c8 | 36 | else goto ini1; |
tony63 | 0:74d57f8ae247 | 37 | |
tony63 | 2:6a15ab0305c8 | 38 | seguir: |
tony63 | 2:6a15ab0305c8 | 39 | //leo los datos de la trama y se meten a un arreglo |
GermanD | 4:790b7fce49bd | 40 | wait_us(333);// ES EL TIEMPO DE HEADER QUE NO SE Lee O EL ALTO |
GermanD | 4:790b7fce49bd | 41 | led=0; |
tony63 | 2:6a15ab0305c8 | 42 | for(i=0;i<(num_bits-1);++i){ // POR OSCILOSCOPIO se determina que llegan (num_bits),datos |
GermanD | 4:790b7fce49bd | 43 | dato = irda.read_low_us(); //leer un bit de datos que es pulso arriba en este control |
tony63 | 2:6a15ab0305c8 | 44 | num[i]=dato; |
tony63 | 2:6a15ab0305c8 | 45 | wait_us(300); |
tony63 | 2:6a15ab0305c8 | 46 | } |
tony63 | 3:82bebaf2a06a | 47 | wait(0.5); //espero un poquito luego de leer todo el arreglo y ponerlo en pantalla |
tony63 | 2:6a15ab0305c8 | 48 | pc.printf(",%d",header); |
tony63 | 2:6a15ab0305c8 | 49 | for(i=0;i<(num_bits-1);++i){ |
tony63 | 2:6a15ab0305c8 | 50 | pc.printf(",%d",num[i]); |
tony63 | 2:6a15ab0305c8 | 51 | } |
GermanD | 4:790b7fce49bd | 52 | //wait(0.1); //espero e imprimo en binario |
tony63 | 2:6a15ab0305c8 | 53 | pc.printf("\n\n"); |
tony63 | 2:6a15ab0305c8 | 54 | for(i=0;i<(num_bits-1);++i){ |
GermanD | 4:790b7fce49bd | 55 | if(num[i] > ((T_alto+T_bajo)/2)){ |
GermanD | 4:790b7fce49bd | 56 | |
GermanD | 4:790b7fce49bd | 57 | pc.printf("1"); |
GermanD | 4:790b7fce49bd | 58 | bot[i] = 1; |
GermanD | 4:790b7fce49bd | 59 | } |
GermanD | 4:790b7fce49bd | 60 | |
GermanD | 4:790b7fce49bd | 61 | else { |
GermanD | 4:790b7fce49bd | 62 | pc.printf("0"); |
GermanD | 4:790b7fce49bd | 63 | bot[i] = 0; |
tony63 | 2:6a15ab0305c8 | 64 | } |
tony63 | 2:6a15ab0305c8 | 65 | } |
GermanD | 4:790b7fce49bd | 66 | |
GermanD | 4:790b7fce49bd | 67 | int sol[]={1,0,1,0,0,1,1,1,0,0,0,0}; |
GermanD | 4:790b7fce49bd | 68 | int arriba[]={0,0,1,0,1,1,1,1,0,0,0,0}; |
GermanD | 4:790b7fce49bd | 69 | int abajo[]={1,0,1,0,1,1,1,1,0,0,0,0}; |
GermanD | 4:790b7fce49bd | 70 | prender=0; |
GermanD | 4:790b7fce49bd | 71 | subir=0; |
GermanD | 4:790b7fce49bd | 72 | bajar=0; |
GermanD | 4:790b7fce49bd | 73 | |
GermanD | 4:790b7fce49bd | 74 | // comparo lo que me entra con el vector del botón |
GermanD | 4:790b7fce49bd | 75 | for(i=0;i<=(num_bits-1);i++){ |
GermanD | 4:790b7fce49bd | 76 | if(bot[i]==sol[i]){ |
GermanD | 4:790b7fce49bd | 77 | |
GermanD | 4:790b7fce49bd | 78 | prender++; |
GermanD | 4:790b7fce49bd | 79 | } |
GermanD | 4:790b7fce49bd | 80 | if(bot[i]==arriba[i]){ |
GermanD | 4:790b7fce49bd | 81 | |
GermanD | 4:790b7fce49bd | 82 | subir++; |
GermanD | 4:790b7fce49bd | 83 | } |
GermanD | 4:790b7fce49bd | 84 | if(bot[i]==abajo[i]){ |
GermanD | 4:790b7fce49bd | 85 | |
GermanD | 4:790b7fce49bd | 86 | bajar++; |
GermanD | 4:790b7fce49bd | 87 | } |
GermanD | 4:790b7fce49bd | 88 | |
GermanD | 4:790b7fce49bd | 89 | |
GermanD | 4:790b7fce49bd | 90 | } |
GermanD | 4:790b7fce49bd | 91 | |
GermanD | 4:790b7fce49bd | 92 | // para prender y apagar |
GermanD | 4:790b7fce49bd | 93 | if (g1==0 && prender==12) g1=1; |
GermanD | 4:790b7fce49bd | 94 | else if (g1==1 && prender==12) g1=0; |
GermanD | 4:790b7fce49bd | 95 | |
GermanD | 4:790b7fce49bd | 96 | |
GermanD | 4:790b7fce49bd | 97 | // para subir y bajar |
GermanD | 4:790b7fce49bd | 98 | if (subir==12 && p1<1){ |
GermanD | 4:790b7fce49bd | 99 | if (p1>=1) p1=1; |
GermanD | 4:790b7fce49bd | 100 | p1=p1+0.02; |
GermanD | 4:790b7fce49bd | 101 | rsubir=1; |
GermanD | 4:790b7fce49bd | 102 | rbajar=0; |
GermanD | 4:790b7fce49bd | 103 | conts = conts++; |
GermanD | 4:790b7fce49bd | 104 | if (conts>=3) conts=3; |
GermanD | 4:790b7fce49bd | 105 | } |
GermanD | 4:790b7fce49bd | 106 | |
GermanD | 4:790b7fce49bd | 107 | if (bajar==12 && 0<p1){ |
GermanD | 4:790b7fce49bd | 108 | if (p1<=0) p1=0; |
GermanD | 4:790b7fce49bd | 109 | p1=p1-0.02; |
GermanD | 4:790b7fce49bd | 110 | rsubir=0; |
GermanD | 4:790b7fce49bd | 111 | rbajar=1; |
GermanD | 4:790b7fce49bd | 112 | contb=contb++; |
GermanD | 4:790b7fce49bd | 113 | if (contb>=3) contb=3; |
GermanD | 4:790b7fce49bd | 114 | } |
GermanD | 4:790b7fce49bd | 115 | |
GermanD | 4:790b7fce49bd | 116 | |
GermanD | 4:790b7fce49bd | 117 | // para subir y bajar mas rápido |
GermanD | 4:790b7fce49bd | 118 | if(conts==3 && rsubir==1){ |
GermanD | 4:790b7fce49bd | 119 | if (p1>=1) p1=1; |
GermanD | 4:790b7fce49bd | 120 | p1=p1+0.08; |
GermanD | 4:790b7fce49bd | 121 | } |
GermanD | 4:790b7fce49bd | 122 | if(contb==3 && rbajar==1){ |
GermanD | 4:790b7fce49bd | 123 | if (p1<=0) p1=0; |
GermanD | 4:790b7fce49bd | 124 | p1=p1-0.08; |
GermanD | 4:790b7fce49bd | 125 | } |
GermanD | 4:790b7fce49bd | 126 | |
GermanD | 4:790b7fce49bd | 127 | } |
tony63 | 2:6a15ab0305c8 | 128 | } |