al oprimir cualquier tecla del teclado matricial 4x4 se genera un sonido.
Dependencies: FPointer TextLCD keypad mbed
Fork of Tarea6 by
main.cpp@1:71b5c04df300, 2014-04-08 (annotated)
- Committer:
- lopjohn_26
- Date:
- Tue Apr 08 16:56:14 2014 +0000
- Revision:
- 1:71b5c04df300
- Parent:
- 0:e8c0430c5d6d
sonido teclado matricial 4x4
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
avallejopo | 0:e8c0430c5d6d | 1 | #include "mbed.h" |
avallejopo | 0:e8c0430c5d6d | 2 | #include "keypad.h" |
avallejopo | 0:e8c0430c5d6d | 3 | #include "TextLCD.h" |
avallejopo | 0:e8c0430c5d6d | 4 | #include "stdlib.h" |
avallejopo | 0:e8c0430c5d6d | 5 | |
avallejopo | 0:e8c0430c5d6d | 6 | TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7 |
avallejopo | 0:e8c0430c5d6d | 7 | AnalogIn y(PTB0); |
avallejopo | 0:e8c0430c5d6d | 8 | AnalogOut u(PTE30); |
lopjohn_26 | 1:71b5c04df300 | 9 | PwmOut sound(PTA12); |
lopjohn_26 | 1:71b5c04df300 | 10 | |
avallejopo | 0:e8c0430c5d6d | 11 | int C1=0x0F; // Cursor |
avallejopo | 0:e8c0430c5d6d | 12 | int C4=0x0C; // quito cursor bajo |
avallejopo | 0:e8c0430c5d6d | 13 | int spnum=0,kinum=0,kpnum=0,kdnum=0,pos=1,tecla,flag1=1,num=0; |
avallejopo | 0:e8c0430c5d6d | 14 | int err, med, yr, pid, ap, ai, ad, err_v; |
avallejopo | 0:e8c0430c5d6d | 15 | float pidn; |
avallejopo | 0:e8c0430c5d6d | 16 | int flagt=0; |
avallejopo | 0:e8c0430c5d6d | 17 | Timer t; |
avallejopo | 0:e8c0430c5d6d | 18 | char cadena[3]={' ',' ',' '}; |
avallejopo | 0:e8c0430c5d6d | 19 | int llena=0; //verificar que la entrada es de 3 numeros |
avallejopo | 0:e8c0430c5d6d | 20 | // Define your own keypad values |
avallejopo | 0:e8c0430c5d6d | 21 | char Keytable[] = { '1', '2', '3', 'A', |
avallejopo | 0:e8c0430c5d6d | 22 | '4', '5', '6', 'B', |
avallejopo | 0:e8c0430c5d6d | 23 | '7', '8', '9', 'C', |
avallejopo | 0:e8c0430c5d6d | 24 | '*', '0', '#', 'D' |
avallejopo | 0:e8c0430c5d6d | 25 | }; |
avallejopo | 0:e8c0430c5d6d | 26 | |
avallejopo | 0:e8c0430c5d6d | 27 | uint32_t cbAfterInput(uint32_t index) { |
avallejopo | 0:e8c0430c5d6d | 28 | tecla=index; |
avallejopo | 0:e8c0430c5d6d | 29 | flag1=0; |
avallejopo | 0:e8c0430c5d6d | 30 | return 0; |
avallejopo | 0:e8c0430c5d6d | 31 | } |
avallejopo | 0:e8c0430c5d6d | 32 | |
avallejopo | 0:e8c0430c5d6d | 33 | int main() { |
lopjohn_26 | 1:71b5c04df300 | 34 | Keypad keypad(PTA2,PTD4,PTD3,PTD7,PTA13,PTD5,PTD0,PTD2); |
avallejopo | 0:e8c0430c5d6d | 35 | ini1: |
avallejopo | 0:e8c0430c5d6d | 36 | err=0; med=0; yr=0; pid=0; ap=0; ai=0; ad=0; err_v=0;pidn=0; |
avallejopo | 0:e8c0430c5d6d | 37 | lcd.cls(); // Borrar Pantalla |
avallejopo | 0:e8c0430c5d6d | 38 | lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD |
avallejopo | 0:e8c0430c5d6d | 39 | |
avallejopo | 0:e8c0430c5d6d | 40 | lcd.locate(8,0); |
avallejopo | 0:e8c0430c5d6d | 41 | lcd.printf("Kp=%d",kpnum); |
avallejopo | 0:e8c0430c5d6d | 42 | lcd.locate(0,1); |
avallejopo | 0:e8c0430c5d6d | 43 | lcd.printf("Ki=%d",kinum); |
avallejopo | 0:e8c0430c5d6d | 44 | lcd.locate(8,1); |
avallejopo | 0:e8c0430c5d6d | 45 | lcd.printf("Kd=%d",kdnum); |
avallejopo | 0:e8c0430c5d6d | 46 | lcd.locate(0,0); |
avallejopo | 0:e8c0430c5d6d | 47 | lcd.printf("Sp=%d",spnum); |
avallejopo | 0:e8c0430c5d6d | 48 | |
avallejopo | 0:e8c0430c5d6d | 49 | ini2: |
avallejopo | 0:e8c0430c5d6d | 50 | keypad.CallAfterInput(&cbAfterInput); |
avallejopo | 0:e8c0430c5d6d | 51 | keypad.Start(); |
avallejopo | 0:e8c0430c5d6d | 52 | if(flag1==0){ |
lopjohn_26 | 1:71b5c04df300 | 53 | if(Keytable[tecla]=='B'){ // Cambia de posición entre kp kd ki y sp |
lopjohn_26 | 1:71b5c04df300 | 54 | |
lopjohn_26 | 1:71b5c04df300 | 55 | sound=1.0f; |
lopjohn_26 | 1:71b5c04df300 | 56 | wait(0.1); |
lopjohn_26 | 1:71b5c04df300 | 57 | sound=0; |
lopjohn_26 | 1:71b5c04df300 | 58 | |
avallejopo | 0:e8c0430c5d6d | 59 | cadena[0]=' ';cadena[1]=' ';cadena[2]=' '; |
avallejopo | 0:e8c0430c5d6d | 60 | llena=0; |
avallejopo | 0:e8c0430c5d6d | 61 | num=0; |
avallejopo | 0:e8c0430c5d6d | 62 | if(pos==4){ |
avallejopo | 0:e8c0430c5d6d | 63 | pos=1;} |
avallejopo | 0:e8c0430c5d6d | 64 | else { |
avallejopo | 0:e8c0430c5d6d | 65 | pos++;} |
avallejopo | 0:e8c0430c5d6d | 66 | } |
lopjohn_26 | 1:71b5c04df300 | 67 | else if(Keytable[tecla]=='A'){ //con el A borra |
lopjohn_26 | 1:71b5c04df300 | 68 | |
lopjohn_26 | 1:71b5c04df300 | 69 | sound=1.0f; |
lopjohn_26 | 1:71b5c04df300 | 70 | wait(0.1); |
lopjohn_26 | 1:71b5c04df300 | 71 | sound=0; |
lopjohn_26 | 1:71b5c04df300 | 72 | |
avallejopo | 0:e8c0430c5d6d | 73 | llena--; |
avallejopo | 0:e8c0430c5d6d | 74 | cadena[llena]=' '; |
avallejopo | 0:e8c0430c5d6d | 75 | num=strtod(cadena,NULL); |
avallejopo | 0:e8c0430c5d6d | 76 | } |
avallejopo | 0:e8c0430c5d6d | 77 | else if((tecla==0)||(tecla==1)||(tecla==2)||(tecla==4)||(tecla==5)||(tecla==6)||(tecla==8)||(tecla==9)||(tecla==10)||(tecla==13)){ |
avallejopo | 0:e8c0430c5d6d | 78 | if(llena<3){ |
avallejopo | 0:e8c0430c5d6d | 79 | cadena[llena]=Keytable[tecla]; |
avallejopo | 0:e8c0430c5d6d | 80 | num=strtod(cadena,NULL); |
avallejopo | 0:e8c0430c5d6d | 81 | llena++;} |
avallejopo | 0:e8c0430c5d6d | 82 | } |
lopjohn_26 | 1:71b5c04df300 | 83 | else if(Keytable[tecla]=='D'){ //guarda y simula el PID |
lopjohn_26 | 1:71b5c04df300 | 84 | |
lopjohn_26 | 1:71b5c04df300 | 85 | sound=1.0f; |
lopjohn_26 | 1:71b5c04df300 | 86 | wait(0.1); |
lopjohn_26 | 1:71b5c04df300 | 87 | sound=0; |
lopjohn_26 | 1:71b5c04df300 | 88 | |
avallejopo | 0:e8c0430c5d6d | 89 | lcd.writeCommand(C4);//escribimos un comando segun el manual del modulo LCD para quitar cursor bajo |
avallejopo | 0:e8c0430c5d6d | 90 | lcd.cls(); //borra la pantalla |
avallejopo | 0:e8c0430c5d6d | 91 | lcd.printf(" GUARDADOS!"); |
avallejopo | 0:e8c0430c5d6d | 92 | wait(1); |
avallejopo | 0:e8c0430c5d6d | 93 | lcd.cls(); |
avallejopo | 0:e8c0430c5d6d | 94 | lcd.printf(" INICIA EL PID"); |
avallejopo | 0:e8c0430c5d6d | 95 | wait(1); |
avallejopo | 0:e8c0430c5d6d | 96 | // se imprimen los parches del control ***************************************** |
avallejopo | 0:e8c0430c5d6d | 97 | lcd.cls(); |
avallejopo | 0:e8c0430c5d6d | 98 | lcd.printf("Er=%d",err); |
avallejopo | 0:e8c0430c5d6d | 99 | lcd.locate(8,0); |
avallejopo | 0:e8c0430c5d6d | 100 | lcd.printf("Me=%d",med); |
avallejopo | 0:e8c0430c5d6d | 101 | lcd.locate(0,1); |
avallejopo | 0:e8c0430c5d6d | 102 | lcd.printf("Sp=%d",spnum); |
avallejopo | 0:e8c0430c5d6d | 103 | lcd.locate(8,1); |
avallejopo | 0:e8c0430c5d6d | 104 | lcd.printf("Co=%d",pid); |
avallejopo | 0:e8c0430c5d6d | 105 | wait(2); |
avallejopo | 0:e8c0430c5d6d | 106 | cicloPID: |
lopjohn_26 | 1:71b5c04df300 | 107 | if(Keytable[tecla]=='C'){ //detiene la simulación y reinicia todas las constantes |
lopjohn_26 | 1:71b5c04df300 | 108 | |
lopjohn_26 | 1:71b5c04df300 | 109 | sound=1.0f; |
lopjohn_26 | 1:71b5c04df300 | 110 | wait(0.1); |
lopjohn_26 | 1:71b5c04df300 | 111 | sound=0; |
lopjohn_26 | 1:71b5c04df300 | 112 | |
avallejopo | 0:e8c0430c5d6d | 113 | spnum=0;kinum=0;kpnum=0;kdnum=0;llena=0;pos=1;flag1=1; |
avallejopo | 0:e8c0430c5d6d | 114 | cadena[0]=' ';cadena[1]=' ';cadena[2]=' '; |
avallejopo | 0:e8c0430c5d6d | 115 | goto ini1;} |
avallejopo | 0:e8c0430c5d6d | 116 | med=999*y.read(); //leer puerto analogo y asignar a med |
avallejopo | 0:e8c0430c5d6d | 117 | err = (spnum-med); //se calcula el error |
avallejopo | 0:e8c0430c5d6d | 118 | ap = kpnum*err; //se calcula la accion proporcinal |
avallejopo | 0:e8c0430c5d6d | 119 | if(ai<100){// se verifica que la accion integral no sea muy grande |
avallejopo | 0:e8c0430c5d6d | 120 | ai =(kinum*err)+ai;} //calculo de la integral del error |
avallejopo | 0:e8c0430c5d6d | 121 | ad = kdnum*(err-err_v); //calculo de la accion derivativa |
avallejopo | 0:e8c0430c5d6d | 122 | pid = (ap+ai+ad); |
avallejopo | 0:e8c0430c5d6d | 123 | if(pid<=0){// se verifica que pid sea positivo |
avallejopo | 0:e8c0430c5d6d | 124 | pid=0;} |
avallejopo | 0:e8c0430c5d6d | 125 | if (pid > 999){// se verifica que pid sea menor o igual la valor maximo |
avallejopo | 0:e8c0430c5d6d | 126 | pid=999;} |
avallejopo | 0:e8c0430c5d6d | 127 | err_v = err;// se actualizan las variables |
avallejopo | 0:e8c0430c5d6d | 128 | if(flagt==0){//se muestran las variables |
avallejopo | 0:e8c0430c5d6d | 129 | t.start(); |
avallejopo | 0:e8c0430c5d6d | 130 | flagt=1;} |
avallejopo | 0:e8c0430c5d6d | 131 | if(t>=0.3){ |
avallejopo | 0:e8c0430c5d6d | 132 | lcd.locate(3,0);lcd.printf(" "); |
avallejopo | 0:e8c0430c5d6d | 133 | lcd.locate(3,0);lcd.printf("%d",err); |
avallejopo | 0:e8c0430c5d6d | 134 | lcd.locate(11,0);lcd.printf(" "); |
avallejopo | 0:e8c0430c5d6d | 135 | lcd.locate(11,0);lcd.printf("%d",med); |
avallejopo | 0:e8c0430c5d6d | 136 | lcd.locate(3,1);lcd.printf(" "); |
avallejopo | 0:e8c0430c5d6d | 137 | lcd.locate(3,1);lcd.printf("%d",spnum); |
avallejopo | 0:e8c0430c5d6d | 138 | lcd.locate(11,1);lcd.printf(" "); |
avallejopo | 0:e8c0430c5d6d | 139 | lcd.locate(11,1);lcd.printf("%d",pid); |
avallejopo | 0:e8c0430c5d6d | 140 | flagt=0; |
avallejopo | 0:e8c0430c5d6d | 141 | t.reset(); |
avallejopo | 0:e8c0430c5d6d | 142 | } |
avallejopo | 0:e8c0430c5d6d | 143 | |
avallejopo | 0:e8c0430c5d6d | 144 | pidn=pid/999;//Normalizacion de la salida |
avallejopo | 0:e8c0430c5d6d | 145 | u.write(pidn);//se envia el valor pid a puerto analogico de salida (D/A) |
avallejopo | 0:e8c0430c5d6d | 146 | wait(0.005); |
avallejopo | 0:e8c0430c5d6d | 147 | goto cicloPID; |
avallejopo | 0:e8c0430c5d6d | 148 | } |
lopjohn_26 | 1:71b5c04df300 | 149 | if(pos==1){ // cambia los numeros del 1 al 3 |
lopjohn_26 | 1:71b5c04df300 | 150 | |
lopjohn_26 | 1:71b5c04df300 | 151 | sound=1.0f; |
lopjohn_26 | 1:71b5c04df300 | 152 | wait(0.1); |
lopjohn_26 | 1:71b5c04df300 | 153 | sound=0; |
lopjohn_26 | 1:71b5c04df300 | 154 | |
avallejopo | 0:e8c0430c5d6d | 155 | spnum=num; |
avallejopo | 0:e8c0430c5d6d | 156 | lcd.locate(3,0);lcd.printf(" "); |
avallejopo | 0:e8c0430c5d6d | 157 | lcd.locate(3,0);lcd.printf("%d",spnum); |
avallejopo | 0:e8c0430c5d6d | 158 | } |
lopjohn_26 | 1:71b5c04df300 | 159 | else if(pos==2){ // cambia los numeros del 4 al 5 |
lopjohn_26 | 1:71b5c04df300 | 160 | |
lopjohn_26 | 1:71b5c04df300 | 161 | sound=1.0f; |
lopjohn_26 | 1:71b5c04df300 | 162 | wait(0.1); |
lopjohn_26 | 1:71b5c04df300 | 163 | sound=0; |
lopjohn_26 | 1:71b5c04df300 | 164 | |
avallejopo | 0:e8c0430c5d6d | 165 | kpnum=num; |
avallejopo | 0:e8c0430c5d6d | 166 | lcd.locate(11,0);lcd.printf(" "); |
avallejopo | 0:e8c0430c5d6d | 167 | lcd.locate(11,0);lcd.printf("%d",kpnum); |
avallejopo | 0:e8c0430c5d6d | 168 | } |
lopjohn_26 | 1:71b5c04df300 | 169 | else if(pos==3){ // cambia los numeros del 7 al 9 |
lopjohn_26 | 1:71b5c04df300 | 170 | |
lopjohn_26 | 1:71b5c04df300 | 171 | sound=1.0f; |
lopjohn_26 | 1:71b5c04df300 | 172 | wait(0.1); |
lopjohn_26 | 1:71b5c04df300 | 173 | sound=0; |
lopjohn_26 | 1:71b5c04df300 | 174 | |
avallejopo | 0:e8c0430c5d6d | 175 | kinum=num; |
avallejopo | 0:e8c0430c5d6d | 176 | lcd.locate(3,1);lcd.printf(" "); |
avallejopo | 0:e8c0430c5d6d | 177 | lcd.locate(3,1);lcd.printf("%d",kinum); |
avallejopo | 0:e8c0430c5d6d | 178 | } |
lopjohn_26 | 1:71b5c04df300 | 179 | else if(pos==4){ // cambia los numeros de *, 0, # |
lopjohn_26 | 1:71b5c04df300 | 180 | |
lopjohn_26 | 1:71b5c04df300 | 181 | sound=1.0f; |
lopjohn_26 | 1:71b5c04df300 | 182 | wait(0.1); |
lopjohn_26 | 1:71b5c04df300 | 183 | sound=0; |
lopjohn_26 | 1:71b5c04df300 | 184 | |
avallejopo | 0:e8c0430c5d6d | 185 | kdnum=num; |
avallejopo | 0:e8c0430c5d6d | 186 | lcd.locate(11,1);lcd.printf(" "); |
avallejopo | 0:e8c0430c5d6d | 187 | lcd.locate(11,1);lcd.printf("%d",kdnum); |
avallejopo | 0:e8c0430c5d6d | 188 | } |
avallejopo | 0:e8c0430c5d6d | 189 | } |
avallejopo | 0:e8c0430c5d6d | 190 | flag1=1; |
avallejopo | 0:e8c0430c5d6d | 191 | goto ini2; |
avallejopo | 0:e8c0430c5d6d | 192 | } |