LEDマトリックス2枚 BME280付き

Dependencies:   mbed

main.cpp

Committer:
takeuchi
Date:
2016-06-03
Revision:
0:cfba9bf82ab5

File content as of revision 0:cfba9bf82ab5:

// LedMatrix  2mai Ondo,Situdo,Kiatu

#include "mbed.h"
#include "BME280.h"
 
DigitalOut led(dp28);

BME280 sensor1(dp5,dp27,0x76 << 1);

// spi(mosi,miso,sck)
SPI max72_spi(dp2, NC, dp6);
DigitalOut load(dp14);//spi load

// CPU       MT7219
// dp1 mosi(Master In Salve Out) =>   DIN
// dp2 miso(Master OutSlave)   =>   nc
// dp6 sck (Serial Clock) =>   clk
// dp14 =>(Slave Select) load

int maxInUse = 2;    //change this variable to set how many MAX7219's you'll use
 
// define max7219 registers
#define max7219_reg_noop         0x00
#define max7219_reg_digit0       0x01
#define max7219_reg_digit1       0x02
#define max7219_reg_digit2       0x03
#define max7219_reg_digit3       0x04
#define max7219_reg_digit4       0x05
#define max7219_reg_digit5       0x06
#define max7219_reg_digit6       0x07
#define max7219_reg_digit7       0x08
#define max7219_reg_decodeMode   0x09
#define max7219_reg_intensity    0x0a
#define max7219_reg_scanLimit    0x0b
#define max7219_reg_shutdown     0x0c
#define max7219_reg_displayTest  0x0f
 
#define LOW 0
#define HIGH 1
#define MHZ 1000000
#define ON 1
#define OFF 0

double p1,t1,h1,pp1;
double hight,hosei;
 
void maxSingle( int reg, int col) {
//maxSingle is the "easy"  function to use for a
//single max7219
    load = LOW;            // begin
    max72_spi.write(reg);  // specify register
    max72_spi.write(col);  // put data
    load = HIGH;           // make sure data is loaded (on rising edge of LOAD/CS)
}
 
void maxAll (int reg, int col) {    // initialize  all  MAX7219's in the system
    load = LOW;                    // begin
    for ( int c=1; c<= maxInUse; c++) {
        max72_spi.write(reg);  // specify register
        max72_spi.write(col);  // put data
    }
    load = HIGH;
}
 
void maxOne(int maxNr, int reg, int col) {
//maxOne is for adressing different MAX7219's,
//while having a couple of them cascaded
    int c = 0;
    load = LOW;
 
    for ( c = maxInUse; c >= maxNr; c--) {
        max72_spi.write(0);  // no-op
        max72_spi.write(0);  // no-op
    }
 
    max72_spi.write(reg);  // specify register
    max72_spi.write(col);  // put data
 
    for ( c=maxNr-1; c >= 1; c--) {
        max72_spi.write(0);  // no-op
        max72_spi.write(0);  // no-op
    }
    load = HIGH;
}
  
void setup () {
    // initiation of the max 7219
    // SPI setup: 8 bits, mode 0
    max72_spi.format(8, 0);
    
    // going by the datasheet, min clk is 100ns so theoretically 10MHz should work...
    // max72_spi.frequency(10*MHZ);
    
    maxAll(max7219_reg_scanLimit, 0x07);
    maxAll(max7219_reg_decodeMode, 0x00);  // using an led matrix (not digits)
    maxAll(max7219_reg_shutdown, 0x01);    // not in shutdown mode
    maxAll(max7219_reg_displayTest, 0x00); // no display test
    for (int e=1; e<=8; e++) {    // empty registers, turn all LEDs off
        maxAll(e,0);
    }
    maxAll(max7219_reg_intensity, 0x0f & 0x0f);    // the first 0x0f is the value you can set
    // range: 0x00 to 0x0f
} 
 
void get_sensor1(void){
    t1=sensor1.getTemperature();
    if(t1 > 85.0){
         t1=t1-409.0-1;
    }
    h1=sensor1.getHumidity();
    pp1=sensor1.getPressure(); 
    pp1=pp1+int(700/9);
} 
 
