嵌入式課程設計——藍牙無線數(shù)據(jù)傳輸_第1頁
已閱讀1頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  課 程 設 計 書</b></p><p><b>  《嵌入式系統(tǒng)實訓》</b></p><p>  學院 </p><p>  姓名 </p><p>  學號

2、 </p><p>  組別 </p><p><b>  1設計概述</b></p><p>  能源是經(jīng)濟發(fā)展和社會進步的支柱,能源問題成為當今世界各國尤其是發(fā)達國家所要解決的頭等大事。世界各國都在鼓勵大力開發(fā)可再生能源。風能和太陽能成為當下最受歡迎的新能源,也是目前可再生能源應用技術中最成熟的

3、。本設計基于人體運動出來的機械能轉(zhuǎn)化成可利用回收的電能,是新能源的一種體現(xiàn),具有很好的開發(fā)前景和實際用途。</p><p>  該設計是基于以stm32f030芯片為主芯片的智能發(fā)電的PCB主板,再利用開關磁阻電機進行發(fā)電,將其電壓和電流通過wifi模塊發(fā)送給手機端,通過手機上的APP可以顯示出電流和電壓值,并進行后臺處理和數(shù)據(jù)保存。設計將從芯片器件的選型再到PCB板的設計,之后是PCB板的焊接,再是軟件的編寫與

4、調(diào)試,軟件部分還包括手機APP的編寫,最終完成本次設計。</p><p><b>  設計方案</b></p><p>  該設計方案可以劃分為兩個部分,第一部分是終端部分,有發(fā)電機的驅(qū)動模塊,電壓電流采集模塊,WiFi模塊以和主控芯片及其外設;第二部分是手機部分,該部分主要是實現(xiàn)一個上位機的功能,包括接收信息,發(fā)送指令,主要有登錄界面和查詢界面。兩部分之間通過WIF

5、I來實現(xiàn)通信。所以總體設計框圖1所示:</p><p>  圖2.1 總體設計方案</p><p>  其中手機端的設計為純粹的軟件設計,而智能發(fā)電系統(tǒng)主體的設計方案是方案設計中的重點部分包括硬件部分的設計與軟件部分的設計。該系統(tǒng)的設計方案包括以下幾個方面,一是小車主體電路板的設計方案,屬于硬件部分的設計;二是軟件設計方案,屬于軟件部分的設計,主要是用于驅(qū)動硬件電路和給手機端APP提供操作

6、接口。</p><p>  該系統(tǒng)主體電路板的設計包括電源模塊的設計,主芯片外圍電路的設計,WiFi模塊的設計,電機驅(qū)動模塊的設計,各個傳感器模塊的設計。軟件部分的設計包括主體函數(shù)的設計及各個功能模塊的設計,在實現(xiàn)了各個功能模塊設計的基礎上設計出主體程序,以便可以隨時中斷某一個功能而去實現(xiàn)另外的功能。外圍設計主要是各個傳感器的放置位置的選擇,以便達到所需的功能。</p><p><b

7、>  詳細設計方案 </b></p><p>  2.1.1 電源模塊</p><p>  由于電機的驅(qū)動需要15V的電源,而USB及傳感器等模塊的供電需要5V的電源,主芯片需要3.3V及1.2V的電源。所以在電源模塊的設計中需要用到外部供電電源為15V的可移動電源,可以是蓄電池也可以是干電池串聯(lián)而得。5V的電源通過對15V電源降壓而得到,3.3V電源分別由XC6206P

8、332MR通過不同的外圍電路來獲得。</p><p>  2.1.2 主芯片模塊</p><p>  主芯片在此設計中制定為stm32f030作為主控芯片,stm32f030主控芯片的外圍電路包括復位電路,晶振,過芯片中的USB接口燒錄到SPI FLASH中,選擇的啟動方式是USB啟動。當程序燒錄好以后,將啟動方式轉(zhuǎn)換為SPI FLASH啟動。SDRAM中用于存放程序。</p>

