Programa de MIP

Dependencies:   bloques ball mbed WS2812 PixelArray tsi_sensor TSI bloque MMA8451Q

Committer:
anna_dot
Date:
Fri May 21 18:44:58 2021 +0000
Revision:
6:0004357c1faa
Parent:
5:a0c1625fae57
Child:
7:59efb2d370b3
accelerometre funcional;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
anna_dot 0:eb102efc70ff 1 #include "mbed.h"
anna_dot 0:eb102efc70ff 2 #include "WS2812.h"
anna_dot 0:eb102efc70ff 3 #include "PixelArray.h"
anna_dot 0:eb102efc70ff 4 #include "TSISensor.h"
anna_dot 0:eb102efc70ff 5 #include "MMA8451Q.h"
anna_dot 0:eb102efc70ff 6
anna_dot 0:eb102efc70ff 7
anna_dot 0:eb102efc70ff 8 #define WS2812_BUF 256
anna_dot 0:eb102efc70ff 9 #define NUM_COLORS 6
anna_dot 0:eb102efc70ff 10 #define NUM_LEDS_PER_COLOR 10
anna_dot 0:eb102efc70ff 11 #define NUM_LEDS_BARRA 4
anna_dot 0:eb102efc70ff 12 #define ACCEL_ADRESS_I2C (0X1D<<1)
anna_dot 0:eb102efc70ff 13
anna_dot 0:eb102efc70ff 14 PixelArray px(WS2812_BUF);
anna_dot 0:eb102efc70ff 15
anna_dot 0:eb102efc70ff 16 // See the program page for information on the timing numbers
anna_dot 0:eb102efc70ff 17 // The given numbers are for the K64F
anna_dot 0:eb102efc70ff 18 WS2812 ws(D9, WS2812_BUF, 0, 5, 5, 0);
anna_dot 4:3f515bbfd20c 19 MMA8451Q acc(PTE25, PTE24, ACCEL_ADRESS_I2C );
anna_dot 4:3f515bbfd20c 20
anna_dot 4:3f515bbfd20c 21 ///////
anna_dot 4:3f515bbfd20c 22 Serial pc(USBTX, USBRX);
anna_dot 4:3f515bbfd20c 23 //////
anna_dot 0:eb102efc70ff 24
anna_dot 0:eb102efc70ff 25 TSISensor tsi;
anna_dot 0:eb102efc70ff 26 int barra[NUM_LEDS_BARRA]={6,7,8,9};
anna_dot 0:eb102efc70ff 27 float tsi_oldRead=0;
anna_dot 0:eb102efc70ff 28 int counter_tsi=0;
anna_dot 4:3f515bbfd20c 29 int posAcelerometerTemp, posAcelerometer=0, posAcelerometerOLD=0, posAcelerometerOLD1=0, contadorReboteA=0;
anna_dot 0:eb102efc70ff 30
anna_dot 0:eb102efc70ff 31 //int pixel=8;
anna_dot 0:eb102efc70ff 32
anna_dot 0:eb102efc70ff 33 //void control_tsi(float tsi_newRead);
anna_dot 4:3f515bbfd20c 34 //void control_accel();
anna_dot 0:eb102efc70ff 35 void update_barra(int led_apagar, int led_encender, int act_barra );
anna_dot 0:eb102efc70ff 36 void tsi_ctr_modeBtn(float tsi_newRead);
anna_dot 4:3f515bbfd20c 37 void accel_ctr();
anna_dot 0:eb102efc70ff 38
anna_dot 0:eb102efc70ff 39
anna_dot 0:eb102efc70ff 40 int main()
anna_dot 6:0004357c1faa 41 { int sel_opcio=1;
anna_dot 4:3f515bbfd20c 42 pc.baud(115200);
anna_dot 4:3f515bbfd20c 43 pc.printf("\r\n\r\nHola!\r\ncompilado el " __DATE__ ", " __TIME__ "\r\n");
anna_dot 4:3f515bbfd20c 44
anna_dot 0:eb102efc70ff 45 ws.useII(WS2812::PER_PIXEL); // use per-pixel intensity scaling
anna_dot 0:eb102efc70ff 46
anna_dot 0:eb102efc70ff 47 // set up the colours we want to draw with
anna_dot 4:3f515bbfd20c 48 //int colorbuf[NUM_COLORS] = {0x2f0000,0x2f2f00,0x002f00,0x002f2f,0x00002f,0x2f002f};
anna_dot 0:eb102efc70ff 49
anna_dot 0:eb102efc70ff 50 // for each of the colours (j) write out 10 of them
anna_dot 0:eb102efc70ff 51 // the pixels are written at the colour*10, plus the colour position
anna_dot 0:eb102efc70ff 52 // all modulus 60 so it wraps around
anna_dot 0:eb102efc70ff 53 /*for (int i = 0; i < WS2812_BUF; i++) {
anna_dot 0:eb102efc70ff 54 px.Set(i, colorbuf[(i / NUM_LEDS_PER_COLOR) % NUM_COLORS]);
anna_dot 0:eb102efc70ff 55 }*/
anna_dot 0:eb102efc70ff 56 for(int i=0; i<NUM_LEDS_BARRA; i++){
anna_dot 0:eb102efc70ff 57 px.Set(barra[i], 0x2f0000);
anna_dot 0:eb102efc70ff 58 }
anna_dot 0:eb102efc70ff 59
anna_dot 0:eb102efc70ff 60 for(int i=0; i<NUM_LEDS_BARRA; i++){
anna_dot 0:eb102efc70ff 61 px.SetI(barra[i]%WS2812_BUF, 0xff);
anna_dot 0:eb102efc70ff 62 }
anna_dot 0:eb102efc70ff 63
anna_dot 0:eb102efc70ff 64
anna_dot 0:eb102efc70ff 65
anna_dot 0:eb102efc70ff 66
anna_dot 0:eb102efc70ff 67 // now all the colours are computed, add a fade effect using intensity scaling
anna_dot 0:eb102efc70ff 68 // compute and write the II value for each pixel
anna_dot 0:eb102efc70ff 69 /*for (int j=0; j<WS2812_BUF; j++) {
anna_dot 0:eb102efc70ff 70 // px.SetI(pixel position, II value)
anna_dot 0:eb102efc70ff 71 px.SetI(j%WS2812_BUF, 0xf+(0xf*(j%NUM_LEDS_PER_COLOR)));
anna_dot 0:eb102efc70ff 72 }
anna_dot 0:eb102efc70ff 73
anna_dot 0:eb102efc70ff 74 */
anna_dot 0:eb102efc70ff 75 // Now the buffer is written, rotate it
anna_dot 0:eb102efc70ff 76 // by writing it out with an increasing offset
anna_dot 0:eb102efc70ff 77 ws.write(px.getBuf());
anna_dot 0:eb102efc70ff 78 while (1) {
anna_dot 0:eb102efc70ff 79 /*for (int z=WS2812_BUF; z >= 0 ; z--) {
anna_dot 0:eb102efc70ff 80 ws.write_offsets(px.getBuf(),z,z,z);
anna_dot 0:eb102efc70ff 81 wait(0.075);
anna_dot 0:eb102efc70ff 82 }*/
anna_dot 6:0004357c1faa 83 if(sel_opcio==0){
anna_dot 6:0004357c1faa 84 tsi_ctr_modeBtn(tsi.readPercentage());
anna_dot 6:0004357c1faa 85 }
anna_dot 6:0004357c1faa 86 else{
anna_dot 6:0004357c1faa 87 if(sel_opcio==1){
anna_dot 6:0004357c1faa 88 }
anna_dot 6:0004357c1faa 89 else if(sel_opcio==2){
anna_dot 6:0004357c1faa 90 accel_ctr();
anna_dot 6:0004357c1faa 91 }
anna_dot 6:0004357c1faa 92 }
anna_dot 0:eb102efc70ff 93
anna_dot 0:eb102efc70ff 94 }
anna_dot 0:eb102efc70ff 95
anna_dot 0:eb102efc70ff 96 }
anna_dot 0:eb102efc70ff 97
anna_dot 0:eb102efc70ff 98 void tsi_ctr_modeBtn(float tsi_newRead){
anna_dot 0:eb102efc70ff 99
anna_dot 0:eb102efc70ff 100 if(tsi_newRead!=0.0){
anna_dot 0:eb102efc70ff 101 if(tsi_newRead>0.6 and tsi_oldRead>0.6){
anna_dot 0:eb102efc70ff 102 counter_tsi++;
anna_dot 0:eb102efc70ff 103 }
anna_dot 0:eb102efc70ff 104 else {
anna_dot 0:eb102efc70ff 105 if(tsi_newRead<0.4 and tsi_oldRead<0.4){
anna_dot 0:eb102efc70ff 106 counter_tsi++;
anna_dot 0:eb102efc70ff 107 }
anna_dot 0:eb102efc70ff 108 else{
anna_dot 0:eb102efc70ff 109 counter_tsi=0;
anna_dot 0:eb102efc70ff 110 }
anna_dot 0:eb102efc70ff 111 }
anna_dot 0:eb102efc70ff 112 tsi_oldRead=tsi_newRead;
anna_dot 0:eb102efc70ff 113
anna_dot 0:eb102efc70ff 114
anna_dot 0:eb102efc70ff 115 if(counter_tsi == 250){
anna_dot 0:eb102efc70ff 116 if( (tsi_newRead < 0.4) && tsi_newRead!=0 ){ //if left
anna_dot 0:eb102efc70ff 117 if(barra[0]>0){
anna_dot 0:eb102efc70ff 118 update_barra((NUM_LEDS_BARRA-1),0, -1 );
anna_dot 0:eb102efc70ff 119 }
anna_dot 0:eb102efc70ff 120 }
anna_dot 0:eb102efc70ff 121 else{
anna_dot 0:eb102efc70ff 122 if(tsi_newRead > 0.6){ //if right
anna_dot 0:eb102efc70ff 123 if(barra[NUM_LEDS_BARRA-1]<15){
anna_dot 0:eb102efc70ff 124 update_barra(0,(NUM_LEDS_BARRA-1), 1 );
anna_dot 0:eb102efc70ff 125 }
anna_dot 0:eb102efc70ff 126 }
anna_dot 0:eb102efc70ff 127 }
anna_dot 0:eb102efc70ff 128 //control_tsi(tsi_newRead);
anna_dot 0:eb102efc70ff 129 ws.write(px.getBuf());
anna_dot 0:eb102efc70ff 130 counter_tsi=0;
anna_dot 0:eb102efc70ff 131 }
anna_dot 0:eb102efc70ff 132 }
anna_dot 0:eb102efc70ff 133 else{
anna_dot 0:eb102efc70ff 134 counter_tsi=0;
anna_dot 0:eb102efc70ff 135 }
anna_dot 0:eb102efc70ff 136
anna_dot 0:eb102efc70ff 137
anna_dot 0:eb102efc70ff 138 //tsi_oldRead=tsi_newRead;
anna_dot 0:eb102efc70ff 139 }
anna_dot 0:eb102efc70ff 140
anna_dot 0:eb102efc70ff 141 /*void control_tsi(float tsi_newRead){
anna_dot 0:eb102efc70ff 142 float percent= tsi_newRead; //tsi.readPercentage();
anna_dot 0:eb102efc70ff 143 if( (percent < 0.4) && percent!=0 ){ //if left
anna_dot 0:eb102efc70ff 144 if(barra[0]>0){
anna_dot 0:eb102efc70ff 145 px.Set(barra[NUM_LEDS_BARRA-1], 0x0); //apagamos el último led
anna_dot 0:eb102efc70ff 146 //px.SetI(barra[NUM_LEDS_BARRA-1]%WS2812_BUF, 0x0);
anna_dot 0:eb102efc70ff 147
anna_dot 0:eb102efc70ff 148 for(int i=0; i<NUM_LEDS_BARRA; i++){ //actualizamos valor del array
anna_dot 0:eb102efc70ff 149 barra[i]=barra[i]-1;
anna_dot 0:eb102efc70ff 150 }
anna_dot 0:eb102efc70ff 151
anna_dot 0:eb102efc70ff 152 px.Set(barra[0], 0x2f0000); //encendemos el siguiente led a la izquierda
anna_dot 0:eb102efc70ff 153 px.SetI(barra[0]%WS2812_BUF, 0xff);
anna_dot 0:eb102efc70ff 154
anna_dot 0:eb102efc70ff 155 //update_barra((NUM_LEDS_BARRA-1),0, -1 );
anna_dot 0:eb102efc70ff 156 }
anna_dot 0:eb102efc70ff 157 }
anna_dot 0:eb102efc70ff 158 else{
anna_dot 0:eb102efc70ff 159 if(percent > 0.6){ //if right
anna_dot 0:eb102efc70ff 160 if(barra[NUM_LEDS_BARRA-1]<15){
anna_dot 0:eb102efc70ff 161 px.Set(barra[0], 0x0); //apagamos el primer led
anna_dot 0:eb102efc70ff 162 //px.SetI(barra[0]%WS2812_BUF, 0x0);
anna_dot 0:eb102efc70ff 163
anna_dot 0:eb102efc70ff 164 for(int i=0; i<NUM_LEDS_BARRA; i++){ //actualizamos valor del array
anna_dot 0:eb102efc70ff 165 barra[i]=barra[i]+1;
anna_dot 0:eb102efc70ff 166 }
anna_dot 0:eb102efc70ff 167
anna_dot 0:eb102efc70ff 168 px.Set(barra[NUM_LEDS_BARRA-1], 0x2f0000); //encendemos el siguiente led a la derecha
anna_dot 0:eb102efc70ff 169 px.SetI(barra[NUM_LEDS_BARRA-1]%WS2812_BUF, 0xff);
anna_dot 0:eb102efc70ff 170
anna_dot 0:eb102efc70ff 171 //update_barra(0,(NUM_LEDS_BARRA-1), 1 );
anna_dot 0:eb102efc70ff 172 }
anna_dot 0:eb102efc70ff 173
anna_dot 0:eb102efc70ff 174 }
anna_dot 0:eb102efc70ff 175 }
anna_dot 0:eb102efc70ff 176
anna_dot 0:eb102efc70ff 177 //ws.write(px.getBuf());
anna_dot 0:eb102efc70ff 178 }*/
anna_dot 0:eb102efc70ff 179 void update_barra(int led_apagar, int led_encender, int act_barra ){
anna_dot 4:3f515bbfd20c 180 px.Set(barra[led_apagar], 0x0); //apagamos el led
anna_dot 0:eb102efc70ff 181
anna_dot 0:eb102efc70ff 182 for(int i=0; i<NUM_LEDS_BARRA; i++){ //actualizamos valor del array
anna_dot 0:eb102efc70ff 183 barra[i]=barra[i]+act_barra;
anna_dot 4:3f515bbfd20c 184 pc.printf("\r\n UPDATEEE ------- =%d", barra[i]);
anna_dot 0:eb102efc70ff 185 }
anna_dot 0:eb102efc70ff 186
anna_dot 4:3f515bbfd20c 187 px.Set(barra[led_encender], 0x2f0000); //encendemos el siguiente led
anna_dot 0:eb102efc70ff 188 px.SetI(barra[led_encender]%WS2812_BUF, 0xff);
anna_dot 0:eb102efc70ff 189 }
anna_dot 0:eb102efc70ff 190
anna_dot 4:3f515bbfd20c 191
anna_dot 4:3f515bbfd20c 192 void accel_ctr(){
anna_dot 4:3f515bbfd20c 193 float nearest = floor(abs(((acc.getAccY()+1)*100)/2)); //para obtener un valor 0 y 100
anna_dot 4:3f515bbfd20c 194 posAcelerometerTemp=(((nearest)*2.8)-140)/10;
anna_dot 4:3f515bbfd20c 195 //pc.printf("\r\n Porcentaje=%d",posAcelerometerTemp);
anna_dot 4:3f515bbfd20c 196 if(posAcelerometerTemp<=-7){
anna_dot 4:3f515bbfd20c 197 posAcelerometerTemp=-6;
anna_dot 4:3f515bbfd20c 198 }else if(posAcelerometerTemp>=7){
anna_dot 4:3f515bbfd20c 199 posAcelerometerTemp=6;
anna_dot 4:3f515bbfd20c 200 }
anna_dot 4:3f515bbfd20c 201 if(posAcelerometerTemp>-7 and posAcelerometerTemp<7){
anna_dot 6:0004357c1faa 202 //pc.printf("\r\n Porcentaje=%d",posAcelerometerTemp);
anna_dot 4:3f515bbfd20c 203 //pc.printf("\r\n Ha entrat");
anna_dot 4:3f515bbfd20c 204 if(posAcelerometerTemp==posAcelerometerOLD1){
anna_dot 4:3f515bbfd20c 205 contadorReboteA=contadorReboteA+1;
anna_dot 4:3f515bbfd20c 206 }else{
anna_dot 4:3f515bbfd20c 207 contadorReboteA=0;
anna_dot 4:3f515bbfd20c 208 }
anna_dot 4:3f515bbfd20c 209 posAcelerometerOLD1=posAcelerometerTemp;
anna_dot 6:0004357c1faa 210 if(contadorReboteA>=10){
anna_dot 4:3f515bbfd20c 211 posAcelerometer=posAcelerometerTemp;
anna_dot 4:3f515bbfd20c 212 }
anna_dot 4:3f515bbfd20c 213
anna_dot 4:3f515bbfd20c 214 }
anna_dot 4:3f515bbfd20c 215 if(posAcelerometer!=posAcelerometerOLD){
anna_dot 4:3f515bbfd20c 216 if(posAcelerometer>posAcelerometerOLD){
anna_dot 6:0004357c1faa 217 for(int p=posAcelerometerOLD; p<posAcelerometer; p++){ //movemos la barrita hasta la posición actual, mostrando la animación
anna_dot 6:0004357c1faa 218 update_barra(0,(NUM_LEDS_BARRA-1), 1 ); //if rigth
anna_dot 6:0004357c1faa 219 ws.write(px.getBuf());
anna_dot 4:3f515bbfd20c 220 //pc.printf("\r\n HOLAAAA DRETA=%d",p);
anna_dot 4:3f515bbfd20c 221
anna_dot 6:0004357c1faa 222 }
anna_dot 4:3f515bbfd20c 223 }else if(posAcelerometer<posAcelerometerOLD){
anna_dot 6:0004357c1faa 224 //pc.printf("\r\n HOLAAAA ESQUERRA");
anna_dot 6:0004357c1faa 225 for(int p=posAcelerometerOLD; p>posAcelerometer; p--){
anna_dot 6:0004357c1faa 226 update_barra((NUM_LEDS_BARRA-1), 0, -1 ); //if left
anna_dot 6:0004357c1faa 227 ws.write(px.getBuf());
anna_dot 6:0004357c1faa 228 //pc.printf("\r\n HOLAAAA ESQUERRA=%d",p);
anna_dot 4:3f515bbfd20c 229
anna_dot 6:0004357c1faa 230 }
anna_dot 4:3f515bbfd20c 231
anna_dot 4:3f515bbfd20c 232 }
anna_dot 4:3f515bbfd20c 233
anna_dot 4:3f515bbfd20c 234 posAcelerometerOLD=posAcelerometer;
anna_dot 4:3f515bbfd20c 235
anna_dot 4:3f515bbfd20c 236 //pc.printf("\r\n Acelerometer");
anna_dot 4:3f515bbfd20c 237 }
anna_dot 0:eb102efc70ff 238 }
anna_dot 0:eb102efc70ff 239
anna_dot 0:eb102efc70ff 240