al oprimir cualquier tecla del teclado matricial 4x4 se genera un sonido.

Dependencies:   FPointer TextLCD keypad mbed

Fork of Tarea6 by Alexander Vallejo

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?

UserRevisionLine numberNew 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 }