9、<p>  STM32F030 內(nèi)部有RC振蕩器,可以為內(nèi)部的鎖相環(huán)提供時鐘,但同外部晶振相比不夠準確,所以本文使用外部時鐘源。外部時鐘源主要分為高速外部振蕩器和低速外部振蕩器,高速外部振蕩器主要作為芯片處理器和STM32 外設的驅(qū)動時鐘,低速外部振蕩器用于驅(qū)動窗口看門狗和實時時鐘。該系統(tǒng)采用 8M外部晶振作為高速外部時鐘信號的時鐘源,外接兩個20p F的貼片電容。低速外部振蕩器</p><p> 

10、 是時鐘源可以使用外部晶振或用戶自己提供,該系統(tǒng)采用頻率值為 32.768k Hz 的外部晶振,外接兩個10p F的貼片電容。STM32F030有3種啟動方式,分為系統(tǒng)復位、電源復位、備份區(qū)域復位。該系統(tǒng)采用電源復位,NRST 引腳與10K?電阻串聯(lián)使引腳處于高電位,當需要復位時,S1開關閉合使 NRST引腳接地,產(chǎn)生低電平使微處理器復位。該微處理器內(nèi)部也有復位電路,當引腳電壓小于 2.0V,片會處于復位狀態(tài),但會有 40m A的延遲。

11、</p><p>  2.1.3 WIFI模塊</p><p>  WIFI模塊的作用是實現(xiàn)下位機與上位機的實時通信,并且向上位機傳遞圖像數(shù)據(jù)。使用的是HC05模塊。其特性如下:</p><p>  1、嵌入高性能32位RISC微處理器 2、55nm CMOS 高度集成射頻技術 3、集成高性能開關穩(wěn)壓器 4、低功耗

12、 5、支持1/2/3/4/線 PTA WIFI/藍牙 6、自動校準 7、天線分集 8、控制每個包的功率 9、完全遵守USB v 2.0 高速模式 10、直接支持WIFI功能 11、支持802.1w保護管理框架</p><p>  2.1.4 霍爾傳感器模塊</p><p>  霍爾傳感器是根

13、據(jù)霍爾效應制作的一種磁場傳感器?;魻栃谴烹娦囊环N,這一現(xiàn)象是霍爾(A.H.Hall,1855—1938)于1879年在研究金屬的導電機構時發(fā)現(xiàn)的。后來發(fā)現(xiàn)半導體、導電流體等也有這種效應,而半導體的霍爾效應比金屬強得多,利用這現(xiàn)象制成的各種霍爾元件,廣泛地應用于工業(yè)自動化技術、檢測技術及信息處理等方面?;魻栃茄芯堪雽w材料性能的基本方法。通過霍爾效應實驗測定的霍爾系數(shù),能夠判斷半導體材料的導電類型、載流子濃度及載流子遷移率等重

14、要參數(shù)。</p><p>  由霍爾效應的原理知,霍爾電勢的大小取決于:Rh為霍爾常數(shù),它與半導體材質(zhì)有關;I為霍爾元件的偏置電流;B為磁場強度;d為半導體材料的厚度。</p><p>  對于一個給定的霍爾器件,當偏置電流 I 固定時,UH將完全取決于被測的磁場強度B。</p><p>  一個霍爾元件一般有四個引出端子,其中兩根是霍爾元件的偏置電流 I 的輸入端

15、,另兩根是霍爾電壓的輸出端。如果兩輸出端構成外回路,就會產(chǎn)生霍爾電流。一般地說,偏置電流的設定通常由外部的基準電壓源給出;若精度要求高,則基準電壓源均用恒流源取代。為了達到高的靈敏度,有的霍爾元件的傳感面上裝有高導磁系數(shù)的鍍膜合金;這類傳感器的霍爾電勢較大,但在0.05T左右出現(xiàn)飽和,僅適用在低量限、小量程下使用。</p><p>  在半導體薄片兩端通以控制電流I,并在薄片的垂直方向施加磁感應強度為B的勻強磁場

