Programa de MIP

Dependencies:   bloques ball mbed WS2812 PixelArray tsi_sensor TSI bloque MMA8451Q

Committer:
anna_dot
Date:
Fri May 21 18:01:42 2021 +0000
Revision:
4:3f515bbfd20c
Parent:
3:769c63f85711
Child:
5:a0c1625fae57
funcio accelerometre

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 0:eb102efc70ff 41 {
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 0:eb102efc70ff 83
anna_dot 4:3f515bbfd20c 84 //tsi_ctr_modeBtn(tsi.readPercentage());
anna_dot 0:eb102efc70ff 85
anna_dot 4:3f515bbfd20c 86 accel_ctr();
anna_dot 0:eb102efc70ff 87
anna_dot 0:eb102efc70ff 88 }
anna_dot 0:eb102efc70ff 89
anna_dot 0:eb102efc70ff 90 }
anna_dot 0:eb102efc70ff 91
anna_dot 0:eb102efc70ff 92 void tsi_ctr_modeBtn(float tsi_newRead){
anna_dot 0:eb102efc70ff 93
anna_dot 0:eb102efc70ff 94 if(tsi_newRead!=0.0){
anna_dot 0:eb102efc70ff 95 if(tsi_newRead>0.6 and tsi_oldRead>0.6){
anna_dot 0:eb102efc70ff 96 counter_tsi++;
anna_dot 0:eb102efc70ff 97 }
anna_dot 0:eb102efc70ff 98 else {
anna_dot 0:eb102efc70ff 99 if(tsi_newRead<0.4 and tsi_oldRead<0.4){
anna_dot 0:eb102efc70ff 100 counter_tsi++;
anna_dot 0:eb102efc70ff 101 }
anna_dot 0:eb102efc70ff 102 else{
anna_dot 0:eb102efc70ff 103 counter_tsi=0;
anna_dot 0:eb102efc70ff 104 }
anna_dot 0:eb102efc70ff 105 }
anna_dot 0:eb102efc70ff 106 tsi_oldRead=tsi_newRead;
anna_dot 0:eb102efc70ff 107
anna_dot 0:eb102efc70ff 108
anna_dot 0:eb102efc70ff 109 if(counter_tsi == 250){
anna_dot 0:eb102efc70ff 110 if( (tsi_newRead < 0.4) && tsi_newRead!=0 ){ //if left
anna_dot 0:eb102efc70ff 111 if(barra[0]>0){
anna_dot 0:eb102efc70ff 112 update_barra((NUM_LEDS_BARRA-1),0, -1 );
anna_dot 0:eb102efc70ff 113 }
anna_dot 0:eb102efc70ff 114 }
anna_dot 0:eb102efc70ff 115 else{
anna_dot 0:eb102efc70ff 116 if(tsi_newRead > 0.6){ //if right
anna_dot 0:eb102efc70ff 117 if(barra[NUM_LEDS_BARRA-1]<15){
anna_dot 0:eb102efc70ff 118 update_barra(0,(NUM_LEDS_BARRA-1), 1 );
anna_dot 0:eb102efc70ff 119 }
anna_dot 0:eb102efc70ff 120 }
anna_dot 0:eb102efc70ff 121 }
anna_dot 0:eb102efc70ff 122 //control_tsi(tsi_newRead);
anna_dot 0:eb102efc70ff 123 ws.write(px.getBuf());
anna_dot 0:eb102efc70ff 124 counter_tsi=0;
anna_dot 0:eb102efc70ff 125 }
anna_dot 0:eb102efc70ff 126 }
anna_dot 0:eb102efc70ff 127 else{
anna_dot 0:eb102efc70ff 128 counter_tsi=0;
anna_dot 0:eb102efc70ff 129 }
anna_dot 0:eb102efc70ff 130
anna_dot 0:eb102efc70ff 131
anna_dot 0:eb102efc70ff 132 //tsi_oldRead=tsi_newRead;
anna_dot 0:eb102efc70ff 133 }
anna_dot 0:eb102efc70ff 134
anna_dot 0:eb102efc70ff 135 /*void control_tsi(float tsi_newRead){
anna_dot 0:eb102efc70ff 136 float percent= tsi_newRead; //tsi.readPercentage();
anna_dot 0:eb102efc70ff 137 if( (percent < 0.4) && percent!=0 ){ //if left
anna_dot 0:eb102efc70ff 138 if(barra[0]>0){
anna_dot 0:eb102efc70ff 139 px.Set(barra[NUM_LEDS_BARRA-1], 0x0); //apagamos el último led
anna_dot 0:eb102efc70ff 140 //px.SetI(barra[NUM_LEDS_BARRA-1]%WS2812_BUF, 0x0);
anna_dot 0:eb102efc70ff 141
anna_dot 0:eb102efc70ff 142 for(int i=0; i<NUM_LEDS_BARRA; i++){ //actualizamos valor del array
anna_dot 0:eb102efc70ff 143 barra[i]=barra[i]-1;
anna_dot 0:eb102efc70ff 144 }
anna_dot 0:eb102efc70ff 145
anna_dot 0:eb102efc70ff 146 px.Set(barra[0], 0x2f0000); //encendemos el siguiente led a la izquierda
anna_dot 0:eb102efc70ff 147 px.SetI(barra[0]%WS2812_BUF, 0xff);
anna_dot 0:eb102efc70ff 148
anna_dot 0:eb102efc70ff 149 //update_barra((NUM_LEDS_BARRA-1),0, -1 );
anna_dot 0:eb102efc70ff 150 }
anna_dot 0:eb102efc70ff 151 }
anna_dot 0:eb102efc70ff 152 else{
anna_dot 0:eb102efc70ff 153 if(percent > 0.6){ //if right
anna_dot 0:eb102efc70ff 154 if(barra[NUM_LEDS_BARRA-1]<15){
anna_dot 0:eb102efc70ff 155 px.Set(barra[0], 0x0); //apagamos el primer led
anna_dot 0:eb102efc70ff 156 //px.SetI(barra[0]%WS2812_BUF, 0x0);
anna_dot 0:eb102efc70ff 157
anna_dot 0:eb102efc70ff 158 for(int i=0; i<NUM_LEDS_BARRA; i++){ //actualizamos valor del array
anna_dot 0:eb102efc70ff 159 barra[i]=barra[i]+1;
anna_dot 0:eb102efc70ff 160 }
anna_dot 0:eb102efc70ff 161
anna_dot 0:eb102efc70ff 162 px.Set(barra[NUM_LEDS_BARRA-1], 0x2f0000); //encendemos el siguiente led a la derecha
anna_dot 0:eb102efc70ff 163 px.SetI(barra[NUM_LEDS_BARRA-1]%WS2812_BUF, 0xff);
anna_dot 0:eb102efc70ff 164
anna_dot 0:eb102efc70ff 165 //update_barra(0,(NUM_LEDS_BARRA-1), 1 );
anna_dot 0:eb102efc70ff 166 }
anna_dot 0:eb102efc70ff 167
anna_dot 0:eb102efc70ff 168 }
anna_dot 0:eb102efc70ff 169 }
anna_dot 0:eb102efc70ff 170
anna_dot 0:eb102efc70ff 171 //ws.write(px.getBuf());
anna_dot 0:eb102efc70ff 172 }*/
anna_dot 0:eb102efc70ff 173 void update_barra(int led_apagar, int led_encender, int act_barra ){
anna_dot 4:3f515bbfd20c 174 px.Set(barra[led_apagar], 0x0); //apagamos el led
anna_dot 0:eb102efc70ff 175
anna_dot 0:eb102efc70ff 176 for(int i=0; i<NUM_LEDS_BARRA; i++){ //actualizamos valor del array
anna_dot 0:eb102efc70ff 177 barra[i]=barra[i]+act_barra;
anna_dot 4:3f515bbfd20c 178 pc.printf("\r\n UPDATEEE ------- =%d", barra[i]);
anna_dot 0:eb102efc70ff 179 }
anna_dot 0:eb102efc70ff 180
anna_dot 4:3f515bbfd20c 181 px.Set(barra[led_encender], 0x2f0000); //encendemos el siguiente led
anna_dot 0:eb102efc70ff 182 px.SetI(barra[led_encender]%WS2812_BUF, 0xff);
anna_dot 0:eb102efc70ff 183 }
anna_dot 0:eb102efc70ff 184
anna_dot 4:3f515bbfd20c 185 /*void control_accel(){
anna_dot 0:eb102efc70ff 186 float acY= accel.getAccY();
anna_dot 0:eb102efc70ff 187 if(acY>0.3){
anna_dot 0:eb102efc70ff 188 if(barra[NUM_LEDS_BARRA-1]<15){
anna_dot 0:eb102efc70ff 189 px.Set(barra[0], 0x0); //apagamos el primer led
anna_dot 0:eb102efc70ff 190 //px.SetI(barra[0]%WS2812_BUF, 0x0);
anna_dot 0:eb102efc70ff 191
anna_dot 0:eb102efc70ff 192 for(int i=0; i<NUM_LEDS_BARRA; i++){ //actualizamos valor del array
anna_dot 0:eb102efc70ff 193 barra[i]=barra[i]+1;
anna_dot 0:eb102efc70ff 194 }
anna_dot 0:eb102efc70ff 195
anna_dot 0:eb102efc70ff 196 px.Set(barra[NUM_LEDS_BARRA-1], 0x2f0000); //encendemos el siguiente led a la derecha
anna_dot 0:eb102efc70ff 197 px.SetI(barra[NUM_LEDS_BARRA-1]%WS2812_BUF, 0xff);
anna_dot 0:eb102efc70ff 198 }
anna_dot 0:eb102efc70ff 199
anna_dot 0:eb102efc70ff 200 }
anna_dot 0:eb102efc70ff 201 else{
anna_dot 0:eb102efc70ff 202 if(acY<-0.3){ //if left
anna_dot 0:eb102efc70ff 203 if(barra[0]>0){
anna_dot 0:eb102efc70ff 204 px.Set(barra[NUM_LEDS_BARRA-1], 0x0); //apagamos el último led
anna_dot 0:eb102efc70ff 205 //px.SetI(barra[NUM_LEDS_BARRA-1]%WS2812_BUF, 0x0);
anna_dot 0:eb102efc70ff 206
anna_dot 0:eb102efc70ff 207 for(int i=0; i<NUM_LEDS_BARRA; i++){ //actualizamos valor del array
anna_dot 0:eb102efc70ff 208 barra[i]=barra[i]-1;
anna_dot 0:eb102efc70ff 209 }
anna_dot 0:eb102efc70ff 210
anna_dot 0:eb102efc70ff 211 px.Set(barra[0], 0x2f0000); //encendemos el siguiente led a la izquierda
anna_dot 0:eb102efc70ff 212 px.SetI(barra[0]%WS2812_BUF, 0xff);
anna_dot 0:eb102efc70ff 213 }
anna_dot 0:eb102efc70ff 214 }
anna_dot 0:eb102efc70ff 215 }
anna_dot 4:3f515bbfd20c 216 }*/
anna_dot 4:3f515bbfd20c 217
anna_dot 4:3f515bbfd20c 218 /* void setPixelColor(int numPixelMatrix, int r, int g, int b){
anna_dot 4:3f515bbfd20c 219 px.SetI(numPixelMatrix,255);
anna_dot 4:3f515bbfd20c 220 px.SetR(numPixelMatrix,r);
anna_dot 4:3f515bbfd20c 221 px.SetG(numPixelMatrix,g);
anna_dot 4:3f515bbfd20c 222 px.SetB(numPixelMatrix,b);
anna_dot 4:3f515bbfd20c 223 }
anna_dot 4:3f515bbfd20c 224
anna_dot 4:3f515bbfd20c 225 void refreshLightStrips(){
anna_dot 4:3f515bbfd20c 226 ws.write(px.getBuf());
anna_dot 4:3f515bbfd20c 227 }
anna_dot 4:3f515bbfd20c 228
anna_dot 4:3f515bbfd20c 229 void printBar(uint8_t valR, uint8_t valG, uint8_t valB, int pos) {
anna_dot 4:3f515bbfd20c 230
anna_dot 4:3f515bbfd20c 231 printf ("\r\nRGB=> %ld, %ld, %ld \r\n", valR, valG, valB);
anna_dot 4:3f515bbfd20c 232
anna_dot 4:3f515bbfd20c 233 if(pos>=-6 and pos<=6){
anna_dot 4:3f515bbfd20c 234 for (unsigned ii = 240; ii < 256; ii++) {
anna_dot 4:3f515bbfd20c 235 setPixelColor(ii, 0, 0, 0);
anna_dot 4:3f515bbfd20c 236 }
anna_dot 4:3f515bbfd20c 237 setPixelColor(256-10+pos, valR, valG, valB);
anna_dot 4:3f515bbfd20c 238 setPixelColor(256-9+pos, valR, valG, valB);
anna_dot 4:3f515bbfd20c 239 setPixelColor(256-8+pos, valR, valG, valB);
anna_dot 4:3f515bbfd20c 240 setPixelColor(256-7+pos, valR, valG, valB);
anna_dot 4:3f515bbfd20c 241
anna_dot 4:3f515bbfd20c 242 }
anna_dot 4:3f515bbfd20c 243
anna_dot 4:3f515bbfd20c 244 refreshLightStrips();
anna_dot 4:3f515bbfd20c 245
anna_dot 4:3f515bbfd20c 246 }
anna_dot 4:3f515bbfd20c 247
anna_dot 4:3f515bbfd20c 248 */
anna_dot 4:3f515bbfd20c 249 void accel_ctr(){
anna_dot 4:3f515bbfd20c 250 float nearest = floor(abs(((acc.getAccY()+1)*100)/2)); //para obtener un valor 0 y 100
anna_dot 4:3f515bbfd20c 251 posAcelerometerTemp=(((nearest)*2.8)-140)/10;
anna_dot 4:3f515bbfd20c 252 //pc.printf("\r\n Porcentaje=%d",posAcelerometerTemp);
anna_dot 4:3f515bbfd20c 253 if(posAcelerometerTemp<=-7){
anna_dot 4:3f515bbfd20c 254 posAcelerometerTemp=-6;
anna_dot 4:3f515bbfd20c 255 }else if(posAcelerometerTemp>=7){
anna_dot 4:3f515bbfd20c 256 posAcelerometerTemp=6;
anna_dot 4:3f515bbfd20c 257 }
anna_dot 4:3f515bbfd20c 258 if(posAcelerometerTemp>-7 and posAcelerometerTemp<7){
anna_dot 4:3f515bbfd20c 259 pc.printf("\r\n Porcentaje=%d",posAcelerometerTemp);
anna_dot 4:3f515bbfd20c 260
anna_dot 4:3f515bbfd20c 261 //pc.printf("\r\n Ha entrat");
anna_dot 4:3f515bbfd20c 262 if(posAcelerometerTemp==posAcelerometerOLD1){
anna_dot 4:3f515bbfd20c 263 contadorReboteA=contadorReboteA+1;
anna_dot 4:3f515bbfd20c 264 }else{
anna_dot 4:3f515bbfd20c 265 contadorReboteA=0;
anna_dot 4:3f515bbfd20c 266 }
anna_dot 4:3f515bbfd20c 267 posAcelerometerOLD1=posAcelerometerTemp;
anna_dot 4:3f515bbfd20c 268 if(contadorReboteA>=100){
anna_dot 4:3f515bbfd20c 269 posAcelerometer=posAcelerometerTemp;
anna_dot 4:3f515bbfd20c 270 pc.printf("\r\n NEWWWW =%d",posAcelerometer);
anna_dot 4:3f515bbfd20c 271 pc.printf("\r\n OOOLD =%d",posAcelerometerOLD);
anna_dot 4:3f515bbfd20c 272 }
anna_dot 4:3f515bbfd20c 273
anna_dot 4:3f515bbfd20c 274 }
anna_dot 4:3f515bbfd20c 275 if(posAcelerometer!=posAcelerometerOLD){
anna_dot 4:3f515bbfd20c 276 if(posAcelerometer>posAcelerometerOLD){
anna_dot 4:3f515bbfd20c 277 for(int p=posAcelerometerOLD; p<=posAcelerometer; p++){ //movemos la barrita hasta la posición actual, mostrando la animación
anna_dot 4:3f515bbfd20c 278 if(barra[NUM_LEDS_BARRA-1]<15){
anna_dot 4:3f515bbfd20c 279 update_barra(0,(NUM_LEDS_BARRA-1), 1 ); //if rigth
anna_dot 4:3f515bbfd20c 280 ws.write(px.getBuf());
anna_dot 4:3f515bbfd20c 281 }
anna_dot 4:3f515bbfd20c 282 //pc.printf("\r\n HOLAAAA DRETA=%d",p);
anna_dot 4:3f515bbfd20c 283 //printBar( 255, 0, 0, p);
anna_dot 4:3f515bbfd20c 284
anna_dot 4:3f515bbfd20c 285 }
anna_dot 4:3f515bbfd20c 286 }else if(posAcelerometer<posAcelerometerOLD){
anna_dot 4:3f515bbfd20c 287 for(int p=posAcelerometerOLD; p>=posAcelerometer; p--){
anna_dot 4:3f515bbfd20c 288 //printBar( 255, 0, 0, p);
anna_dot 4:3f515bbfd20c 289 if(barra[0]>0){
anna_dot 4:3f515bbfd20c 290 update_barra((NUM_LEDS_BARRA-1), 0, -1 ); //if left
anna_dot 4:3f515bbfd20c 291 ws.write(px.getBuf());
anna_dot 4:3f515bbfd20c 292 }
anna_dot 4:3f515bbfd20c 293 //pc.printf("\r\n HOLAAAA ESQUERRA=%d",p);
anna_dot 4:3f515bbfd20c 294
anna_dot 4:3f515bbfd20c 295 }
anna_dot 4:3f515bbfd20c 296
anna_dot 4:3f515bbfd20c 297 }
anna_dot 4:3f515bbfd20c 298
anna_dot 4:3f515bbfd20c 299 posAcelerometerOLD=posAcelerometer;
anna_dot 4:3f515bbfd20c 300
anna_dot 4:3f515bbfd20c 301 //pc.printf("\r\n Acelerometer");
anna_dot 4:3f515bbfd20c 302 }
anna_dot 0:eb102efc70ff 303 }
anna_dot 0:eb102efc70ff 304
anna_dot 0:eb102efc70ff 305