qweqwe

Dependencies:   Si5351A NeoPixel

Committer:
fezine
Date:
Wed Jun 16 17:12:18 2021 +0000
Revision:
3:05c2c10b6bb3
Parent:
2:2c78f22e6081
as

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tichise 0:124662fe9af9 1 #include "mbed.h"
tichise 0:124662fe9af9 2 #include "neopixel.h"
fezine 1:34ec04b8a8dd 3 #include "si5351a.h"
fezine 1:34ec04b8a8dd 4
fezine 3:05c2c10b6bb3 5 I2C i2c(D0, D1); //通信Si5351A
fezine 3:05c2c10b6bb3 6 SI5351A clk(i2c, 25000000UL); //基础时钟25MHz
fezine 3:05c2c10b6bb3 7 Pixel Column[20]; //单个数组
fezine 3:05c2c10b6bb3 8 Pixel Column_All[280]; //全局数组
fezine 3:05c2c10b6bb3 9 NeoPixelOut neoPixel(D9); //数据输出
fezine 3:05c2c10b6bb3 10 Timeout PeakDecrease;
fezine 1:34ec04b8a8dd 11
fezine 3:05c2c10b6bb3 12 DigitalOut reset=D4; //重置MSGEQ7
fezine 3:05c2c10b6bb3 13 DigitalOut strobe=D3; //选择MSGEQ7输出
fezine 3:05c2c10b6bb3 14 AnalogIn analog1_7=A0; //数据读取1-7
fezine 3:05c2c10b6bb3 15 AnalogIn analog8_14=A1; //数据读取8-14
fezine 3:05c2c10b6bb3 16 //AnalogIn mod=A2; //选择模式输入
fezine 3:05c2c10b6bb3 17 AnalogIn sensitive=A5;
fezine 3:05c2c10b6bb3 18 AnalogIn brightness=A6;
fezine 1:34ec04b8a8dd 19
tichise 0:124662fe9af9 20
fezine 3:05c2c10b6bb3 21 int NumColumn=14; //灯柱数量
fezine 3:05c2c10b6bb3 22 int Peak[14]={0};
fezine 3:05c2c10b6bb3 23 int PeakDecreaseTime_us=50*1e3; //peak下降延迟时间
fezine 3:05c2c10b6bb3 24 int colorPeak; //peak颜色
fezine 3:05c2c10b6bb3 25 int __mode;
fezine 3:05c2c10b6bb3 26 float freqData[14];
fezine 3:05c2c10b6bb3 27 float noise=0.1;
tichise 0:124662fe9af9 28
fezine 3:05c2c10b6bb3 29 float mode=0.1;
fezine 3:05c2c10b6bb3 30 int num=0;
fezine 3:05c2c10b6bb3 31
fezine 3:05c2c10b6bb3 32
fezine 3:05c2c10b6bb3 33 //-------------------------------设置Peak降落的互钳函数
fezine 1:34ec04b8a8dd 34 void toggleOff(void);
fezine 1:34ec04b8a8dd 35 void toggleOn(void){
fezine 1:34ec04b8a8dd 36 for(int i=0;i<NumColumn;i++){
fezine 1:34ec04b8a8dd 37 if(Peak[i]>-2) Peak[i]--;
fezine 1:34ec04b8a8dd 38 }
fezine 3:05c2c10b6bb3 39 num++;
fezine 3:05c2c10b6bb3 40 if(num==200){
fezine 3:05c2c10b6bb3 41 if(mode<=0.5) mode=mode+0.1;
fezine 3:05c2c10b6bb3 42 else mode=0.1;
fezine 3:05c2c10b6bb3 43 num=0;
fezine 3:05c2c10b6bb3 44 }
fezine 1:34ec04b8a8dd 45 PeakDecrease.attach_us(toggleOff,PeakDecreaseTime_us);
fezine 1:34ec04b8a8dd 46 }
fezine 1:34ec04b8a8dd 47 void toggleOff(void){
fezine 1:34ec04b8a8dd 48 for(int i=0;i<NumColumn;i++){
fezine 1:34ec04b8a8dd 49 if(Peak[i]>-2) Peak[i]--;
fezine 1:34ec04b8a8dd 50 }
fezine 1:34ec04b8a8dd 51 PeakDecrease.attach_us(toggleOn,PeakDecreaseTime_us);
fezine 1:34ec04b8a8dd 52 }
fezine 1:34ec04b8a8dd 53 //-----------------------------------------取最大值函数
fezine 1:34ec04b8a8dd 54 int max(int i,int j){
fezine 1:34ec04b8a8dd 55 if(i>j)return i;
fezine 1:34ec04b8a8dd 56 else return j;
fezine 1:34ec04b8a8dd 57 }
fezine 3:05c2c10b6bb3 58 //---------------------------------------------读取MSGEQ7的返回值
fezine 1:34ec04b8a8dd 59 void Read() {
fezine 1:34ec04b8a8dd 60 reset = 1;
fezine 3:05c2c10b6bb3 61 //wait_ns(150); //最小值100ns
fezine 1:34ec04b8a8dd 62 reset = 0;
fezine 3:05c2c10b6bb3 63 wait_us(200);
fezine 1:34ec04b8a8dd 64 for (int i = 0; i < 7; i++){
fezine 1:34ec04b8a8dd 65 strobe = 0;
fezine 3:05c2c10b6bb3 66 wait_us(50); //待输出稳定
fezine 3:05c2c10b6bb3 67 freqData[i*2]=analog1_7*(0.5+2*sensitive);
fezine 3:05c2c10b6bb3 68 freqData[i*2+1]=analog8_14*(0.5+2*sensitive);
fezine 1:34ec04b8a8dd 69 strobe = 1;
fezine 3:05c2c10b6bb3 70 wait_us(40); //strobe最小间隔72us,此处取90us
fezine 3:05c2c10b6bb3 71 }
fezine 3:05c2c10b6bb3 72 }
fezine 3:05c2c10b6bb3 73 //-------------------------------------------初始颜色
fezine 3:05c2c10b6bb3 74 int colorBegin(){
fezine 3:05c2c10b6bb3 75 int __mode=(int)(mode*10); //__mode范围为1,2,3,4,5,6,7,8,9
fezine 3:05c2c10b6bb3 76 switch(__mode){
fezine 3:05c2c10b6bb3 77 case 1:
fezine 3:05c2c10b6bb3 78 colorPeak=0xFF0000;
fezine 3:05c2c10b6bb3 79 return 0x00FF00;//
fezine 3:05c2c10b6bb3 80 case 2:
fezine 3:05c2c10b6bb3 81 colorPeak=0xFF0000;
fezine 3:05c2c10b6bb3 82 return 0x0000FF;//
fezine 3:05c2c10b6bb3 83 case 3:
fezine 3:05c2c10b6bb3 84 colorPeak=0xFFFF00;
fezine 3:05c2c10b6bb3 85 return 0xFF33CC;//
fezine 3:05c2c10b6bb3 86 case 4:
fezine 3:05c2c10b6bb3 87 colorPeak=0x990099;
fezine 3:05c2c10b6bb3 88 return 0xFF3366;//
fezine 3:05c2c10b6bb3 89 case 5:
fezine 3:05c2c10b6bb3 90 colorPeak=0x0000FF;
fezine 3:05c2c10b6bb3 91 return 0x000000;//
fezine 3:05c2c10b6bb3 92 case 6:
fezine 3:05c2c10b6bb3 93 colorPeak=0xFF0000;
fezine 3:05c2c10b6bb3 94 return 0x00FF00;
fezine 3:05c2c10b6bb3 95 case 7:
fezine 3:05c2c10b6bb3 96 colorPeak=0xFF0000;
fezine 3:05c2c10b6bb3 97 return 0x00FF00;
fezine 3:05c2c10b6bb3 98 case 8:
fezine 3:05c2c10b6bb3 99 colorPeak=0xFF0000;
fezine 3:05c2c10b6bb3 100 return 0x00FF00;
fezine 3:05c2c10b6bb3 101 case 9:
fezine 3:05c2c10b6bb3 102 colorPeak=0xFF0000;
fezine 3:05c2c10b6bb3 103 return 0x00FF00;
fezine 3:05c2c10b6bb3 104 default:
fezine 3:05c2c10b6bb3 105 colorPeak=0xFF0000;
fezine 3:05c2c10b6bb3 106 return 0x00FF00;
fezine 3:05c2c10b6bb3 107
fezine 1:34ec04b8a8dd 108 }
fezine 1:34ec04b8a8dd 109 }
fezine 3:05c2c10b6bb3 110 //------------------------------------------设置模式,每个数字对应一种颜色变换方式
fezine 3:05c2c10b6bb3 111 int colorTransformation(int __color,int i){
fezine 3:05c2c10b6bb3 112 switch(__mode){
fezine 3:05c2c10b6bb3 113 case 1:
fezine 3:05c2c10b6bb3 114 return __color+0x060009-0x000B00;//绿色
fezine 3:05c2c10b6bb3 115 case 2:
fezine 3:05c2c10b6bb3 116 return __color+0x0B0000-0x00000C;//蓝色
fezine 3:05c2c10b6bb3 117 case 3:
fezine 3:05c2c10b6bb3 118 switch(i){
fezine 3:05c2c10b6bb3 119 case 0:return 0xFF33CC; case 1:return 0xFF33FF; case 2:return 0xCC33FF; case 3:return 0x9933FF; case 4:return 0x6633FF;
fezine 3:05c2c10b6bb3 120 case 5:return 0x3333FF; case 6:return 0x3366FF; case 7:return 0x3399FF; case 8:return 0x33CCFF; case 9:return 0x33FFFF;
fezine 3:05c2c10b6bb3 121 case 10:return 0x33FFCC; case 11:return 0x33FF99; case 12:return 0x33FF66; case 13:return 0x33FF33; case 14:return 0x66FF33;
fezine 3:05c2c10b6bb3 122 case 15:return 0x99FF33; case 16:return 0xCCFF33; case 17:return 0xFFFF33; case 18:return 0xFFCC33; case 19:return 0xFF9933;
fezine 3:05c2c10b6bb3 123 default: return 0x000000;
fezine 3:05c2c10b6bb3 124 }//粉黄
fezine 3:05c2c10b6bb3 125 case 4:
fezine 3:05c2c10b6bb3 126 switch(i){
fezine 3:05c2c10b6bb3 127 case 0:return 0xFF3366; case 1:return 0xFF33CC; case 2:return 0xCC33FF; case 3:return 0x6633FF; case 4:return 0x3366FF;
fezine 3:05c2c10b6bb3 128 case 5:return 0x33CCFF; case 6:return 0x33FFCC; case 7:return 0x33FF66; case 8:return 0x66FF33; case 9:return 0xCCFF33;
fezine 3:05c2c10b6bb3 129 case 10:return 0xFFCC33; case 11:return 0xFF6633; case 12:return 0xFF33CC; case 13:return 0xFF33FF; case 14:return 0x9933FF;
fezine 3:05c2c10b6bb3 130 case 15:return 0x3333FF; case 16:return 0x3399FF; case 17:return 0x33FFFF; case 18:return 0x33FF99; case 19:return 0x33FF33;
fezine 3:05c2c10b6bb3 131 default: return 0x000000;
fezine 3:05c2c10b6bb3 132 }//
fezine 3:05c2c10b6bb3 133 case 5:
fezine 3:05c2c10b6bb3 134 return 0X000000;//红色无
fezine 3:05c2c10b6bb3 135 case 6:
fezine 3:05c2c10b6bb3 136 return __color;
fezine 3:05c2c10b6bb3 137 break;
fezine 3:05c2c10b6bb3 138 case 7:
fezine 3:05c2c10b6bb3 139 return __color;
fezine 3:05c2c10b6bb3 140 break;
fezine 3:05c2c10b6bb3 141 case 8:
fezine 3:05c2c10b6bb3 142 return __color;
fezine 3:05c2c10b6bb3 143 break;
fezine 3:05c2c10b6bb3 144 case 9:
fezine 3:05c2c10b6bb3 145 return __color;
fezine 3:05c2c10b6bb3 146 default:
fezine 3:05c2c10b6bb3 147 return __color+0x06000C;
fezine 3:05c2c10b6bb3 148
fezine 3:05c2c10b6bb3 149 }
fezine 3:05c2c10b6bb3 150 }
fezine 3:05c2c10b6bb3 151 //------------------------------------------确定单个column的颜色
fezine 3:05c2c10b6bb3 152 void run(int j){
fezine 3:05c2c10b6bb3 153 __mode=mode*10;
fezine 3:05c2c10b6bb3 154 int __color=colorBegin();
fezine 3:05c2c10b6bb3 155 int H=((freqData[j]-noise)*19);
fezine 3:05c2c10b6bb3 156 for(int i=0; i<20; i++) {
fezine 3:05c2c10b6bb3 157 if(i>H) Column[i].hex=0;
fezine 3:05c2c10b6bb3 158 else Column[i].hex=__color;
fezine 3:05c2c10b6bb3 159 __color=colorTransformation(__color,i);
fezine 3:05c2c10b6bb3 160 }
fezine 3:05c2c10b6bb3 161 Column[max(Peak[j],H)].hex=colorPeak;
fezine 3:05c2c10b6bb3 162 if(Peak[j]<H) Peak[j]=H;//当Peak小于H时,上拉Peak到最顶端
fezine 3:05c2c10b6bb3 163 }
fezine 1:34ec04b8a8dd 164 //-------------------------------------------main
fezine 1:34ec04b8a8dd 165 int main()
fezine 1:34ec04b8a8dd 166 {
fezine 1:34ec04b8a8dd 167 strobe=1;
fezine 3:05c2c10b6bb3 168 reset=0; //initialize
fezine 1:34ec04b8a8dd 169 clk.set_frequency(SI5351_CLK1, 104570);
fezine 3:05c2c10b6bb3 170 clk.set_frequency(SI5351_CLK0, 190000);
fezine 2:2c78f22e6081 171 wait_us(200*1000); // 等待HSE稳定
fezine 1:34ec04b8a8dd 172 neoPixel.normalize = false; // 使r+g+b=255 均匀每个led亮度
fezine 1:34ec04b8a8dd 173 //Peakdecrease.detach();
fezine 1:34ec04b8a8dd 174 toggleOn();//打开PeakDecrease
fezine 1:34ec04b8a8dd 175 while(1) {
fezine 1:34ec04b8a8dd 176 Read();
fezine 3:05c2c10b6bb3 177 neoPixel.global_scale = brightness; //亮度调节
fezine 3:05c2c10b6bb3 178 //for(int x=0;x<14;x++) printf("%4.d ",(int)(freqData[x]*100));//test
fezine 3:05c2c10b6bb3 179 //printf("\n");//test
fezine 1:34ec04b8a8dd 180 for(int j=0;j<NumColumn;j++){
fezine 1:34ec04b8a8dd 181 run(j);
fezine 1:34ec04b8a8dd 182 for(int k=20*j;k<20*(j+1);k++){
fezine 1:34ec04b8a8dd 183 Column_All[k].hex=Column[k%20].hex;
fezine 1:34ec04b8a8dd 184 }
fezine 1:34ec04b8a8dd 185 }
fezine 1:34ec04b8a8dd 186 neoPixel.send(Column_All, NumColumn*20);
fezine 1:34ec04b8a8dd 187 }
tichise 0:124662fe9af9 188 }