16、,則在垂直于電流和磁場的方向上,將產(chǎn)生電勢差為UH的霍爾電壓。</p><p><b>  圖2.2 霍爾效應</b></p><p>  2.1.5 開關磁阻電機</p><p>  開關磁阻電動機,調(diào)速系統(tǒng)所用的開關磁阻電動機(SRM)是SRD中實現(xiàn)機電能量轉(zhuǎn)換的部件,也是SRD有別于其他電動機驅(qū)動系統(tǒng)的主要標志。SRM系雙凸極可變磁阻電動

17、機,其定、轉(zhuǎn)子的凸極均由普通硅鋼片疊壓而成。轉(zhuǎn)子既無繞組也無永磁體,定子極上繞有集中繞組,徑向相對的兩個繞組聯(lián)接起來,稱為“一相”,SR電動機可以設計成多種不同相數(shù)結構,且定、轉(zhuǎn)子的極數(shù)有多種不同的搭配。相數(shù)多、步距角小,有利于減少轉(zhuǎn)矩脈動,但結構復雜,且主開關器件多,成本高,現(xiàn)今應用較多的是四相(8/6)結構和三相(12/8)結構。</p><p>  圖2.2示出四相(8/6)結構SR電動機原理圖。為簡單計,

18、圖中只畫出A相繞組及其供電電路。SR電動機的運行原理遵循“磁阻最小原理”— ‘磁通總要沿著磁阻最小的路徑閉合,而具有一定形狀的鐵心在移動到最小磁阻位置時,必使自己的主軸線與磁場的軸線重合。圖2中,當定子D-D’極勵磁時,1-1'向定子軸線D-D'重合的位置轉(zhuǎn)動,并使D相勵磁繞組的電感最大。若以圖中定、轉(zhuǎn)子所處的相對位置作為起始位置,則依次給D→A→B→C相繞組通電,轉(zhuǎn)子即會逆著勵磁順序以逆時針方向連續(xù)旋轉(zhuǎn);反之,若依次給

19、B→A→D→C相通電,則電動機即會沿順時針方向轉(zhuǎn)動??梢?,SR電動機的轉(zhuǎn)向與相繞組的電流方向無關,而僅取決于相繞組通電的順序。另外,從圖2.2可以看出,當主開關器件S1、S2導通時,A相繞組從直流電源US吸收電能,而當S1、S2關斷時,繞組電流經(jīng)續(xù)流二極管VD1、VD2繼續(xù)流通,并回饋給電源US。因此,SR電動機傳動的共性特點是具有再生作用,系統(tǒng)效率高。</p><p><b>  圖 2.3</

20、b></p><p>  2.1.6 電路板抗干擾設計</p><p>  電路設計和應用應盡量消除或抑制電子電路的干擾,該監(jiān)測系統(tǒng)的硬件電路用來接收傳感器的數(shù)據(jù)并對其進行處理,如果不能降低各類干擾的影響,將會增加監(jiān)測數(shù)據(jù)誤差。硬件電路設計過程中充分考慮對干擾的抑制,對電路進行了合理的設計以及選擇合適的元器件。</p><p>  在硬件電路設計過程中,充

21、分從抑制干擾源、切斷干擾途徑以及提高元器件的抗干擾性能等三方面考慮,為降低信號干擾,采取了以下措施。</p><p> ?。?)以核心部件為中心,圍繞其進行布線,易受干擾元器件相互遠離,輸入輸出元器件分開放置,電源和高頻電路部分盡量遠離;</p><p> ?。?)STM32微處理器和大功率器件的地線需要單獨接地,以減少相互干擾,大功率元器件放置在電路板邊緣;</p><

22、;p> ?。?)在電路板布線時避免九十度折線,同時減少回路環(huán)面積,選擇合適粗細的地線以及電源線;</p><p> ?。?)數(shù)字區(qū)和模擬區(qū)用地線隔離,模擬地和數(shù)字地要分離,統(tǒng)一在一點接于電源地。</p><p><b>  軟件設計方案</b></p><p><b>  軟件系統(tǒng)框圖如下:</b></p>

