這是樓主的ardunio示波器的程序,給大家省黑幣:
- /************************************************************************************/
- #include <UTFT.h>
-
- // Declare which fonts we will be using
- extern uint8_t SmallFont[];
- //UTFT myGLCD(Model,SDA,SCL,CS,RST,RS)
- //QD220A is for QDtech 2.2inch SPI LCD Module,Driver IC:ILI9225
- UTFT myGLCD(QD220A,A2,A1,3,2,A3); // Remember to change the model parameter to suit your display module!
- int Key_add = 8; //聲明按鈕引腳
- int Key_sub = 9;
- int Key_hold = 10;
- int Key_a =11;
- int x,y; //聲明坐標
- int i,i1,i2,V_min,V_max,V_mid,t,t0,t1,sta,Key=1,hold=0,yi=88;
- long Freq;
- float Vpp,Vp_p;
- int Y[96]; //聲明信號值儲存數組
- int Buffer[220]; //緩存值儲存數組
- int buf[220];
- //采樣
- void sample( )
- { for(i = 0;i <220;i++)
- {
- Buffer[i] = analogRead(A4);
- switch(Key)
- {
- case 1:
- break;
- case 2:
- delayMicroseconds(4);
- break;
- case 3:
- delayMicroseconds(10);
- break;
- case 4:
- delayMicroseconds(23);
- break;
- case 5:
- delayMicroseconds(60);
- break;
- case 6:
- delayMicroseconds(123);
- break;
- case 7:
- delayMicroseconds(248);
- break;
- case 8:
- delayMicroseconds(623);
- break;
- case 9:
- delayMicroseconds(1247);
- break;
- default:break;
- }
- }
- }
-
- void Measure()
- {
- V_max=Buffer[0];
- V_min=Buffer[0];
- for(i=0;i<218;i++)
- {
- if(Buffer[i]>V_max)
- V_max=Buffer[i];
- if(Buffer[i]<V_min)
- V_min=Buffer[i];
- }
- V_mid=(V_max+V_min)/2;
- Vp_p=(V_max+V_min)/2*0.0049;
- Vpp=(V_max-V_min)*0.0049;
- for(i=0;i<218;i++)
- {
- if(Buffer[i]<V_mid&&Buffer[i+1]>=V_mid)
- {
- i1=i;
- break;
- }
- }
- for(i=i1+1;i<218+i1;i++)
- {
- if(Buffer[i]<V_mid&&Buffer[i+1]>=V_mid)
- {
- i2=i;
- break;
- }
- }
- t=i2-i1;
- if(t>0)
- Freq=10000/t;
- else
- Freq=0;
- }
-
- void Transform( )
- {
- for(i = 0;i < 220;i++)
- Y[i] = yi-(Buffer[i]>>4);
- }
-
- //顯示
- void draw( )
- {
- // Draw crosshairs
- myGLCD.setColor(0, 0, 255);
- myGLCD.setBackColor(0, 0, 0);
- myGLCD.drawLine(109, 15, 109, 160);//畫坐標軸
- myGLCD.drawLine(1, 88, 218, 88);
-
- for (int i=9; i<210; i+=10)//畫坐標軸刻度
- myGLCD.drawLine(i, 86, i, 90);
- for (int i=18; i<160; i+=10)
- myGLCD.drawLine(107, i, 111, i);
-
-
- myGLCD.setColor(0, 0, 255);
- myGLCD.drawRect(0, 14, 219, 161);//畫邊框(矩形函數)
- //畫網格
- for(x=9;x<210;x+=10)
- {
- for(y=18;y<160;y+=10)
- myGLCD.drawPixel(x,y);
- }
- //顯示參數
-
- int a=1;
- for (int x=1;x<218; x++)
- {
-
- if( a<219 )
- a++;
- myGLCD.setColor(0,0,0);
- myGLCD.drawLine(x,buf[a],x,buf[a+1]);
- myGLCD.setColor(0,255,255);
- myGLCD.drawLine(x,Y[x],x,Y[x+1]);
- }
- a=1;
- for (int x=1;x<218; x++)
- {
- buf[x]=Y[x];
- if( a<219 )
- a++;
- myGLCD.setColor(0,0,0);
- myGLCD.drawLine(x,Y[x],x,Y[x+1]);
- myGLCD.setColor(0,255,255);
- myGLCD.drawLine(x,Y[a],x,Y[a+1]);
- }
- buf[218]=Y[218];
- buf[219]=Y[219];
- myGLCD.setColor(255, 255, 255);
- myGLCD.printNumF(Vpp,1, 48, 1);
- myGLCD.printNumF(Vp_p,1, 117, 163);
- switch(Key)
- {
- case 1:
- myGLCD.print("0.02", 50, 163);
- myGLCD.printNumF(Freq*50,1, 172, 1);
- break;
- case 2:
- myGLCD.print("0.05", 50, 163);
- myGLCD.printNumF(Freq*20,1, 172, 1);
- break;
- case 3:
- myGLCD.print("0.10", 50, 163);
- myGLCD.printNumF(Freq*10,3, 172, 1);
- break;
- case 4:
- myGLCD.print("0.20", 50, 163);
- myGLCD.printNumF(Freq*5,1, 172, 1);
- break;
- case 5:
- myGLCD.print("0.50", 50, 163);
- myGLCD.printNumF(Freq*2, 1,172, 1);
- break;
- case 6:
- myGLCD.print("1.00", 50, 163);
- myGLCD.printNumF(Freq, 1,172, 1);
- break;
- case 7:
- myGLCD.print("2.00", 50, 163);
- myGLCD.printNumF(Freq/2,1, 172, 1);
- break;
- case 8:
- myGLCD.print("5.00", 50, 163);
- myGLCD.printNumF(Freq/5, 1,172, 1);
- break;
- case 9:
- myGLCD.print("10.0", 50, 163);
- myGLCD.printNumF(Freq/10,1, 172, 1);
- break;
- default:break;
- }
- }
-
- //鍵盤掃描
- void Key_scan()
- {
- if(digitalRead(Key_add)==LOW)
- {
- while(digitalRead(Key_add)==LOW);
- Key++;
- if(Key==10)
- Key=9;
- }
- if(digitalRead(Key_sub)==LOW)
- {
- while(digitalRead(Key_sub)==LOW);
- Key--;
- if(Key==0)
- Key=1;
- }
- if(digitalRead(Key_hold)==LOW)
- {
- while(digitalRead(Key_hold)==LOW);
- hold=~hold;
-
- }
- if(digitalRead(Key_a)==LOW)
- {
- while(digitalRead(Key_a)==LOW);
- yi=yi+5;
- if(yi>160||yi<74)
- yi=74;
- }
- }
-
-
- void setup()
- {
- pinMode(Key_add,INPUT);
- digitalWrite(Key_add,HIGH);
- pinMode(Key_sub,INPUT);
- digitalWrite(Key_sub,HIGH);
- pinMode(Key_hold,INPUT);
- digitalWrite(Key_hold,HIGH);
- pinMode(Key_a,INPUT);
- digitalWrite(Key_a,HIGH);
-
- // Setup the LCD
- myGLCD.clrScr();
- myGLCD.InitLCD();
- myGLCD.clrScr();
- myGLCD.setBackColor(0, 0, 0);
- myGLCD.setFont(SmallFont);
- myGLCD.setColor(64, 64, 64);
- myGLCD.fillRect(0, 0, 219, 13);
- myGLCD.setColor(64, 64, 64);
- myGLCD.fillRect(0, 162, 219, 175);
- myGLCD.setColor(255, 255, 0);
- myGLCD.setBackColor(64, 64, 64);
- myGLCD.print("Vpp(V)", 1, 1);
- myGLCD.print("F(HZ)", 132, 1);
- myGLCD.print("MS/div", 1, 163);
- myGLCD.print("V/div", 141, 163);
- myGLCD.print("Vp-p", 85, 163);
- myGLCD.setBackColor(0, 0, 0);
- myGLCD.setColor(255, 255, 255);
- myGLCD.print("0.82", 181, 163);
- }
-
- void loop()
- {
- sample( );
- Measure( );
- Transform( );
- Key_scan( );
- if(hold==0)
- draw();
- }
復制代碼 |