Takeuchi Kouichi
/
20160530_V31_1s_LedMatrix
LEDマトリックスユニット 3枚 気圧グラフ表示搭載
Embed:
(wiki syntax)
Show/hide line numbers
main.cpp
00001 // LedMatrix 3mai Ondo,Situdo,Kiatu 00002 00003 #include "mbed.h" 00004 #include "BME280.h" 00005 00006 DigitalOut led(dp28); 00007 00008 BME280 sensor1(dp5,dp27,0x76 << 1); 00009 00010 // spi(mosi,miso,sck) 00011 SPI max72_spi(dp2, NC, dp6); 00012 DigitalOut load(dp14);//spi load 00013 00014 // CPU MT7219 00015 // dp1 mosi(Master In Salve Out) => DIN 00016 // dp2 miso(Master OutSlave) => nc 00017 // dp6 sck (Serial Clock) => clk 00018 // dp14 =>(Slave Select) load 00019 00020 int maxInUse = 3; //change this variable to set how many MAX7219's you'll use 00021 00022 // define max7219 registers 00023 #define max7219_reg_noop 0x00 00024 #define max7219_reg_digit0 0x01 00025 #define max7219_reg_digit1 0x02 00026 #define max7219_reg_digit2 0x03 00027 #define max7219_reg_digit3 0x04 00028 #define max7219_reg_digit4 0x05 00029 #define max7219_reg_digit5 0x06 00030 #define max7219_reg_digit6 0x07 00031 #define max7219_reg_digit7 0x08 00032 #define max7219_reg_decodeMode 0x09 00033 #define max7219_reg_intensity 0x0a 00034 #define max7219_reg_scanLimit 0x0b 00035 #define max7219_reg_shutdown 0x0c 00036 #define max7219_reg_displayTest 0x0f 00037 00038 #define LOW 0 00039 #define HIGH 1 00040 #define MHZ 1000000 00041 #define ON 1 00042 #define OFF 0 00043 00044 double p1,t1,h1,pp1; 00045 00046 void maxSingle( int reg, int col) { 00047 //maxSingle is the "easy" function to use for a 00048 //single max7219 00049 load = LOW; // begin 00050 max72_spi.write(reg); // specify register 00051 max72_spi.write(col); // put data 00052 load = HIGH; // make sure data is loaded (on rising edge of LOAD/CS) 00053 } 00054 00055 void maxAll (int reg, int col) { // initialize all MAX7219's in the system 00056 load = LOW; // begin 00057 for ( int c=1; c<= maxInUse; c++) { 00058 max72_spi.write(reg); // specify register 00059 max72_spi.write(col); // put data 00060 } 00061 load = HIGH; 00062 } 00063 00064 void maxOne(int maxNr, int reg, int col) { 00065 //maxOne is for adressing different MAX7219's, 00066 //while having a couple of them cascaded 00067 int c = 0; 00068 load = LOW; 00069 00070 for ( c = maxInUse; c >= maxNr; c--) { 00071 max72_spi.write(0); // no-op 00072 max72_spi.write(0); // no-op 00073 } 00074 00075 max72_spi.write(reg); // specify register 00076 max72_spi.write(col); // put data 00077 00078 for ( c=maxNr-1; c >= 1; c--) { 00079 max72_spi.write(0); // no-op 00080 max72_spi.write(0); // no-op 00081 } 00082 load = HIGH; 00083 } 00084 00085 void setup () { 00086 // initiation of the max 7219 00087 // SPI setup: 8 bits, mode 0 00088 max72_spi.format(8, 0); 00089 00090 // going by the datasheet, min clk is 100ns so theoretically 10MHz should work... 00091 // max72_spi.frequency(10*MHZ); 00092 00093 maxAll(max7219_reg_scanLimit, 0x07); 00094 maxAll(max7219_reg_decodeMode, 0x00); // using an led matrix (not digits) 00095 maxAll(max7219_reg_shutdown, 0x01); // not in shutdown mode 00096 maxAll(max7219_reg_displayTest, 0x00); // no display test 00097 for (int e=1; e<=8; e++) { // empty registers, turn all LEDs off 00098 maxAll(e,0); 00099 } 00100 maxAll(max7219_reg_intensity, 0x0f & 0x0f); // the first 0x0f is the value you can set 00101 // range: 0x00 to 0x0f 00102 } 00103 00104 void get_sensor1(void){ 00105 t1=sensor1.getTemperature(); 00106 if(t1 > 85.0){ 00107 t1=t1-409.0-1; 00108 } 00109 h1=sensor1.getHumidity(); 00110 pp1=sensor1.getPressure(); 00111 pp1=pp1+int(700/9);// kiatu kani hosei 00112 } 00113 00114 int main(void) { 00115 00116 const uint64_t moji_font[] = {// bold font , kagami moji font 00117 /*0x3c66666e76663c00,//0~9 00118 0x7e1818181c181800, 00119 0x7e060c3060663c00, 00120 0x3c66603860663c00, 00121 0x30307e3234383000, 00122 0x3c6660603e067e00, 00123 0x3c66663e06663c00, 00124 0x1818183030667e00, 00125 0x3c66663c66663c00, 00126 0x3c66607c66663c00,*/ 00127 00128 0x1c2222222222221c,//0~9 00129 0x1c08080808080c08, 00130 0x3e0408102020221c, 00131 0x1c2220201820221c, 00132 0x20203e2224283020, 00133 0x1c2220201e02023e, 00134 0x1c2222221e02221c, 00135 0x040404081020203e, 00136 0x1c2222221c22221c, 00137 0x1c22203c2222221c, 00138 0x6666663e06060600,// 10 h 00139 0x06063e66663e0000,// 11 p 00140 0x1818000000000000,// 12 . 00141 0x30480848340a0a04, // 13 dc 00142 0x1010157555770101,// 14 hp 00143 0x0010107c10100000,// 15 + 00144 0x0000007e00000000,// 16 - 00145 0x082a1c771c2a0800, //17 asuta1 00146 0x007e424a52427e00, // 18 sikaku2 00147 0x0000000000000000, // 19 blank 00148 0x60660c1830660600, // 20 % 00149 0x4242665a5a7e1800, // 21 uchi 00150 0x220424692e2a2c00, // 22 soto 00151 0x126a3a22227a2200,// 23 ha 00152 0x44c6444c56640400,// 24 re 00153 0x2010080408102000,// 25 ku 00154 0x1028483e083e1000,// 26 mo 00155 0x1020404044444400,// 27 ri 00156 0x2874d27c107c1000,// 28 a 00157 0x449a9aaaaa7c2800,// 29 me 00158 0x6c927cc482443800,// 30 kumo 00159 0x30309254ba10aa28,// 31 ame 00160 0x082a1c771c2a0800,// 32 hare 00161 0x1010101054381000,// 33 ue yajirusi 00162 0x02040890a0c0f000,// 34 naname ue 00163 0xf0c0a09008040200,// 35 naname sita 00164 0x1038541010101000, // 36 sita 00165 0x0000183c3c180000, // 37 asuta2 00166 0x102040fe40201000, // 38 onaji yajirusi 00167 0x5050557553550503 // 39 RH 00168 }; 00169 00170 /* 00171 00172 const uint64_t moji_font[]={ 00173 0x006e333e301e0000,//a 00174 0x003b66663e060607,//b 00175 0x001e3303331e0000,//c 00176 0x006e33333e303038,//d 00177 0x001e033f331e0000,//e 00178 0x000f06060f06361c,//f 00179 0x1f303e33336e0000,//g 00180 0x006766666e360607,//h 00181 0x001e0c0c0c0e000c,//i 00182 0x1e33333030300030,//j 00183 0x0067361e36660607,//k 00184 0x001e0c0c0c0c0c0e,//l 00185 0x00636b7f7f330000,//m 00186 0x00333333331f0000,//n 00187 0x001e3333331e0000,//o 00188 0x0f063e66663b0000,//p 00189 0x78303e33336e0000,//q 00190 0x000f06666e3b0000,//r 00191 0x001f301e033e0000,//s 00192 0x00182c0c0c3e0c08,//t 00193 0x006e333333330000,//u 00194 0x000c1e3333330000,//v 00195 0x00367f7f6b630000,//w 00196 0x0063361c36630000,//x 00197 0x1f303e3333330000,//y 00198 0x003f260c193f0000 //z 00199 }; 00200 00201 */ 00202 00203 // // Jissainiha konoyouni mieru 00204 // maxSingle(1,1); |-| -------+ 00205 // maxSingle(2,2); |-| ------+- 00206 // maxSingle(3,4); |-| -----+-- 00207 // maxSingle(4,8); |-| ----+--- 00208 // maxSingle(5,16); |-| ---+---- 00209 // maxSingle(6,32); |-| --+----- 00210 // maxSingle(7,64); |-| -+------ 00211 // maxSingle(8,128); |-| +------- 00212 00213 int i,j,k,m,n; 00214 uint8_t bitsum[22][9],bit1gyou,bitline[250]; 00215 uint64_t moji1,load_image[30]; 00216 long hpascal,ttemp,sitemp; 00217 int hpketa[4],tpketa[3],siketa[3]; 00218 int gdot[]={128,64,32,16,8,4,2,1}; 00219 int gbit[24],gbit_s[48]; 00220 long wtime=0; 00221 long hpdata[24],hprange,hpmax,hpmin; 00222 long hpcenter; 00223 int dotdata[24],fstloop,fshuuki; 00224 double hpscope; 00225 double gctrim=0.0; 00226 int henka=0; 00227 00228 setup(); 00229 00230 wait(0.1); 00231 get_sensor1(); 00232 00233 hpascal=long(pp1); 00234 hpmin=hpascal; 00235 hpmax=hpascal; 00236 hpscope=1; 00237 hprange=0; 00238 for(i=0;i<24;i++){ 00239 hpdata[i]=hpascal-3; 00240 } 00241 00242 while(1){ 00243 00244 get_sensor1(); 00245 00246 hpascal=long(pp1); 00247 ttemp=long(t1*10); // seisuuchi henkan 00248 sitemp=long(h1); 00249 00250 hpketa[0]=int(hpascal/1000);hpascal=hpascal-hpketa[0]*1000; 00251 hpketa[1]=int(hpascal/100); hpascal=hpascal-hpketa[1]*100; 00252 hpketa[2]=int(hpascal/10); hpascal=hpascal-hpketa[2]*10; 00253 hpketa[3]=hpascal; 00254 00255 tpketa[0]=int(ttemp/100);ttemp=ttemp-tpketa[0]*100;// jyuu noketa 00256 tpketa[1]=int(ttemp/10);ttemp=ttemp-tpketa[1]*10;// ichi no keta 00257 tpketa[2]=int(ttemp); // shousuutenika no keta 00258 00259 siketa[0]=int(sitemp/100);sitemp=sitemp-siketa[0]*100; 00260 siketa[1]=int(sitemp/10);sitemp=sitemp-siketa[1]*10; 00261 siketa[2]=int(sitemp); 00262 00263 load_image[0]=moji_font[19]; //blank 00264 load_image[1]=moji_font[19]; //blank 00265 00266 if(hpdata[23] > hpdata[22]){ 00267 load_image[2]=moji_font[34];//naname ue 00268 } 00269 else if(hpdata[23] < hpdata[22]){ 00270 load_image[2]=moji_font[35];//naname sita 00271 } 00272 else{ 00273 load_image[2]=moji_font[38];//onaji 00274 } 00275 00276 for(i=3;i<=6;i++){// kiatu 4keta suuji [3 ~ 6] 00277 for(j=0;j<=9;j++){ 00278 if(hpketa[i-3] == j){ 00279 load_image[i]=moji_font[j]; 00280 } 00281 } 00282 } 00283 load_image[7]=moji_font[14];//hp 00284 load_image[8]=moji_font[19]; //blank 00285 00286 if(t1 >=0){ 00287 load_image[9]=moji_font[15];//+ 00288 } 00289 else { 00290 load_image[9]=moji_font[16];// - 00291 } 00292 00293 for(i=0;i<=1;i++){// kion seisuuketa 00294 for(j=0;j<=9;j++){ 00295 if(tpketa[i] == j){ 00296 load_image[i+10]=moji_font[j]; 00297 } 00298 } 00299 } 00300 load_image[12]=moji_font[12];// . 00301 for(j=0;j<=9;j++){// kion shousuu keta 00302 if(tpketa[2] == j){ 00303 load_image[13]=moji_font[j]; 00304 } 00305 } 00306 load_image[14]=moji_font[13]; //dc 00307 00308 load_image[15]=moji_font[19];//blank 00309 00310 for(i=0;i<=2;i++){ // situdo 3 keta 00311 for(j=0;j<=9;j++){ 00312 if(siketa[i] == j){ 00313 load_image[i+16]=moji_font[j]; 00314 } 00315 } 00316 } 00317 if(siketa[0]==0){// 0 shouryaku 00318 load_image[16]=moji_font[39];// situdo 00319 } 00320 00321 00322 load_image[19]=moji_font[20]; // % 00323 00324 load_image[20]=moji_font[19];//blank 00325 00326 // Tenki yosoku 00327 henka=0; 00328 for(m=23;m>=17;m--){ 00329 henka=henka+(hpdata[m]-hpdata[m-1]); 00330 } 00331 00332 if(henka >= 3){ 00333 //tyosou=1;//hare 00334 load_image[21]=moji_font[32];//hare 00335 load_image[22]=moji_font[23];//ha 00336 load_image[23]=moji_font[24];//re 00337 load_image[24]=moji_font[33];//ue yajirusi 00338 load_image[25]=moji_font[33];//ue yajirusi 00339 } 00340 else if(henka >= 0){ 00341 //tyosou=2;//kumori => hare 00342 load_image[21]=moji_font[30];//kumo 00343 load_image[22]=moji_font[25];//ku 00344 load_image[23]=moji_font[26];//mo 00345 load_image[24]=moji_font[27];//ri 00346 load_image[25]=moji_font[34];//naname ue 00347 } 00348 else if(henka >= -3){ 00349 //tyosou=3;// kumori => ame 00350 load_image[21]=moji_font[30];//kumo 00351 load_image[22]=moji_font[25];//ku 00352 load_image[23]=moji_font[26];//mo 00353 load_image[24]=moji_font[27];//ri 00354 load_image[25]=moji_font[35];//naname sita 00355 } 00356 else{ 00357 //tyosou=4;// ame 00358 load_image[21]=moji_font[31];//ame 00359 load_image[22]=moji_font[28];//a 00360 load_image[23]=moji_font[29];//me 00361 load_image[24]=moji_font[36];// sita 00362 load_image[25]=moji_font[36];// sita 00363 } 00364 load_image[26]=moji_font[19];//blank 00365 load_image[27]=moji_font[19];//blank 00366 load_image[28]=moji_font[19];//blank 00367 00368 for(i=0;i<29;i++){ // 0~28 29 moji 00369 moji1=load_image[i]; 00370 for(j=0;j<8;j++){// bitsum[1] 00371 bitsum[i][j]=0; 00372 }//j 00373 for(j=0;j<8;j++){ 00374 bit1gyou=moji1 & 0xff; 00375 for(k=0;k<8;k++){// kagami moji no font 00376 //for(k=8;k>=1;k--){ // futuu no font 00377 bitsum[i][k]=bitsum[i][k]+(bit1gyou & 0x01)*pow((double)2,(double)(j)); 00378 bit1gyou=bit1gyou >> 1; 00379 }//k 00380 moji1=moji1 >> 8; 00381 }//j 00382 }// i 00383 00384 k=0;// bitline henkan 00385 for(i=0;i<29;i++){ 00386 for(j=0;j<8;j++){ 00387 bitline[k]=bitsum[i][j]; 00388 k++; 00389 } 00390 } 00391 00392 for(i=0;i<=(29*8-1-23);i++){// bitline hyouji 00393 k=i; 00394 maxOne(1,1,bitline[k]); 00395 maxOne(1,2,bitline[k+1]); 00396 maxOne(1,3,bitline[k+2]); 00397 maxOne(1,4,bitline[k+3]); 00398 maxOne(1,5,bitline[k+4]); 00399 maxOne(1,6,bitline[k+5]); 00400 maxOne(1,7,bitline[k+6]); 00401 maxOne(1,8,bitline[k+7]); 00402 maxOne(2,1,bitline[k+8]); 00403 maxOne(2,2,bitline[k+9]); 00404 maxOne(2,3,bitline[k+10]); 00405 maxOne(2,4,bitline[k+11]); 00406 maxOne(2,5,bitline[k+12]); 00407 maxOne(2,6,bitline[k+13]); 00408 maxOne(2,7,bitline[k+14]); 00409 maxOne(2,8,bitline[k+15]); 00410 maxOne(3,1,bitline[k+16]); 00411 maxOne(3,2,bitline[k+17]); 00412 maxOne(3,3,bitline[k+18]); 00413 maxOne(3,4,bitline[k+19]); 00414 maxOne(3,5,bitline[k+20]); 00415 maxOne(3,6,bitline[k+21]); 00416 maxOne(3,7,bitline[k+22]); 00417 maxOne(3,8,bitline[k+23]); 00418 00419 wait(0.1); 00420 } 00421 wait(0.1); 00422 00423 hpascal=long(pp1); 00424 hpdata[23]=hpascal; 00425 for(m=1;m<24;m++){ 00426 if(hpmax <= hpdata[m]){ 00427 hpmax=hpdata[m]; 00428 } 00429 if(hpmin >= hpdata[m]){ 00430 hpmin=hpdata[m]; 00431 } 00432 }//for 00433 00434 hprange=hpmax-hpmin; 00435 hpscope=double(hprange)/8.0;//auto range 00436 if(hprange < 4){ 00437 gctrim=double(3-hprange);// auto center trim 00438 } 00439 else { 00440 gctrim=0; 00441 } 00442 for(m=1;m<24;m++){ 00443 dotdata[m]=int(double(hpdata[m]-hpmin)/hpscope)+gctrim; 00444 if(dotdata[m] < 0){ 00445 dotdata[m]=0; 00446 } 00447 if(dotdata[m] > 7){ 00448 dotdata[m]=7; 00449 } 00450 gbit[m]=gdot[dotdata[m]]; 00451 } 00452 gbit[0]=gdot[int(hpscope+0.5)];//range hyouji 00453 00454 for(i=0;i<24;i++){// graph scroll data 00455 gbit_s[i]=0; // zenhan 0 00456 } 00457 for(i=24;i<48;i++){// kouhan jitu data 00458 gbit_s[i]=gbit[i-24]; 00459 } 00460 00461 for(k=0;k<24;k++){ 00462 maxOne(1,1,gbit_s[k]);// graph scroll 00463 maxOne(1,2,gbit_s[k+1]); 00464 maxOne(1,3,gbit_s[k+2]); 00465 maxOne(1,4,gbit_s[k+3]); 00466 maxOne(1,5,gbit_s[k+4]); 00467 maxOne(1,6,gbit_s[k+5]); 00468 maxOne(1,7,gbit_s[k+6]); 00469 maxOne(1,8,gbit_s[k+7]); 00470 maxOne(2,1,gbit_s[k+8]); 00471 maxOne(2,2,gbit_s[k+9]); 00472 maxOne(2,3,gbit_s[k+10]); 00473 maxOne(2,4,gbit_s[k+11]); 00474 maxOne(2,5,gbit_s[k+12]); 00475 maxOne(2,6,gbit_s[k+13]); 00476 maxOne(2,7,gbit_s[k+14]); 00477 maxOne(2,8,gbit_s[k+15]); 00478 maxOne(3,1,gbit_s[k+16]); 00479 maxOne(3,2,gbit_s[k+17]); 00480 maxOne(3,3,gbit_s[k+18]); 00481 maxOne(3,4,gbit_s[k+19]); 00482 maxOne(3,5,gbit_s[k+20]); 00483 maxOne(3,6,gbit_s[k+21]); 00484 maxOne(3,7,gbit_s[k+22]); 00485 maxOne(3,8,gbit_s[k+23]); 00486 wait(0.1); 00487 } 00488 00489 k=0; 00490 maxOne(1,1,gbit[k]);// kiatu graph hyouji 00491 maxOne(1,2,gbit[k+1]); 00492 maxOne(1,3,gbit[k+2]); 00493 maxOne(1,4,gbit[k+3]); 00494 maxOne(1,5,gbit[k+4]); 00495 maxOne(1,6,gbit[k+5]); 00496 maxOne(1,7,gbit[k+6]); 00497 maxOne(1,8,gbit[k+7]); 00498 maxOne(2,1,gbit[k+8]); 00499 maxOne(2,2,gbit[k+9]); 00500 maxOne(2,3,gbit[k+10]); 00501 maxOne(2,4,gbit[k+11]); 00502 maxOne(2,5,gbit[k+12]); 00503 maxOne(2,6,gbit[k+13]); 00504 maxOne(2,7,gbit[k+14]); 00505 maxOne(2,8,gbit[k+15]); 00506 maxOne(3,1,gbit[k+16]); 00507 maxOne(3,2,gbit[k+17]); 00508 maxOne(3,3,gbit[k+18]); 00509 maxOne(3,4,gbit[k+19]); 00510 maxOne(3,5,gbit[k+20]); 00511 maxOne(3,6,gbit[k+21]); 00512 maxOne(3,7,gbit[k+22]); 00513 maxOne(3,8,gbit[k+23]); 00514 00515 for(i=0;i<4;i++){ 00516 wait(0.5); 00517 maxOne(3,8,0); 00518 maxOne(1,1,0); 00519 wait(0.5); 00520 maxOne(1,1,gbit[k]); 00521 maxOne(3,8,gbit[k+23]); 00522 } 00523 00524 fshuuki=130;// kousin jikan 00525 wtime++; 00526 if(wtime == fshuuki){ 00527 for(m=1;m<=22;m++){ 00528 hpdata[m]=hpdata[m+1]; 00529 } 00530 wtime=0; 00531 } 00532 00533 }//while 00534 }//main 00535 00536
Generated on Wed Jul 27 2022 02:59:47 by 1.7.2