23、;<p>  軟件系統(tǒng)框圖 2.4</p><p>  手機客戶端APP設計</p><p><b>  開發(fā)環(huán)境的搭建</b></p><p>  本設計在開發(fā)過程中使用Eclipse加ADT插件的開發(fā)環(huán)境,Eclipse集成開發(fā)環(huán)境JDK,首先需要安裝JDK工具包,本設計中使用的JDK版本是JDK-7-Windows-i586

24、.exe。安裝完成后,配置系統(tǒng)環(huán)境變量,將JDK的安裝路徑添加到系統(tǒng)Path中去。在Andriod developer官網(wǎng)上下載Eclipse開發(fā)環(huán)境,其己對Eclipse和ADK插件綁定,開發(fā)者直接下載后解壓即可使用。本設計使用的ADT版本是adt-bundle-windows-x86-20140702.zip。</p><p>  手機APP的主要功能模塊</p><p>

25、  手機APP的設計采用了MVC框架,將Model、View和Controler分開,有效減少開發(fā)工作量量和有效減少開發(fā)工作查和代碼冗余率,有利于代碼調(diào)試。本設計將手機端功能主要分為5大功能模塊:登錄功能模塊、查詢功能模塊、接收數(shù)據(jù)模塊、藍牙驗證模塊。</p><p><b> ?。?)登錄模塊</b></p><p>  登錄模塊需要用戶輸入個人信息,如用戶名、密碼

26、、手機號碼等。登錄界面設計兩個EditView輸入爛和2個Button,輸入爛用來接收用戶名,2個按紐分別是登錄和取消。當用戶點擊確認按鈕后,跳轉(zhuǎn)到主頁面。</p><p>  confirm=(ImageButton)findViewById(R.id.confirm);(確認按鈕綁定)</p><p>  cancel=(ImageButton)findViewById(R.id.ca

27、ncel); (取消按鈕綁定)</p><p>  public void onClick(View v) { (設定按鈕點擊事件)</p><p>  switch (v.getId()) {</p><p>  case R.id.confirm:</p><p>  username=name.get

28、Text().toString();</p><p>  if(username.equals(""))</p><p><b>  {</b></p><p>  Toast.makeText(LoginActivity.this, "用戶名為空,請輸入!", Toast.LENGTH_SHORT).s

29、how();</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  Intent intent = new Intent();</p><p>  intent.

30、setClass(LoginActivity.this, MainActivity.class);</p><p>  intent.putExtra("name", username); </p><p>  startActivity(intent);</p><p><b>  }</b></p>

31、;<p><b>  break;</b></p><p>  case R.id.cancel:</p><p>  this.finish();</p><p><b>  break;</b></p><p><b>  default:</b></p

32、><p><b>  break;</b></p><p><b>  }</b></p><p><b> ?。?)藍牙搜索模塊</b></p><p>  進入搜索藍牙界面后,會搜索附近的藍牙</p><p>  a.設置權限 在manife

33、st中配置 </p><p>  <uses-permission android:name="android.permission.BLUETOOTH"/>  </p><p>  <uses-permission android:name="android.permission.BLUET

34、OOTH_ADMIN"/>b.啟動藍牙 首先要查看本機是否支持藍牙,獲取BluetoothAdapter藍牙適配器對象 </p><p>  BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();  </p><

