本帖最后由 xiebb5688 于 2017-12-4 09:06 編輯
雖然學的是機械,可也接觸過C語言,MATLAB等程序,每次編程的時候,能夠把BUG一個個解決掉,會帶來不小的成就感。于是感覺到自己骨子還是挺喜歡代碼的。于是
也不知何時了解了Arduino,就迅速開始入坑了。買了初級套裝,從DF論壇上的學習區域一步步學過來。然后又知道了ARDUINO中文論壇和極客工坊等,慢慢的接觸了一個又一個好玩的項目。
看了那么創客的項目,學做了幾個,真的是很感謝各位大師,不但提供源代碼,也講解步驟,列出元件清單。
今天,我也來貢獻自己的一份子,分享一下自己的小創作-------超聲波測距儀。
先來一個成品圖片
使用方法:打開測距儀開關,顯示屏亮,將超聲波測距模塊對準被測物體,按下測量按鈕(按鈕是復位開關,要一直按下,才會測量),屏幕顯示測量數值。松開測量按鈕,屏幕顯示的是最后的測量值。
下圖為充電口,使用的是android手機常用的micro usb2.0口。
經過外部校準后,在外殼上標記原點位置。
電子水平有限,請原諒我的電路圖畫的實在是太難看了,大家能看懂就可以了。
元件清單:
US-015超聲波測距模塊一個
0.96寸OLED12864屏一個
充電升壓保護板一個
Promini板一個
18650鋰電池一個
撥碼開關一個
按鈕一個
板子空間位置布局如下圖所示,本來想上實物給大家看的,怎奈我焊的實在太凌亂了。先擺好,再用洞洞板焊上,這一步挺簡單的。
過程中的一個問題:
PROmini板上的RST如果直接和12864屏上的RES接,顯示屏也是可以工作的,但是會經常出項亂碼,如下圖所示。只能按PRO mini上的重啟按鈕才能顯示正常,試了很多代碼也不知道如何解決。后來沒辦法,只能從PRO mini上的數字引腳2接到12864屏上的RES,然后再在程序里的SETUP里面復位一下,具體原理我也道不清楚,在此拋磚引玉了。希望有大神能來解釋了.
下面是代碼。
[mw_shl_code=c,true]
#include "U8glib.h"
U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9);??// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
unsigned int TrigPin = 5, EchoPin = 4; //HC-SR04觸發信號,回波檢測,回波時間
unsigned int RST=2;//接12864屏RES管腳
unsigned int Len_Echo = 0;//超聲波測量值
unsigned int value=0;//屏幕顯示值
const char HZsize=16;//漢字分辨率,
static char tfont16[]=
{
0x02,0x01,0x12,0x06,0x12,0xF8,0x12,0x04,0xFF,0xFE,0x12,0x22,0x12,0x22,0x42,0x02,
0x45,0xF2,0x79,0x12,0x41,0x12,0x45,0x12,0x43,0x12,0x7D,0xF2,0x00,0x02,0x00,0x00,/*"超",0*/
0x20,0x01,0x28,0x06,0x2B,0xF8,0x2A,0x40,0x2A,0x40,0x2A,0x40,0x2A,0x40,0xFB,0xC0,
0x2A,0x40,0x2A,0x40,0x2A,0x40,0x2A,0x40,0x2B,0xC0,0x28,0x00,0x20,0x00,0x00,0x00,/*"聲",1*/
0x08,0x20,0x06,0x20,0x40,0x3E,0x30,0xC0,0x03,0x01,0x00,0x06,0x1F,0xF8,0x11,0x01,
0x11,0xC2,0x11,0x34,0xFF,0x08,0x11,0x14,0x11,0x62,0x15,0x81,0x18,0x01,0x00,0x00,/*"波",2*/
0x08,0x20,0x06,0x20,0x40,0x7E,0x31,0x80,0x00,0x01,0x7F,0xE2,0x40,0x0C,0x4F,0xF0,
0x40,0x08,0x7F,0xE4,0x00,0x00,0x1F,0xE2,0x00,0x01,0xFF,0xFE,0x00,0x00,0x00,0x00,/*"測",3*/
0x00,0x04,0x7C,0xFC,0x44,0x04,0x47,0xF8,0x44,0x88,0x7C,0x88,0x00,0x00,0x7F,0xFE,
0x44,0x22,0x44,0x22,0x44,0x22,0x44,0x22,0x44,0x22,0x47,0xE2,0x40,0x02,0x00,0x00,/*"距",4*/
0x00,0x80,0x01,0x00,0x06,0x00,0x1F,0xFF,0xE0,0x00,0x00,0x01,0x38,0x02,0x07,0x04,
0x80,0xC8,0x60,0x30,0x00,0xC8,0x07,0x04,0x78,0x02,0x00,0x01,0x00,0x01,0x00,0x00,/*"儀",5*/
0x20,0x00,0x20,0x7F,0x20,0x40,0x2F,0x40,0x21,0x48,0x2B,0x5C,0xA5,0x68,0x65,0xC8,
0x25,0x48,0x2B,0x58,0x21,0x4C,0x2F,0x42,0x20,0x41,0x20,0x7E,0x20,0x00,0x00,0x00,/*"離",1*/
};
void Show_CH_Font16(int x,int y,int FontPos) //FontPos漢字順序
{
char temp,t1;
byte t=0;
byte y0=y;
// const int HZbye_num=HZsize*HZsize/8;//每個漢字包含的字節,例如每個16*16的漢字點陣 有32個字節
for(t=0;t
{
temp=tfont16[t+HZsize*HZsize/8*FontPos];
for(t1=0;t1<8;t1++)
{
if(temp&0x80)
{
//??ucg.setColor(r, g, b);
u8g.drawPixel(x,y);
}
temp<<=1;
y++;
if((y-y0)==HZsize)
{
y=y0;
x++;
break;
}
}
}
}
void draw(void) {
Show_CH_Font16(5,0,0);? ?//超
Show_CH_Font16(25,0,1);? ?//聲
Show_CH_Font16(45,0,2);? ?//波
Show_CH_Font16(65,0,3);? ?//測
Show_CH_Font16(85,0,4);? ?//距
Show_CH_Font16(105,0,5);? ?//儀
Show_CH_Font16(3,20,4);? ?//距
Show_CH_Font16(20,20,6);? ?//離
// graphic commands to redraw the complete screen should be placed here
u8g.setFont(u8g_font_fub30n);
u8g.setFontPosTop();
u8g.setPrintPos(35,25);
u8g.print(value);
u8g.setFont(u8g_font_timR10);
u8g.setPrintPos(0,50);
u8g.print("(mm)");
u8g.drawHLine(35, 25+33, 90);? ? // All other procedures are also affected
u8g.drawHLine(35, 25+34, 90);? ? // All other procedures are also affected
u8g.drawHLine(35, 25+35, 90);? ? // All other procedures are also affected
u8g.undoScale();? ?? ?? ? // IMPORTANT: Switch back to normal mode
}
void setup(void) {
//??Serial.begin(9600);
pinMode(EchoPin, INPUT); //超聲波測距
pinMode(TrigPin, OUTPUT);
digitalWrite(TrigPin, LOW);
//0.96寸OLED12864屏RES引腳復位
pinMode(RST, OUTPUT);
digitalWrite(RST, LOW);
delay(50);
digitalWrite(RST, HIGH);
if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
u8g.setColorIndex(255);? ???// white
}
else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
u8g.setColorIndex(3);? ?? ?? ?// max intensity
}
else if ( u8g.getMode() == U8G_MODE_BW ) {
u8g.setColorIndex(1);? ?? ?? ?// pixel on
}
else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
u8g.setHiColorByRGB(255,255,255);
}
}
void loop(void)
{
digitalWrite(TrigPin, HIGH); //發送超聲波測量觸發脈沖
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
Len_Echo = pulseIn(EchoPin, HIGH)/5.8; //回波時間測量
if (Len_Echo>0)
{
value=Len_Echo;
}
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );
// rebuild the picture after some delay
delay(500);
}
[/mw_shl_code]