int main(void) {

 const uint64_t moji_font[] = {// bold font , kagami moji font
    0x3c66666e76663c00,//0~9
    0x7e1818181c181800,
    0x7e060c3060663c00,
    0x3c66603860663c00,
    0x30307e3234383000,
    0x3c6660603e067e00,
    0x3c66663e06663c00,
    0x1818183030667e00,
    0x3c66663c66663c00,
    0x3c66607c66663c00,
    0x6666663e06060600,// 10 h
    0x06063e66663e0000,// 11 p
    0x1818000000000000,// 12 .
    0x30480848340a0a04, // 13 dc
    0x1010157555770101,// 14 hp
    0x18187e7e18180000,// 15 +
    0x00007e7e00000000,// 16 -
    0x082a1c771c2a0800, //17 asuta1
    0x007e424a52427e00, // 18 sikaku2
    0x0000000000000000, // 19 blank
    0x60660c1830660600, // 20 %
    0x4242665a5a7e1800, // 21 uchi
    0x220424692e2a2c00  // 22 soto
    };
    
/*
    
 const uint64_t moji_font[]={   
  0x006e333e301e0000,//a
  0x003b66663e060607,//b
  0x001e3303331e0000,//c
  0x006e33333e303038,//d
  0x001e033f331e0000,//e
  0x000f06060f06361c,//f
  0x1f303e33336e0000,//g
  0x006766666e360607,//h
  0x001e0c0c0c0e000c,//i
  0x1e33333030300030,//j
  0x0067361e36660607,//k
  0x001e0c0c0c0c0c0e,//l
  0x00636b7f7f330000,//m
  0x00333333331f0000,//n
  0x001e3333331e0000,//o
  0x0f063e66663b0000,//p
  0x78303e33336e0000,//q
  0x000f06666e3b0000,//r
  0x001f301e033e0000,//s
  0x00182c0c0c3e0c08,//t
  0x006e333333330000,//u
  0x000c1e3333330000,//v
  0x00367f7f6b630000,//w
  0x0063361c36630000,//x
  0x1f303e3333330000,//y
  0x003f260c193f0000 //z
 };

*/

//    // Jissainiha konoyouni mieru
//     maxSingle(1,1);                        |-| -------+
//     maxSingle(2,2);                        |-| ------+-
//     maxSingle(3,4);                        |-| -----+--
//     maxSingle(4,8);                        |-| ----+---
//     maxSingle(5,16);                       |-| ---+----
//     maxSingle(6,32);                       |-| --+-----
//     maxSingle(7,64);                       |-| -+------
//     maxSingle(8,128);                      |-| +-------
  
    int i,j,k;
    uint8_t bitsum[22][9],bit1gyou,bitline[250];
    uint64_t moji1,load_image[22];
    long hpascal,ttemp,sitemp;
    int hpketa[4],tpketa[3],siketa[3];
    int gdot[]={128,64,32,16,8,4,2,1};
    int gbit[16],gbit_s[32];
    long wtime=0;
    long hpdata[16],hprange,hpmax,hpmin;
    long hpcenter;
    int dotdata,fstloop,fshuuki;
    double hpscope;
    double gctrim=0.0;
 
    setup();
    
    wait(0.1);
    get_sensor1();
    
    hpascal=long(pp1);
    hpmin=hpascal;
    hpmax=hpascal;
    hpscope=1;
    hprange=0;
    for(i=0;i<16;i++){
        hpdata[i]=hpascal-3;
    }
    
    while(1){
       
      get_sensor1();
          
      hpascal=long(pp1);
      ttemp=long(t1*10); // seisuuchi henkan
      sitemp=long(h1);
 
      hpketa[0]=int(hpascal/1000);hpascal=hpascal-hpketa[0]*1000;
      hpketa[1]=int(hpascal/100); hpascal=hpascal-hpketa[1]*100;
      hpketa[2]=int(hpascal/10);  hpascal=hpascal-hpketa[2]*10;
      hpketa[3]=hpascal;
      
      tpketa[0]=int(ttemp/100);ttemp=ttemp-tpketa[0]*100;// jyuu noketa
      tpketa[1]=int(ttemp/10);ttemp=ttemp-tpketa[1]*10;// ichi no keta
      tpketa[2]=int(ttemp); // shousuutenika no keta
      
      siketa[0]=int(sitemp/100);sitemp=sitemp-siketa[0]*100;
      siketa[1]=int(sitemp/10);sitemp=sitemp-siketa[1]*10;
      siketa[2]=int(sitemp);
      
      load_image[0]=moji_font[19]; //blank        
      load_image[1]=moji_font[19]; //blank        
      load_image[2]=moji_font[17]; //asuta       
      for(i=3;i<=6;i++){// kiatu 4keta suuji [3 ~ 6]
            for(j=0;j<=9;j++){
                if(hpketa[i-3] == j){
                    load_image[i]=moji_font[j];
                }
            }
      }
      load_image[7]=moji_font[14];//hp
      load_image[8]=moji_font[19]; //blank       
      
      if(t1 >=0){
          load_image[9]=moji_font[15];//+
      }
      else {
          load_image[9]=moji_font[16];// -
      }                

      for(i=0;i<=1;i++){// kion seisuuketa
          for(j=0;j<=9;j++){
              if(tpketa[i] == j){
                  load_image[i+10]=moji_font[j];
              }
          }
      }
      load_image[12]=moji_font[12];// .
      for(j=0;j<=9;j++){// kion shousuu keta
              if(tpketa[2] == j){
                  load_image[13]=moji_font[j];
              }
      }
      load_image[14]=moji_font[13]; //dc 

      load_image[15]=moji_font[19];//blank
      
       for(i=0;i<=2;i++){ // situdo 3 keta
            for(j=0;j<=9;j++){
                if(siketa[i] == j){
                    load_image[i+16]=moji_font[j];
                }
            }
       }     
      
       load_image[19]=moji_font[20]; // %
       load_image[20]=moji_font[19];//blank
       load_image[21]=moji_font[19];//blank
       
       for(i=0;i<22;i++){ // 0~21 22 moji
            moji1=load_image[i];
            for(j=0;j<8;j++){// bitsum[1]
                bitsum[i][j]=0;
            }//j
            for(j=0;j<8;j++){
                bit1gyou=moji1 & 0xff;
                for(k=0;k<8;k++){//  kagami moji no font
                //for(k=8;k>=1;k--){ // futuu no font
                    bitsum[i][k]=bitsum[i][k]+(bit1gyou & 0x01)*pow((double)2,(double)(j));
                    bit1gyou=bit1gyou >> 1;
                }//k
                moji1=moji1 >> 8;
            }//j
        }// i
        
        k=0;
        for(i=0;i<22;i++){
            for(j=0;j<8;j++){
                bitline[k]=bitsum[i][j];
                k++;
            }
        }
        
        for(i=0;i<=(22*8-1-16);i++){// bitline hyouji
            maxOne(1,1,bitline[i]);
            maxOne(1,2,bitline[i+1]);
            maxOne(1,3,bitline[i+2]);
            maxOne(1,4,bitline[i+3]);
            maxOne(1,5,bitline[i+4]);
            maxOne(1,6,bitline[i+5]);
            maxOne(1,7,bitline[i+6]);
            maxOne(1,8,bitline[i+7]);
            maxOne(2,1,bitline[i+8]);
            maxOne(2,2,bitline[i+9]);
            maxOne(2,3,bitline[i+10]);
            maxOne(2,4,bitline[i+11]);
            maxOne(2,5,bitline[i+12]);
            maxOne(2,6,bitline[i+13]);
            maxOne(2,7,bitline[i+14]);
            maxOne(2,8,bitline[i+15]);

            wait(0.1);
        }                               
        wait(0.1);
                           
    }//while
}//main