35、p>  if(mBluetoothAdapter == null){  //表明此手機不支持藍牙  </p><p><b>  return;  </b></p><p><b>  }  </b></p><p>  i

36、f(!mBluetoothAdapter.isEnabled()){ //藍牙未開啟,則開啟藍牙  </p><p>  Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);  </p><p>  star

37、tActivityForResult(enableIntent, REQUEST_ENABLE_BT);  </p><p><b>  }   </b></p><p>  public void onActivityResult(int requestCode, i

38、nt resultCode, Intent data){  </p><p>  if(requestCode == REQUEST_ENABLE_BT){  </p><p>  if(requestCode == RESULT_OK){ //藍牙已經(jīng)開啟 &

39、#160; </p><p><b>  }  </b></p><p><b>  }  </b></p><p>  }  c.發(fā)現(xiàn)藍牙設備 這里可以細分為幾個方面  (I)使本機藍牙處于可見(即處于易被搜索到狀態(tài)),便

40、于其他設備發(fā)現(xiàn)本機藍牙 </p><p>  //使本機藍牙在300秒內(nèi)可被搜索  </p><p>  private void ensureDiscoverable() {  </p><p>  if (mBluetoothAdapter.getScanMode()

41、60;!=  </p><p>  BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {  </p><p>  Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQ

42、UEST_DISCOVERABLE);  </p><p>  discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);  </p><p>  startActivity(discoverableIntent);  &

43、lt;/p><p><b>  }  </b></p><p>  }  (II)查找已經(jīng)配對的藍牙設備,即以前已經(jīng)配對過的設備 </p><p>  Set<BluetoothDevice> pairedDevices = mBluetoothAdapt

44、er.getBondedDevices();  </p><p>  if (pairedDevices.size() > 0) {  </p><p>  findViewById(R.id.title_paired_devices).setVisibility(View.VISIBLE); 

45、 for (BluetoothDevice device : pairedDevices) {  </p><p>  //device.getName() +" "+ device.getAddress());  </p><p><

46、b>  }  </b></p><p>  } else {  </p><p>  mPairedDevicesArrayAdapter.add("沒有找到已匹對的設備");  </p><p><b>  }  &l

47、t;/b></p><p>  (III)通過mBluetoothAdapter.startDiscovery();搜索設備,要獲得此搜索的結果需要注冊 一個BroadcastReceiver來獲取。先注冊再獲取信息,然后處理</p><p>  //注冊,當一個設備被發(fā)現(xiàn)時調(diào)用onReceive</p><p>  IntentFilter

48、0;filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);</p><p>  this.registerReceiver(mReceiver, filter);</p><p>  //當搜索結束后調(diào)用onReceive</p><p>  filter =

49、 new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);  </p><p>  this.registerReceiver(mReceiver, filter);  </p><p>  private BroadcastReceiver&#

50、160;mReceiver = new BroadcastReceiver() {@Override  </p><p>  public void onReceive(Context context, Intent intent) {  </p><p&

51、gt;  String action = intent.getAction();  </p><p>  if(BluetoothDevice.ACTION_FOUND.equals(action)){  </p><p>  BluetoothDevice device = intent.

52、getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);  // 已經(jīng)配對的則跳過  </p><p>  if (device.getBondState() != BluetoothDevice.BOND_BONDED) {</p><p>  mNewDe

53、vicesArrayAdapter.add(device.getName() + "\n" + device.getAddress());  //保存設備地址與名字  </p><p><b>  }  </b></p><p>  }else

54、60;if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {  //搜索結束  </p><p>  if (mNewDevicesArrayAdapter.getCount() == 0)  </p><p&g

55、t;  mNewDevicesArrayAdapter.add("沒有搜索到設備");  </p><p><b>  }  </b></p><p><b>  }  </b></p><p><b>  }  

56、</b></p><p>  };  d.建立連接 查找到設備 后,則需要建立本機與其他設備之間的連接。一般用本機搜索其他藍牙設備時,本機可以作為一個服務端,接收其他設備的連接。啟動一個服務器端的線程,死循環(huán)等待客戶端的連接,這與ServerSocket極為相似。 這個線程在準備連接之前啟動 </p><p>  //UU

57、ID可以看做一個端口號  </p><p>  private static final UUID MY_UUID =  </p><p>  UUID.fromString("fa87c0d0-afac-11de-8a39-0800200c9a66");  &

58、lt;/p><p>  //像一個服務器一樣時刻監(jiān)聽是否有連接建立  </p><p>  private class AcceptThread extends Thread{  </p><p>  private BluetoothServerSocket serve

