/* -------------------------------------------------------------------------------- WaveManV7 (with MAX7219) 2011.3.13 By N.Egawa -------------------------------------------------------------------------------- */ #include #include // Arduino pin2 - MAX7219 din, pin3 - load, pin4 - clk Matrix myMatrix = Matrix(2, 4, 3); int SP_Pin = 5 ; //DigitalOUT5 圧電ブザー int Melody_Pin = 6 ; //DigitalOUT6 メロディーIC int LED_Pin = 7 ; //DigitalOUT7 LED int Tw_Pin =1 ; //analogIN1 int V_Pin = 2 ; //AnalogIN2 int BT_Pin = 3 ; //AnalogIN3 int CdS_Pin = 4 ; //AnalogIN4 int LM35DZ_Pin = 5 ; //AnalogIN5 int val ; int i,j,k; int menuF = 0; int mmm; int mmmbak = 0; int Tme; //分単位でのプログラム開始時からのアラーム時刻 int Tdval,Twval; //乾球温度,湿球温度 running(I)中で取込・平均化 int Hr; //相対湿度(relativ humidity) int BEEP = 1000; //1000Hz boolean soundON = false; int SCdemo = 0; //0:Wave&OSC 1:demoWave 2:demoOSC const int freq[8] = { 262*2, //ド 294*2, //レ 330*2, //ミ 349*2, //ファ 392*2, //ソ 440*2, //ラ 494*2, //シ 523*2 //ド }; Sprite SP_Runner[3] = { //Runner-------------------- Sprite( 8, 8, B00000000, B00001000, // runner 0 B00001000, B00010000, B00010000, B00010000, B00101000, B00010000 ), Sprite( 8, 8, B00000000, B00001000, // runner 1 B00001000, B00110010, B01011100, B00010000, B00101000, B00000100 ), Sprite( 8, 8, B00000000, B00001000, // runner 2 B00001000, B00110000, B00011000, B00010000, B00101000, B01001000 ) }; //----------------------------------------- Sprite SP_line[2] = { Sprite(1,8,B1,B1,B1,B1,B1,B1,B1,B1), // | Sprite(8,1,B11111111) //- }; Sprite SP_wave[4] = { //波-------------------- Sprite( 8, 8, B00000000, B00000000, B00000000, B01000000, B11111111, B00000000, B00000000, B00000000 ), Sprite( 8, 8, B00000000, B00000000, B00000000, B00111100, B11000011, B00000000, B00000000, B00000000 ), Sprite( 8, 8, B00000000, B00000000, B00011000, B00100100, B01000010, B10000001, B00000000, B00000000 ), Sprite( 8, 8, B00111000, B01000100, B01000100, B01000100, B01000100, B01000100, B01000100, B10000011 ) }; //---------------------------------------------------- Sprite SP_num[10] = { //数字 ---------------------------- Sprite( 4,5, B0111, //0 B0101, B0101, B0101, B0111 ), Sprite( 4,5, B0001, //1 B0001, B0001, B0001, B0001 ), Sprite( 4,5, B0111, //2 B0001, B0111, B0100, B0111 ), Sprite( 4,5, B0111, //3 B0001, B0111, B0001, B0111 ), Sprite( 4,5, B0101, //4 B0101, B0111, B0001, B0001 ), Sprite( 4,5, B0111, //5 B0100, B0111, B0001, B0111 ), Sprite( 4,5, B0111, //6 B0100, B0111, B0101, B0111 ), Sprite( 4,5, B0111, //7 B0101, B0001, B0001, B0001 ), Sprite( 4,5, B0111, //8 B0101, B0111, B0101, B0111 ), Sprite( 4,5, B0111, //9 B0101, B0111, B0001, B0111 ) }; //---------------------------------------------- Sprite SP_ON = Sprite( //○ 8,8, B00000000, B00111100, B01000010, B01000010, B01000010, B01000010, B00111100, B00000000 ); Sprite SP_OFF = Sprite( //× 8,8, B00000000, B01000010, B00100100, B00011000, B00011000, B00100100, B01000010, B00000000 ); Sprite SP_LIGHT = Sprite( //光 8,8, B00000000, B00000001, B00010011, B00110110, B01111100, B11011000, B10010000, B00000000 ); Sprite SP_SOUND = Sprite( //音 8,8, B00000110, B00001000, B01110000, B01010000, B01010000, B01110000, B00001000, B00000110 ); Sprite SP_T = Sprite( //△ 8,8, B00000000, B00000000, B00001000, B00010100, B00100010, B01111111, B00000000, B00000000 ); Sprite SP_V = Sprite( //V 8,8, B00100010, B00100010, B00100010, B00100010, B00010100, B00001000, B00000000, B00111110 ); Sprite SP_A = Sprite( //A 8,8, B00001000, B00010100, B00100010, B00100010, B00111110, B00100010, B00000000, B00111110 ); Sprite SP_BT = Sprite( //BT 8,8, B00000000, B01100111, B01010010, B01010010, B01100010, B01010010, B01010010, B01100010 ); Sprite SP_TT = Sprite( //TT 8,8, B00000000, B01110111, B00100010, B00100010, B00100010, B00100010, B00100010, B00100010 ); Sprite SP_TS = Sprite( //TS 8,8, B00000000, B01110111, B00100101, B00100100, B00100111, B00100001, B00100101, B00100111 ); Sprite SP_RH = Sprite( //RH 8,8, B00000000, B01100101, B01010101, B01010101, B01100111, B01010101, B01010101, B01010101 ); Sprite SP_ONPU = Sprite( //音符 8,8, B00000000, B00001110, B00111010, B00100010, B00100110, B01100110, B01100000, B00000000 ); Sprite SP_KAO1 = Sprite( //顔1 8,8, B00000000, B00000000, B00100100, B00000000, B00000000, B01000010, B00111100, B00000000 ); Sprite SP_KAO2 = Sprite( //顔2 8,8, B00000000, B00100100, B01011010, B00000000, B00111100, B00000000, B00000000, B00000000 ); Sprite SP_HITO1 = Sprite( //人下 8,8, B00000000, B00011000, B01011010, B01111110, B00011000, B00111100, B00100100, B01100110 ); Sprite SP_HITO2 = Sprite( //人上 8,8, B01011010, B01011010, B00111100, B00011000, B00111100, B00100100, B01100110, B00000000 ); Sprite SP_OS = Sprite( //OscilloScope 8,8, B00000000, B00000000, B01100000, B10010000, B00001001, B00000110, B00000000, B00000000 ); //--------------------------------------------------------------- void setup(){ //================================================ int x,y; Tme=(int)(millis()/60000)+8*60; //アラームのシステム時間(分),初期設定8時間後 for(i=2;i<=7;i++){ pinMode(i,OUTPUT); } myMatrix.clear(); for(i=0;i<=7;i++){ tone(SP_Pin,freq[i],50); delay(100);} //ドレミファソラシド delay(100); for(i=7;i>=0;i--){ tone(SP_Pin,freq[i],50); delay(100);} //ドシラソファミレド delay(500); for(j=0;j<=1;j++){ // line | and - 移動デモ for(i=0;i<=7;i++){ if(j==0){ x = i; y = 0;} else { x = 0; y = i;} myMatrix.write(x, y, SP_line[j]); // | or - tone(SP_Pin,freq[0],50);delay(75); myMatrix.clear(); } } delay(500); Running(1); } //===== setup end ================================================ boolean demo = true; void loop(){ //====================================================== switch(SCdemo){ case 0: if(demo == true){demoWave(); demo=false;} else {demoOSC(5); demo=true;} break; case 1: demoWave(); break; case 2: demoOSC(5); break; } Running(1); Menu(); Running(1); } //====== loop end ===================================================== void TTDisp(){ //======================================================== if(soundON == true){ for(i=0;i<=7;i++){ tone(SP_Pin,freq[i],50); delay(80); } //ドレミファソラシド }else{ tone(SP_Pin,BEEP,50); } //1回ピッと鳴らす Running(1); HitoJump(2); TimeDisp(); Running(1); KaoJump(2); TempDisp(1); TempDisp(2); RH_keisan(); RH_Disp(); DI_Disp(); } void TimeDisp(){ //時間表示======================================================== int hh,mm,mm10,mm01,hh1,hh8N; int x,y,t,Tm; hh = mmm/60; mm = mmm - hh*60 ; mm10 = mm/10 ; //mmの10の位 mm01 = mm - mm10*10; //mmの1の位 hh8N = hh/8 ; hh1 = hh - hh8N*8; if(hh8N > 3){ hh8N = 3;} //hh8=0,1,2,3のみ考える(8X3=24hまで) //分・時間表示 ---------- myMatrix.write(0, 3, SP_num[mm10]); myMatrix.write(4, 3, SP_num[mm01]); //分表示 for(i=0;i= 1){ for(i=0;i<=7;i++){myMatrix.write(i,0,HIGH); } } if(hh8N >= 2){ for(i=0;i<=7;i++){myMatrix.write(i,1,HIGH); } } if(hh8N == 3){ for(i=0;i<=7;i++){myMatrix.write(i,2,HIGH); } } if(hh8N > 0){ if(hh1 == 0 && mm == 0){ Melody_IC(); } } DelayLED(30); myMatrix.clear(); //アラームまでの残り時間表示 --------- Tm=(Tme-mmm)/10; if(Tm <= 0){ //残り10分以内:点滅&BEEP音,過ぎた場合:何もしない for(t=0;t 500){ return; } //何もしないでreturn myMatrix.write(0, 0, SP_TT); delay(1500); //時間・温度・湿度 標示 val=analogRead(CdS_Pin); if(val > 500){ tone(SP_Pin,BEEP,50); TTDisp() ; return; } myMatrix.write(0, 0, SP_TS); delay(1500); //アラーム時刻セット val=analogRead(CdS_Pin); if(val > 500){ tone(SP_Pin,BEEP,50); Set_Tme() ; return; } myMatrix.write(0, 0, SP_RH); delay(1500); //湿度計 val=analogRead(CdS_Pin); if(val > 500){ tone(SP_Pin,BEEP,50); Hygrometer() ; return; } myMatrix.write(0, 0, SP_ON); delay(1500); //音ON val=analogRead(CdS_Pin); if(val > 500){ tone(SP_Pin,BEEP,50); soundON = true; return; } myMatrix.clear(); myMatrix.write(0, 0, SP_OFF); delay(1500); //音OFF val=analogRead(CdS_Pin); if(val > 500){ tone(SP_Pin,BEEP,50); soundON = false; return; } myMatrix.clear(); myMatrix.write(0, 0, SP_LIGHT); delay(1500); //光センサーデモ val=analogRead(CdS_Pin); if(val > 500){ tone(SP_Pin,BEEP,50); SCdemo = 1; return; } myMatrix.clear(); myMatrix.write(0, 0, SP_SOUND); delay(1500); //音センサーデモ val=analogRead(CdS_Pin); if(val > 500){ tone(SP_Pin,BEEP,50); SCdemo = 2; return; } myMatrix.clear(); myMatrix.write(0, 0, SP_V); delay(1500); //電圧計 val=analogRead(CdS_Pin); if(val > 500){ tone(SP_Pin,BEEP,50); ADC_DISP(1); return ; } myMatrix.clear(); myMatrix.write(0, 0, SP_A); delay(1500); //電流計 val=analogRead(CdS_Pin); if(val > 500){ tone(SP_Pin,BEEP,50); ADC_DISP(2); return ; } myMatrix.clear(); myMatrix.write(0, 0, SP_OS); delay(1500); //Oscillo Scope val=analogRead(CdS_Pin); if(val > 500){ tone(SP_Pin,BEEP,50); OSC(5); return ; } myMatrix.clear(); myMatrix.write(0, 0, SP_BT); delay(1500); //バッテリーチェッカー val=analogRead(CdS_Pin); if(val > 500){ tone(SP_Pin,BEEP,50); ADC_DISP(3); return ; } myMatrix.clear(); myMatrix.write(0, 0, SP_ONPU); delay(1500); //メロディIC val=analogRead(CdS_Pin); if(val > 500){ tone(SP_Pin,BEEP,50); Melody_IC(); return ; } myMatrix.clear(); } void ADC_DISP(int menuADC){ //電圧計:電流計:バッテリーチェッカー(0.0~5.0表示)========= // menuADC 1:電圧計,2:電流計,3:バッテリーチェッカー boolean flgADC = true; int Vdata,Vdata01,Vdata10; while(flgADC == true){ //------------------------------------- switch(menuADC){ case 1: val=analogRead(V_Pin); break; //電圧読込 val=0~1023 case 2: val=analogRead(BT_Pin); break; case 3: val=analogRead(BT_Pin); break; } Vdata = map(val,0,1023,0,50); //電圧Vdataを0~50で表現 Vdata10 = Vdata/10; //Vdataの10の位 Vdata01 = Vdata-Vdata10*10; //Vdataの1の位 myMatrix.clear(); myMatrix.write(0, 1, SP_num[Vdata10]); myMatrix.write(4, 1, SP_num[Vdata01]); if( menuADC == 1 || menuADC == 3){ myMatrix.write(4,7,HIGH); } //電圧 小数点 if( menuADC == 2){ myMatrix.write(0,7,HIGH); } //電流 小数点 delay(1000); if(menuADC == 3 ){ myMatrix.write(0, 0, SP_T); } //△ if(menuADC == 3 && Vdata >= 12){ myMatrix.write(0, 0, SP_ON); } //○ if(menuADC == 3 && Vdata <= 10){ myMatrix.write(0, 0, SP_OFF); } //× if(menuADC == 3 ){ delay(1000);} val = analogRead(CdS_Pin); //Val=0~1023 if (val < 500 ) { flgADC = false; } //====return } // while(flgADC == true) end ------------------------------------ } void Melody_IC(){ //===メロディーIC演奏========================== for(i=0;i<=7;i++){ tone(SP_Pin,freq[i],50); delay(80);} //ドレミファソラシド delay(100); for(i=7;i>=0;i--){ tone(SP_Pin,freq[i],50); delay(80);} //ドシラソファミレド delay(100); digitalWrite(Melody_Pin,HIGH); delay(29000); //1曲29秒 digitalWrite(Melody_Pin,LOW); } void OSC(int t){ //===OscilloScope======================================== boolean flgOSC = true; int data[8]; while(flgOSC == true){ //------------------------------------- for(i=0;i<8;i++){ data[i]=analogRead(V_Pin); delay(t); } //データ取込 for(i=0;i<8;i++){ data[i]=map( data[i],0,1023,0,7); } //電圧data[i]を0~7で表現 myMatrix.clear(); for(i=0;i<=7;i++){ myMatrix.write(i, 7-data[i], HIGH);} //表示 delay(50); val = analogRead(CdS_Pin); //Val=0~1023 if (val < 500 ) { flgOSC = false; } //return } // while(flgOSC == true) end ------------------------------------ } void demoOSC(int t){ //==================================================== boolean flgOSC = true; int data[8]; while(flgOSC == true){ //------------------------------------- for(i=0;i<8;i++){ data[i]=analogRead(V_Pin); delay(t); } //データ取込 for(i=0;i<8;i++){ data[i]=map( data[i],0,1023,0,7); } //電圧data[i]を0~7で表現 myMatrix.clear(); for(i=0;i<=7;i++){ myMatrix.write(i, 7-data[i], HIGH);} //表示 delay(50); mmm = (int)( millis()/60000 ); if (mmm != mmmbak){ mmmbak = mmm ; TTDisp(); if(SCdemo == 0){ flgOSC = false; } //1minでreturn } val = analogRead(CdS_Pin); if (val < 500 ) { flgOSC = false; SCdemo =0 ;} //return } // while(flgOSC == true) end ------------------------------------ } void demoWave(){ //======================================================== boolean flgWave = true; int x=0; while(flgWave == true){ //----- val=analogRead(CdS_Pin); if(val > 900){ i = 3; } else if(val > 800){ i = 2; } else if(val > 500){ i = 1; } else { i = 0; menuF++ ; } myMatrix.write(x, 0, SP_wave[i]); myMatrix.write(x - 8, 0, SP_wave[i]); delay(75); if(x == 8){ x = 0; val=analogRead(CdS_Pin); //1回スクロール毎に確認 if(val > 500){ menuF = 0; } } x++; if(menuF == 16){ menuF = 0; flgWave = false; SCdemo = 0; } //暗2回スクロールでreturn mmm = (int)( millis()/60000 ); if (mmm != mmmbak){ mmmbak = mmm ; TTDisp(); if(SCdemo == 0){ flgWave = false; } //1minでreturn } } //while end } void Running(int l){ //=================================================== int xx; myMatrix.clear(); for(j=0;j80){myMatrix.write(0,0,SP_OFF);} //× else if(Di>75){myMatrix.write(0,0,SP_T);} //△ else if(Di>65){myMatrix.write(0,0,SP_ON);} //○ else if(Di>60){myMatrix.write(0,0,SP_T);} //△ else {myMatrix.write(0,0,SP_OFF);} //× DelayLED(30); myMatrix.clear(); } void DelayLED(int d){ //時間待 LED点滅 ============================================= int e; for(e=0;e 500){tone(SP_Pin,BEEP,50); break;} x=x+1;if(x==6){x=0;y=y+1;} //60min if(y==8){tone(SP_Pin,BEEP,50); break;} //8h } Tme=(int)(millis()/60000)+10*(t+1); }