LEDマトリックスユニット 3枚 気圧グラフ表示搭載

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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