59、rSocket;     </p><p>  public AcceptThread(boolean secure){  </p><p>  BluetoothServerSocket temp = null;  </p><p

60、><b>  try {  </b></p><p>  temp = mBluetoothAdapter.listenUsingRfcommWithServiceRecord( </p><p>  NAME_INSECURE, MY_UUID);  </p>

61、<p>  } catch (IOException e) {  </p><p>  Log.e("app", "listen() failed", e);  </p><p><b>  }  

62、</b></p><p>  serverSocket = temp;  </p><p><b>  }    </b></p><p>  public void run(){  </p><

63、;p>  BluetoothSocket socket=null;  </p><p>  while(true){  </p><p><b>  try {  </b></p><p>  socket = serverSocket.a

64、ccept();  </p><p>  } catch (IOException e) {  </p><p>  Log.e("app", "accept() failed", e);  </p><

65、;p><b>  break;  </b></p><p><b>  }  </b></p><p><b>  }  </b></p><p>  if(socket!=null){ //此時可以新建一個數(shù)據(jù)交換線程,把此

66、socket傳進去  </p><p><b>  }  </b></p><p><b>  }    </b></p><p><b>  //取消監(jiān)聽  </b></p><p

67、>  public void cancel(){     </p><p><b>  try {  </b></p><p>  serverSocket.close();  </p><p>  } cat

68、ch (IOException e) {  </p><p>  Log.e("app", "Socket Type" + socketType + "close() of server failed", 

69、e);  </p><p><b>  }  </b></p><p><b>  }  </b></p><p><b>  }  </b></p><p>  e.建立數(shù)據(jù)通信線程,進行讀取數(shù)據(jù)

70、 </p><p>  //建立連接后,進行數(shù)據(jù)通信的線程  </p><p>  private class ConnectedThread extends Thread{  </p><p>  private BluetoothSocket socke

71、t;  </p><p>  private InputStream inStream;  </p><p>  private OutputStream outStream;          </p&g

72、t;<p>  public ConnectedThread(BluetoothSocket socket){     </p><p>  this.socket = socket;  </p><p>  try { //獲得輸入輸出流

73、0; </p><p>  inStream = socket.getInputStream();  </p><p>  outStream = socket.getOutputStream();  </p><p>  } catch (IOExcept

74、ion e) {  </p><p>  Log.e("app", "temp sockets not created", e);  </p><p><b>  }  </b></p>

75、<p><b>  }     </b></p><p>  public void run(){  </p><p>  byte[] buff = new byte[1024];  </p>

76、<p>  int len=0;//讀數(shù)據(jù)需不斷監(jiān)聽,寫不需要  </p><p>  while(true){  </p><p><b>  try {  </b></p><p>  len = inStream.read(bu

77、ff);  </p><p>  //把讀取到的數(shù)據(jù)發(fā)送給UI進行顯示  </p><p>  Message msg = handler.obtainMessage(BluetoothChat.MESSAGE_READ,len, -1, buff);  </p>&

78、lt;p>  msg.sendToTarget();  </p><p>  } catch (IOException e) {  </p><p>  Log.e("app", "disconnected", e);  &l

79、t;/p><p>  connectionLost();   //失去連接  </p><p>  start();    //重新啟動服務器  </p><p><b>  break;  </b></p>

80、<p><b>  }  </b></p><p><b>  }  </b></p><p><b>  }  </b></p><p>  public void write(byte[] bu

81、ffer) {  </p><p><b>  try {  </b></p><p>  outStream.write(buffer);  </p><p>  // Share the sent message 

82、;back to the UI Activity  </p><p>  handler.obtainMessage(BluetoothChat.MESSAGE_WRITE, -1, -1, buffer).sendToTarget();  </p><p>  } ca

83、tch (IOException e) {  </p><p>  Log.e("app", "Exception during write", e);  </p><p><b>  }  </b>

84、</p><p><b>  }  </b></p><p>  public void cancel() {  </p><p><b>  try {  </b></p><p>  socket

85、.close();  </p><p>  } catch (IOException e) {  </p><p>  Log.e("app", "close() of connect socket failed",

86、60;e);</p><p><b>  }  </b></p><p><b>  }  </b></p><p><b>  }  </b></p><p><b>  (3)數(shù)據(jù)查詢</b>

87、</p><p>  query=(ImageButton)findViewById(R.id.query);</p><p>  query.setOnClickListener(this);</p><p>  listview = (ListView) findViewById(R.id.listView);</p><p>  db=

88、new DataBaseCreat(MainActivity.this);</p><p>  db.open(); </p><p>  begin_date=(EditText)findViewById(R.id.begin_date);</p><p>  end_date=(EditText)findViewById(R.id.end_date);</

89、p><p>  yue=(Button)findViewById(R.id.yue);</p><p>  zhou=(Button)findViewById(R.id.zhou);</p><p>  ri=(Button)findViewById(R.id.ri);</p><p>  yue.setOnClickListener(new O

90、nClickListener() {</p><p><b>  @Override</b></p><p>  public void onClick(View v) {</p><p>  // TODO Auto-generated method stub</p><p>  QUERY_METHOD=0;<

91、/p><p><b>  }</b></p><p><b>  });</b></p><p>  zhou.setOnClickListener(new OnClickListener() {</p><p><b>  @Override</b></p><

92、;p>  public void onClick(View v) {</p><p>  // TODO Auto-generated method stub</p><p>  QUERY_METHOD=1;</p><p><b>  }</b></p><p><b>  });</b>

93、</p><p>  ri.setOnClickListener(new OnClickListener() {</p><p><b>  @Override</b></p><p>  public void onClick(View v) {</p><p>  // TODO Auto-generated met

94、hod stub</p><p>  QUERY_METHOD=2;</p><p><b>  }</b></p><p><b>  });</b></p><p><b>  }</b></p><p><b>  @Override&l

95、t;/b></p><p>  public void onClick(View v) {</p><p>  // TODO Auto-generated method stub</p><p>  switch (v.getId()) {</p><p>  case R.id.query:</p><p>

96、  if(TextUtils.isEmpty(begin_date.getText()) || TextUtils.isEmpty(end_date.getText()))</p><p><b>  {</b></p><p>  Toast.makeText(MainActivity.this, "輸入時間為空,請檢查", Toast.LENG

97、TH_SHORT).show();</p><p><b>  break;</b></p><p><b>  }</b></p><p>  Toast.makeText(MainActivity.this, "查詢中,請稍后", Toast.LENGTH_SHORT).show();</p&

98、gt;<p>  ArrayList<HashMap<String, Object>> temp = new ArrayList<HashMap<String,Object>>();</p><p>  temp=db.getAllContact(QUERY_METHOD,name,datebegin, dateend);</p><

99、;p>  SimpleAdapter myAdapter = null;</p><p>  switch (QUERY_METHOD) {</p><p><b>  case 0:</b></p><p>  myAdapter = new SimpleAdapter(this,temp,R.layout.item0,</p&g

100、t;<p>  new String[]{"user_name","year", "month","total"},</p><p>  new int[] {R.id.user_name0,R.id.year0,R.id.month0,R.id.total0} </p><p><b&g

101、t;  );</b></p><p><b>  break;</b></p><p><b>  case 1:</b></p><p>  myAdapter = new SimpleAdapter(this,temp,R.layout.item1,</p><p>  new St

102、ring[]{"user_name","weekofyear","total"},</p><p>  new int[] {R.id.user_name1,R.id.weekofyear1,R.id.total1} </p><p><b>  );</b></p><p><

103、;b>  break;</b></p><p><b>  case 2:</b></p><p>  myAdapter = new SimpleAdapter(this,temp,R.layout.item2,</p><p>  new String[]{"user_name","year&

104、quot;, "month","day","total"},</p><p>  new int[] {R.id.user_name2,R.id.year2,R.id.month2,R.id.day2,R.id.total2} </p><p><b>  );</b></p><p&g

105、t;<b>  break;</b></p><p><b>  default:</b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  listview.setAdapter(myAdapt

106、er);</p><p><b>  Break;</b></p><p><b>  default:</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b&

107、gt;  }</b></p><p>  軟件件調(diào)試過程和結果</p><p>  由于我只負責軟件部分,硬件部分由終端同學負責,需要將PCB板打出來,這里我們用電腦模仿硬件,用串口調(diào)試助手通過藍牙向外發(fā)送數(shù)據(jù),然后手機APP端接收,并通過查詢按鈕查詢出來并實時顯示電流數(shù)據(jù),電壓數(shù)據(jù),轉(zhuǎn)速數(shù)據(jù)和總電量,下面是我們的測試示意圖:</p><p><b

108、>  藍牙搜索界面:</b></p><p><b>  接收數(shù)據(jù)顯示界面:</b></p><p><b>  按天查詢界面:</b></p><p><b>  按周查詢:</b></p><p><b>  按月查詢:</b><

109、;/p><p>  測試結果表明,各功能均能正常實現(xiàn)。</p><p><b>  課程總結</b></p><p>  本學期為期一周的嵌入式課程設計在不知不覺中結束了,雖說這次課程設計時間不是很長,但是感覺自己收獲頗豐,不僅學習到了一些新知識,回顧了以前的一些快要遺忘的知識點,而且使自己的學習目標更加明確,學習方法更加完善,也體會到軟件開發(fā)的趣

110、味,更加清楚地認識到了自己在軟件開發(fā)及學習上的一些不足之處。</p><p>  感謝這個互聯(lián)網(wǎng)發(fā)達的時代,在網(wǎng)上基本都能找到自己想要的資料,在設計開發(fā)過程中遇到很多問題,首先就是安卓開發(fā)軟件的熟悉和java語言的學習,這個過程,我用了大概兩周的時間,在上網(wǎng)查閱相關資料和請教師兄的情況下,基本做到了具有實現(xiàn)基本開發(fā)的能力,然后就是藍牙通信的問題,這個問題也困擾了好長時間,因為我之前沒有接觸過這方面的東西,所有就問

111、了周圍的師兄,最終在師兄的指導下完成了藍牙通信,剩下的問題就是軟件功能的開發(fā)了,這個是主要工作量,我大部分都是通過上網(wǎng)找資料,花了大量的時間,最終設計出符合要求的軟件,值得一提的是中間數(shù)據(jù)存儲也花了不少時間,數(shù)據(jù)庫的建立并不容易,數(shù)據(jù)的查詢其實是主要問題,這個問題的解決最終標志著我完成了最后的任務。</p><p>  此次實訓最大的收獲不是我學習到了多少知識而是這幾天實訓給我的感悟:首先是心態(tài)。一定要有一個積極

112、的心態(tài),獨立解決問題的意識,培養(yǎng)扎實基礎的認識。不要什么東西都感覺跟簡單(很多東西可能是看似簡單)就不去做了或者不屑一做,以至于性網(wǎng)上搜搜就可以了,這樣很不好。有自己的東西有自己的付出才會有程序運行成功時的喜悅和小自豪,這樣也有助于培養(yǎng)自己的興趣。要時刻牢記態(tài)度決定一切。其次是興趣,感覺學習工作中興趣很關鍵,只是一個引發(fā)人積極性的問題,有了興趣就自覺了,效率自然就高了。再次要敢于嘗試和挑戰(zhàn)。不要安于現(xiàn)成的程序,而且不要害怕失敗,在程序調(diào)

113、試的過程中這點尤為重要,“發(fā)現(xiàn)出問題然后解決問題”是一個積累經(jīng)驗的過程,而且很高效。最后要不懈追求。對于源代碼進行不斷的完善,要盡可能的實現(xiàn)課題所要求的功能。對于初學者或者開發(fā)較少的人來說,大量大寫程序還是有必要的,但同時要注意思考,理解其實現(xiàn)的內(nèi)在意義。還可以自己添加一些有意義的功能來實現(xiàn)。當看到自己編寫的程序正常運行時,興趣也會隨之而來,樂此不疲,形成一個良性循環(huán)。</p><p>  短短一學期的實訓課很快

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論