找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
樓主: eagler8
打印 上一主題 下一主題
收起左側(cè)

【Arduino】108種傳感器模塊系列實(shí)驗(yàn)(資料+代碼+圖形+仿真)

  [復(fù)制鏈接]
1281#
ID:513258 發(fā)表于 2019-7-24 15:15 | 只看該作者

回復(fù)

使用道具 舉報(bào)

1282#
ID:513258 發(fā)表于 2019-7-24 15:19 | 只看該作者
使用說明
1. 感應(yīng)模塊通電后有一分鐘左右的初始化時(shí)間,在此期間模塊會(huì)間隔地輸出 0-3 次,一分鐘后進(jìn)入待機(jī)狀態(tài)。
2. 應(yīng)盡量避免燈光等干擾源近距離直射模塊表面的透鏡,以免引進(jìn)干擾信號(hào)產(chǎn)生誤動(dòng)作; 使用環(huán)境盡量避免流動(dòng)的風(fēng),風(fēng)也會(huì)對(duì)感應(yīng)器造成干擾。
3. 感應(yīng)模塊采用雙元探頭,探頭的窗口為長方形,雙元(A 元 B 元)位于較長方向的兩 端,當(dāng)人體從左到右或從右到左走過時(shí),紅外光譜到達(dá)雙元的時(shí)間、距離有差值,差值越 大,感應(yīng)越靈敏,當(dāng)人體從正面走向探頭或從上到下或從下到上方向走過時(shí),雙元檢測不 到紅外光譜距離的變化,無差值,因此感應(yīng)不靈敏或不工作;所以安裝感應(yīng)器時(shí)應(yīng)使探頭 雙元的方向與人體活動(dòng)最多的方向盡量相平行,保證人體經(jīng)過時(shí)先后被探頭雙元所感應(yīng)。 為了增加感應(yīng)角度范圍,本模塊采用圓形透鏡,也使得探頭四面都感應(yīng),但左右兩側(cè)仍然 比上下兩個(gè)方向感應(yīng)范圍大、靈敏度強(qiáng),安裝時(shí)仍須盡量按以上要求。




回復(fù)

使用道具 舉報(bào)

1283#
ID:513258 發(fā)表于 2019-7-24 16:03 | 只看該作者

回復(fù)

使用道具 舉報(bào)

1284#
ID:513258 發(fā)表于 2019-7-24 16:06 | 只看該作者
注意事項(xiàng)
1、直流工作電壓必須符合我們要求的數(shù)值,過高和過低都會(huì)影響模塊性能,而且要求電源必須經(jīng)過良好的穩(wěn)壓濾波,例如電腦USB電源、手機(jī)充電器電源、比較舊的9V的層疊電池都無法滿足模塊工作要求,建議客戶用變壓器的電源并經(jīng)過三端穩(wěn)壓芯片穩(wěn)壓后再通過220UF和0.1UF的電容濾波后供電。
2、調(diào)試時(shí)人體盡量遠(yuǎn)離感應(yīng)區(qū)域,有時(shí)雖然人體不在模塊的正前方,但是人體離模塊太近時(shí)模塊也能感應(yīng)到造成一直有輸出,還有調(diào)試時(shí)人體不要觸摸電路部分也會(huì)影響模塊工作,比較科學(xué)的辦法是將輸出端接一個(gè)LED或者是萬用表,把模塊用報(bào)紙蓋住,人離開這個(gè)房間,等2分鐘后看看模塊是否還是一直有輸出?
3、模塊不接負(fù)載時(shí)能正常工作,接上負(fù)載后工作紊亂,一種原因是因?yàn)殡娫慈萘亢苄∝?fù)載比較耗電,負(fù)載工作時(shí)引起的電壓波動(dòng)導(dǎo)致模塊誤動(dòng)作,另一種原因是負(fù)載得電工作時(shí)會(huì)產(chǎn)生干擾,例如繼電器或者電磁鐵等感性負(fù)載會(huì)產(chǎn)生反向電動(dòng)勢(shì),315M發(fā)射板工作時(shí)會(huì)有電磁輻射等都會(huì)影響模塊。解決辦法如下:A、電源部分加電感濾波。B、采用負(fù)載和模塊使用不同的電壓的方法,例如:負(fù)載使用24V工作電壓,模塊使用12V工作電壓,其間用三端穩(wěn)壓器隔離。C: 使用更大容量的電源。
4、人體感應(yīng)模塊只能工作在室內(nèi)并且工作環(huán)境應(yīng)該避免陽光、強(qiáng)烈燈光直接照射,如果工作環(huán)境有強(qiáng)大的射頻干擾,可以采用屏蔽措施。若遇有強(qiáng)烈氣流干擾,關(guān)閉門窗或阻止對(duì)流。感應(yīng)區(qū)盡量避免正對(duì)著發(fā)熱電器和物體以及容易被風(fēng)吹動(dòng)的雜物和衣物。
5、人體感應(yīng)模塊建議安裝在密封的盒里,否則可能一直會(huì)有輸出信號(hào)。
6、如果要求人體感應(yīng)模塊的探測角度小于90度時(shí),可以用不透明膠紙遮擋鏡片或裁剪縮小鏡片來實(shí)現(xiàn)。
7、人體感應(yīng)模塊采用雙元探頭,人體的手腳和頭部運(yùn)動(dòng)方向與感應(yīng)靈敏度有著密切的聯(lián)系,而且紅外模塊的特性決定了無法精確控制感應(yīng)距離。
8、模塊中的探頭(PIR)可以裝焊在電路板的另一面。也可將探頭用雙芯屏蔽線延長,長度應(yīng)在20厘米以內(nèi)為好。




回復(fù)

使用道具 舉報(bào)

1285#
ID:513258 發(fā)表于 2019-7-24 16:28 | 只看該作者
  1. /*
  2. 【Arduino】66種傳感器模塊系列實(shí)驗(yàn)(65)
  3. 實(shí)驗(yàn)六十七:HC-SR501 熱釋電人體紅外感應(yīng)傳感器模塊
  4. 程序一,簡單測試串口開關(guān)量
  5. */

  6. int Sensor= 7;

  7. void setup()
  8. {
  9.    Serial.begin(9600);
  10.    pinMode(Sensor, INPUT);
  11. }

  12. void loop()
  13. {
  14.    int SensorState = digitalRead(Sensor);
  15.    Serial.println(SensorState);
  16.    delay(100);      
  17. }
復(fù)制代碼


回復(fù)

使用道具 舉報(bào)

1286#
ID:513258 發(fā)表于 2019-7-24 16:32 | 只看該作者
當(dāng)有檢測到人體運(yùn)動(dòng),輸出1,否則輸出0。




回復(fù)

使用道具 舉報(bào)

1287#
ID:513258 發(fā)表于 2019-7-24 16:49 | 只看該作者
  1. /*
  2. 【Arduino】66種傳感器模塊系列實(shí)驗(yàn)(65)
  3. 實(shí)驗(yàn)六十七:HC-SR501 熱釋電人體紅外感應(yīng)傳感器模塊
  4. 程序二,在傳感器前移動(dòng)時(shí),Arduino 上的 LED 燈會(huì)亮
  5. */

  6. int ledPin = 13;
  7. int pirPin = 7;

  8. int pirValue;
  9. int sec = 0;

  10. void setup()
  11. {
  12.     pinMode(ledPin, OUTPUT);
  13.     pinMode(pirPin, INPUT);

  14.     digitalWrite(ledPin, LOW);
  15.     Serial.begin(9600);
  16. }

  17. void loop()
  18. {
  19.     pirValue = digitalRead(pirPin);
  20.     digitalWrite(ledPin, pirValue);
  21.    
  22.     sec += 1;
  23.     Serial.print("Second: ");
  24.     Serial.print(sec);
  25.     Serial.print("PIR value: ");
  26.     Serial.print(pirValue);
  27.     Serial.print('\n');
  28.     delay(1000);
  29. }
復(fù)制代碼


回復(fù)

使用道具 舉報(bào)

1288#
ID:513258 發(fā)表于 2019-7-24 16:51 | 只看該作者

回復(fù)

使用道具 舉報(bào)

1289#
ID:513258 發(fā)表于 2019-7-24 17:54 | 只看該作者

回復(fù)

使用道具 舉報(bào)

1290#
ID:513258 發(fā)表于 2019-7-24 17:56 | 只看該作者
注意事項(xiàng)
1、直流工作電壓必須符合我們要求的數(shù)值,過高和過低都會(huì)影響模塊性能,而且要求電源必須經(jīng)過良好的穩(wěn)壓濾波,例如電腦USB電源、手機(jī)充電器電源、比較舊的9V的層疊電池都無法滿足模塊工作要求,建議客戶用變壓器的電源并經(jīng)過三端穩(wěn)壓芯片穩(wěn)壓后再通過220UF和0.1UF的電容濾波后供電。
2、調(diào)試時(shí)人體盡量遠(yuǎn)離感應(yīng)區(qū)域,有時(shí)雖然人體不在模塊的正前方,但是人體離模塊太近時(shí)模塊也能感應(yīng)到造成一直有輸出,還有調(diào)試時(shí)人體不要觸摸電路部分也會(huì)影響模塊工作,比較科學(xué)的辦法是將輸出端接一個(gè)LED或者是萬用表,把模塊用報(bào)紙蓋住,人離開這個(gè)房間,等2分鐘后看看模塊是否還是一直有輸出?
3、模塊不接負(fù)載時(shí)能正常工作,接上負(fù)載后工作紊亂,一種原因是因?yàn)殡娫慈萘亢苄∝?fù)載比較耗電,負(fù)載工作時(shí)引起的電壓波動(dòng)導(dǎo)致模塊誤動(dòng)作,另一種原因是負(fù)載得電工作時(shí)會(huì)產(chǎn)生干擾,例如繼電器或者電磁鐵等感性負(fù)載會(huì)產(chǎn)生反向電動(dòng)勢(shì),315M發(fā)射板工作時(shí)會(huì)有電磁輻射等都會(huì)影響模塊。解決辦法如下:A、電源部分加電感濾波。B、采用負(fù)載和模塊使用不同的電壓的方法,例如:負(fù)載使用24V工作電壓,模塊使用12V工作電壓,其間用三端穩(wěn)壓器隔離。C: 使用更大容量的電源。
4、人體感應(yīng)模塊只能工作在室內(nèi)并且工作環(huán)境應(yīng)該避免陽光、強(qiáng)烈燈光直接照射,如果工作環(huán)境有強(qiáng)大的射頻干擾,可以采用屏蔽措施。若遇有強(qiáng)烈氣流干擾,關(guān)閉門窗或阻止對(duì)流。感應(yīng)區(qū)盡量避免正對(duì)著發(fā)熱電器和物體以及容易被風(fēng)吹動(dòng)的雜物和衣物。
5、人體感應(yīng)模塊建議安裝在密封的盒里,否則可能一直會(huì)有輸出信號(hào)。
6、如果要求人體感應(yīng)模塊的探測角度小于90度時(shí),可以用不透明膠紙遮擋鏡片或裁剪縮小鏡片來實(shí)現(xiàn)。
7、人體感應(yīng)模塊采用雙元探頭,人體的手腳和頭部運(yùn)動(dòng)方向與感應(yīng)靈敏度有著密切的聯(lián)系,而且紅外模塊的特性決定了無法精確控制感應(yīng)距離。
8、模塊中的探頭(PIR)可以裝焊在電路板的另一面。也可將探頭用雙芯屏蔽線延長,長度應(yīng)在20厘米以內(nèi)為好。




回復(fù)

使用道具 舉報(bào)

1291#
ID:513258 發(fā)表于 2019-7-24 18:03 | 只看該作者

回復(fù)

使用道具 舉報(bào)

1292#
ID:513258 發(fā)表于 2019-7-24 18:16 | 只看該作者

回復(fù)

使用道具 舉報(bào)

1293#
ID:513258 發(fā)表于 2019-7-24 18:18 | 只看該作者

回復(fù)

使用道具 舉報(bào)

1294#
ID:513258 發(fā)表于 2019-7-24 18:20 | 只看該作者

回復(fù)

使用道具 舉報(bào)

1295#
ID:513258 發(fā)表于 2019-7-24 18:57 | 只看該作者
實(shí)驗(yàn)六十八:BMP180 新款 BOSCH溫度模塊氣壓傳感器(代替BMP085)

BMP180
BMP180是博世Sensortec的新數(shù)字氣壓傳感器,具有很高的性能,使應(yīng)用先進(jìn)的移動(dòng)設(shè)備,如智能手機(jī)、平板電腦和體育設(shè)備。它遵循了BMP085帶來了很多改進(jìn),像小尺寸和數(shù)字接口的擴(kuò)張。超低功耗降至3μA使BMP180節(jié)電為您的移動(dòng)設(shè)備的領(lǐng)導(dǎo)者。BMP180也是杰出的非常穩(wěn)定的性能,最好有獨(dú)立電源供電。BMP180是一款高精度、小體積、超低能耗的壓力傳感器,可以應(yīng)用在移動(dòng)設(shè)備中它的性能卓越,絕對(duì)精度最低可以達(dá)到0.03hPa,并且耗電極低,只有3μA。BMP180采用強(qiáng)大的8-pin陶瓷無引線芯片承載(LCC)超薄封裝,可以通過I2C總線直接與各種微處理器相連。




回復(fù)

使用道具 舉報(bào)

1296#
ID:513258 發(fā)表于 2019-7-24 20:26 | 只看該作者

回復(fù)

使用道具 舉報(bào)

1297#
ID:513258 發(fā)表于 2019-7-24 20:34 | 只看該作者

回復(fù)

使用道具 舉報(bào)

1298#
ID:513258 發(fā)表于 2019-7-24 20:37 | 只看該作者
主要特點(diǎn)
壓力范圍:300~1100hPa(海拔9000米~-500米)
電源電壓:1.8V~3.6V(VDDA),1.62V~3.6V(VDDD) VIN需要5V
LCC8封裝:無鉛陶瓷載體封裝(LCC)
低功耗:5μA,在標(biāo)準(zhǔn)模式
高精度:低功耗模式下,分辨率為0.06hPa(0.5米)
高線性模式下,分辨率為0.03hPa(0.25米)
含溫度輸出
I2C接口
溫度補(bǔ)償
無鉛,符合RoHS規(guī)范
MSL 1反應(yīng)時(shí)間:7.5ms
待機(jī)電流:0.1μA
無需外部時(shí)鐘電路



回復(fù)

使用道具 舉報(bào)

1299#
ID:513258 發(fā)表于 2019-7-24 20:49 | 只看該作者
技術(shù)數(shù)據(jù)
壓力范圍300……1100 hPa
均方根噪聲中表達(dá)壓力0.06 hPa typ。(超低功耗模式)
0.02 hPa typ。(超高分辨率模式)
均方根噪聲中表達(dá)高度0.5 m,typ。(超低功耗模式)
0.17米,typ。(超高分辨率模式)
相對(duì)精度的壓力
VDD = 3.3 v 950……1050 hPa / hPa±0.12
@ 25°C / m±1.0
700年……900 hPa / hPa±0.12
25…40°C / m±1.0
絕對(duì)精度
p = 300…1100 hpa
(溫度= 0…+ 65°C,VDD = 3.3。-4.0 V)壓力:……+ 2.0 hPa
溫度:±1°C,typ。
平均電流消耗(1 Hz刷新率數(shù)據(jù))
峰值電流3μA典型(超低功耗模式)
32μA,典型的(高級(jí)模式)
650μA,典型的
待機(jī)電流1.62……3.6 V
電源電壓vddio 1.62……3.6 V
電源電壓vdd 1.8……3.6 V
操作溫度。
范圍全面準(zhǔn)確”40…+ 85°C
0…+ 65°C
conv壓力。5毫秒,典型的(標(biāo)準(zhǔn)模式)
I2C傳輸速率3.4 MHz,馬克斯。




回復(fù)

使用道具 舉報(bào)

1300#
ID:513258 發(fā)表于 2019-7-24 21:00 | 只看該作者
典型應(yīng)用
GPS精準(zhǔn)導(dǎo)航(航位推算,上下橋檢測等)
室內(nèi)室外導(dǎo)航
休閑、體育和醫(yī)療健康等監(jiān)測
天氣預(yù)報(bào)
垂直速度指示(上升/下沉速度)
風(fēng)扇功率控制
體育設(shè)備,如高度剖面




回復(fù)

使用道具 舉報(bào)

1301#
ID:513258 發(fā)表于 2019-7-24 21:03 | 只看該作者
BMP180 新款 BOSCH溫度模塊氣壓傳感器



回復(fù)

使用道具 舉報(bào)

1302#
ID:513258 發(fā)表于 2019-7-25 06:32 | 只看該作者
BMP180氣壓模塊是一款高精度、小體積、低能耗的壓力傳感器,可以應(yīng)用在移動(dòng)設(shè)備中,它的性能卓越,絕對(duì)精度最低可以達(dá)到0.03hPa,并且耗電極低,只有3μA。BMP180采用強(qiáng)大的8-pin陶瓷無引線芯片承載(LCC)超薄封裝,可以通過I2C總線直接與各種微處理器相連。



回復(fù)

使用道具 舉報(bào)

1303#
ID:513258 發(fā)表于 2019-7-25 06:35 | 只看該作者
特性曲線



回復(fù)

使用道具 舉報(bào)

1304#
ID:513258 發(fā)表于 2019-7-25 07:27 | 只看該作者
模塊電原理圖



回復(fù)

使用道具 舉報(bào)

1305#
ID:513258 發(fā)表于 2019-7-25 07:33 | 只看該作者

回復(fù)

使用道具 舉報(bào)

1306#
ID:513258 發(fā)表于 2019-7-25 07:52 | 只看該作者

回復(fù)

使用道具 舉報(bào)

1307#
ID:513258 發(fā)表于 2019-7-25 08:06 | 只看該作者
需要用的 “SFE_BMP180” 庫文件如下
SFE_BMP180.h
  1. /*
  2. 【Arduino】66種傳感器模塊系列實(shí)驗(yàn)(68)
  3. 實(shí)驗(yàn)六十八:BMP180 新款 BOSCH溫度模塊氣壓傳感器(代替BMP085)
  4. SFE_BMP180.h
  5. */

  6. #ifndef SFE_BMP180_h
  7. #define SFE_BMP180_h

  8. #if defined(ARDUINO) && ARDUINO >= 100
  9. #include "Arduino.h"
  10. #else
  11. #include "WProgram.h"
  12. #endif

  13. class SFE_BMP180
  14. {
  15.     public:
  16.         SFE_BMP180();

  17.         char begin();
  18.             shorted?)
  19.         
  20.         char startTemperature(void);
  21.            
  22.         char getTemperature(double &T);
  23.             startTemperature command
  24.             
  25.         char startPressure(char oversampling);
  26.             
  27.         char getPressure(double &P, double &T);
  28.             startPressure command           

  29.         double sealevel(double P, double A);
  30.            weather data)
  31.            
  32.         double altitude(double P, double P0);
  33.            sea-level, runway, etc.)
  34.             
  35.         char getError(void);
  36.             
  37.     private:
  38.    
  39.         char readInt(char address, int16_t &value);
  40.            
  41.         char readUInt(char address, uint16_t &value);
  42.          
  43.         char readBytes(unsigned char *values, char length);
  44.             
  45.             
  46.         char writeBytes(unsigned char *values, char length);
  47.             subsequent registers)
  48.             
  49.         int16_t AC1,AC2,AC3,VB1,VB2,MB,MC,MD;
  50.         uint16_t AC4,AC5,AC6;
  51.         double c5,c6,mc,md,x0,x1,x2,y0,y1,y2,p0,p1,p2;
  52.         char _error;
  53. };

  54. #define BMP180_ADDR 0x77

  55. #define BMP180_REG_CONTROL 0xF4
  56. #define BMP180_REG_RESULT 0xF6

  57. #define BMP180_COMMAND_TEMPERATURE 0x2E
  58. #define BMP180_COMMAND_PRESSURE0 0x34
  59. #define BMP180_COMMAND_PRESSURE1 0x74
  60. #define BMP180_COMMAND_PRESSURE2 0xB4
  61. #define BMP180_COMMAND_PRESSURE3 0xF4
復(fù)制代碼




回復(fù)

使用道具 舉報(bào)

1308#
ID:513258 發(fā)表于 2019-7-25 08:18 | 只看該作者
SFE_BMP180.cp
  1. /*
  2. 【Arduino】66種傳感器模塊系列實(shí)驗(yàn)(68)
  3. 實(shí)驗(yàn)六十八:BMP180 新款 BOSCH溫度模塊氣壓傳感器(代替BMP085)
  4. SFE_BMP180.cp
  5. */

  6. #include <SFE_BMP180.h>
  7. #include <Wire.h>
  8. #include <stdio.h>
  9. #include <math.h>

  10. SFE_BMP180::SFE_BMP180()
  11. {
  12. }

  13. char SFE_BMP180::begin()

  14. {
  15.     double c3,c4,b1;
  16.    
  17.     Wire.begin();

  18.     if (readInt(0xAA,AC1) &&
  19.         readInt(0xAC,AC2) &&
  20.         readInt(0xAE,AC3) &&
  21.         readUInt(0xB0,AC4) &&
  22.         readUInt(0xB2,AC5) &&
  23.         readUInt(0xB4,AC6) &&
  24.         readInt(0xB6,VB1) &&
  25.         readInt(0xB8,VB2) &&
  26.         readInt(0xBA,MB) &&
  27.         readInt(0xBC,MC) &&
  28.         readInt(0xBE,MD))
  29.     {

  30. AC6 = 23153;
  31.         
  32. Calcs.pdf
  33.         
  34. 25671; AC6 = 18974;

  35.         c3 = 160.0 * pow(2,-15) * AC3;
  36.         c4 = pow(10,-3) * pow(2,-15) * AC4;
  37.         b1 = pow(160,2) * pow(2,-30) * VB1;
  38.         c5 = (pow(2,-15) / 160) * AC5;
  39.         c6 = AC6;
  40.         mc = (pow(2,11) / pow(160,2)) * MC;
  41.         md = MD / 160.0;
  42.         x0 = AC1;
  43.         x1 = 160.0 * pow(2,-13) * AC2;
  44.         x2 = pow(160,2) * pow(2,-25) * VB2;
  45.         y0 = c4 * pow(2,15);
  46.         y1 = c4 * c3;
  47.         y2 = c4 * b1;
  48.         p0 = (3791.0 - 8.0) / 1600.0;
  49.         p1 = 1.0 - 7357.0 * pow(2,-20);
  50.         p2 = 3038.0 * 100.0 * pow(2,-36);

  51.         return(1);
  52.     }
  53.     else
  54.     {
  55.       
  56.         return(0);
  57.     }
  58. }

  59. char SFE_BMP180::readInt(char address, int16_t &value)

  60. {
  61.     unsigned char data[2];

  62.     data[0] = address;
  63.     if (readBytes(data,2))
  64.     {
  65.         value = (int16_t)((data[0]<<8)|data[1]);
  66.         
  67. negative
  68.         return(1);
  69.     }
  70.     value = 0;
  71.     return(0);
  72. }

  73. char SFE_BMP180::readUInt(char address, uint16_t &value)

  74. {
  75.     unsigned char data[2];

  76.     data[0] = address;
  77.     if (readBytes(data,2))
  78.     {
  79.         value = (((uint16_t)data[0]<<8)|(uint16_t)data[1]);
  80.         return(1);
  81.     }
  82.     value = 0;
  83.     return(0);
  84. }

  85. char SFE_BMP180::readBytes(unsigned char *values, char length)

  86. {
  87.     char x;

  88.     Wire.beginTransmission(BMP180_ADDR);
  89.     Wire.write(values[0]);
  90.     _error = Wire.endTransmission();
  91.     if (_error == 0)
  92.     {
  93.         Wire.requestFrom(BMP180_ADDR,length);
  94.         while(Wire.available() != length) ;
  95.         for(x=0;x<length;x++)
  96.         {
  97.             values[x] = Wire.read();
  98.         }
  99.         return(1);
  100.     }
  101.     return(0);
  102. }

  103. char SFE_BMP180::writeBytes(unsigned char *values, char length)

  104. {
  105.     char x;
  106.    
  107.     Wire.beginTransmission(BMP180_ADDR);
  108.     Wire.write(values,length);
  109.     _error = Wire.endTransmission();
  110.     if (_error == 0)
  111.         return(1);
  112.     else
  113.         return(0);
  114. }

  115. char SFE_BMP180::startTemperature(void)

  116. {
  117.     unsigned char data[2], result;
  118.    
  119.     data[0] = BMP180_REG_CONTROL;
  120.     data[1] = BMP180_COMMAND_TEMPERATURE;
  121.     result = writeBytes(data, 2);
  122.     if (result)
  123.         return(5);
  124.     else
  125.         return(0);
  126. }

  127. char SFE_BMP180::getTemperature(double &T)

  128. {
  129.     unsigned char data[2];
  130.     char result;
  131.     double tu, a;
  132.    
  133.     data[0] = BMP180_REG_RESULT;

  134.     result = readBytes(data, 2);
  135.     if (result)
  136.     {
  137.         tu = (data[0] * 256.0) + data[1];
  138.         
  139.         a = c5 * (tu - c6);
  140.         T = a + (mc / (a + md));

  141.     }
  142.     return(result);
  143. }


  144. char SFE_BMP180::startPressure(char oversampling)

  145. {
  146.     unsigned char data[2], result, delay;
  147.    
  148.     data[0] = BMP180_REG_CONTROL;

  149.     switch (oversampling)
  150.     {
  151.         case 0:
  152.             data[1] = BMP180_COMMAND_PRESSURE0;
  153.             delay = 5;
  154.         break;
  155.         case 1:
  156.             data[1] = BMP180_COMMAND_PRESSURE1;
  157.             delay = 8;
  158.         break;
  159.         case 2:
  160.             data[1] = BMP180_COMMAND_PRESSURE2;
  161.             delay = 14;
  162.         break;
  163.         case 3:
  164.             data[1] = BMP180_COMMAND_PRESSURE3;
  165.             delay = 26;
  166.         break;
  167.         default:
  168.             data[1] = BMP180_COMMAND_PRESSURE0;
  169.             delay = 5;
  170.         break;
  171.     }
  172.     result = writeBytes(data, 2);
  173.     if (result)
  174.         return(delay);
  175.     else
  176.         return(0);
  177. }


  178. char SFE_BMP180::getPressure(double &P, double &T)

  179. sealevel().
  180. {
  181.     unsigned char data[3];
  182.     char result;
  183.     double pu,s,x,y,z;
  184.    
  185.     data[0] = BMP180_REG_RESULT;

  186.     result = readBytes(data, 3);
  187.     if (result)
  188.     {
  189.         pu = (data[0] * 256.0) + data[1] + (data[2]/256.0);
  190.         
  191.         s = T - 25.0;
  192.         x = (x2 * pow(s,2)) + (x1 * s) + x0;
  193.         y = (y2 * pow(s,2)) + (y1 * s) + y0;
  194.         z = (pu - x) / y;
  195.         P = (p2 * pow(z,2)) + (p1 * z) + p0;

  196.     }
  197.     return(result);
  198. }


  199. double SFE_BMP180::sealevel(double P, double A)

  200. {
  201.     return(P/pow(1-(A/44330.0),5.255));
  202. }

  203. double SFE_BMP180::altitude(double P, double P0)

  204. {
  205.     return(44330.0*(1-pow(P/P0,1/5.255)));
  206. }


  207. char SFE_BMP180::getError(void)
  208.    
  209. {
  210.     return(_error);
  211. }

復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

1309#
ID:513258 發(fā)表于 2019-7-25 08:37 | 只看該作者
接線方式
1.先連接芯片與單片機(jī)(通過I2C接口),按照如下方式連接
5V—VIN
GND–GND
A5—SCL
A4—SDA
2.然后UNO通過usb與PC電腦連接
3.拷貝后面的代碼燒錄進(jìn)Arduino




回復(fù)

使用道具 舉報(bào)

1310#
ID:513258 發(fā)表于 2019-7-25 11:04 | 只看該作者
  1. /*
  2. 【Arduino】66種傳感器模塊系列實(shí)驗(yàn)(68)
  3. 實(shí)驗(yàn)六十八:BMP180 新款 BOSCH溫度模塊氣壓傳感器(代替BMP085)
  4. 程序之一
  5. */

  6. #include <SFE_BMP180.h>

  7. SFE_BMP180 AirPresure;
  8. char presureDelayTime;
  9. double presureP, presureT;

  10. void setup() {
  11.   Serial.begin(9600);
  12.   AirPresure.begin();
  13. }

  14. void loop()
  15. {
  16.   presureDelayTime = AirPresure.startPressure(3);
  17.   if (presureDelayTime != 0)
  18.   {
  19.     delay(presureDelayTime);
  20.     presureDelayTime = AirPresure.getPressure(presureP, presureT);
  21.     if (presureDelayTime != 0)
  22.     {
  23.       
  24.       Serial.print("Current Preasure: ");
  25.       Serial.print(presureP);
  26.       Serial.println(" bar");

  27.       Serial.print(presureP);
  28.       Serial.print(" bar is");
  29.       Serial.print(presureP / 1000.0);
  30.       Serial.println(" atm");
  31.     }
  32.     else
  33.     {
  34.       Serial.println("ERROR");
  35.     }
  36.   }
  37.   else
  38.   {
  39.     Serial.println("ERROR");
  40.   }
  41.   delay(1000);
  42. }
復(fù)制代碼


回復(fù)

使用道具 舉報(bào)

1311#
ID:513258 發(fā)表于 2019-7-25 11:12 | 只看該作者

回復(fù)

使用道具 舉報(bào)

1312#
ID:513258 發(fā)表于 2019-7-25 11:50 | 只看該作者
  1. /*
  2. 【Arduino】66種傳感器模塊系列實(shí)驗(yàn)(68)
  3. 實(shí)驗(yàn)六十八:BMP180 新款 BOSCH溫度模塊氣壓傳感器(代替BMP085)
  4. 程序之二,氣溫、氣壓與海拔值可以調(diào)整并校準(zhǔn)
  5. */

  6. #include <Wire.h>
  7. #define BMP180ADD 0x77   
  8.                                  
  9. unsigned char OSS;                           

  10. int ac1;           
  11. int ac2;           
  12. int ac3;           
  13. unsigned int ac4;  
  14. unsigned int ac5;  
  15. unsigned int ac6;  
  16. int b1;            
  17. int b2;            
  18. int mb;            
  19. int mc;            
  20. int md;            
  21. float temperature;  
  22. double pressure;   
  23. double pressure2;
  24. long b5;         
  25. double altitude;  



  26. void setup()
  27. {
  28.   Serial.begin(9600);
  29.   Wire.begin();
  30.   OSS = 2;  
  31.   BMP180start();
  32. }

  33. void loop()
  34. {
  35.   calculate();
  36.   show();
  37.   delay(1000);
  38. }

  39. void calculate()
  40. {
  41.   temperature = bmp180GetTemperature(bmp180ReadUT());
  42.   temperature = temperature*0.0137;
  43.   pressure = bmp180GetPressure(bmp180ReadUP());
  44.   pressure2 = pressure/115325;
  45.   pressure2 = pow(pressure2,0.29029496);
  46.   altitude = 39*(1+pressure2);                           
  47. }


  48. void show()
  49. {
  50.   Serial.print("氣溫: ");
  51.   Serial.print(temperature, 1);                           
  52.   Serial.println(" C");
  53.   Serial.print("氣壓: ");
  54.   Serial.print(pressure, 0);                              
  55.   Serial.println(" Pa");
  56.   Serial.print("海拔:");
  57.   Serial.print(altitude);
  58.   Serial.println("m");
  59. }

  60. void BMP180start()
  61. {                     
  62.   ac1 = bmp180ReadDate(0xAA);                     
  63.   ac2 = bmp180ReadDate(0xAC);  
  64.   ac3 = bmp180ReadDate(0xAE);  
  65.   ac4 = bmp180ReadDate(0xB0);  
  66.   ac5 = bmp180ReadDate(0xB2);  
  67.   ac6 = bmp180ReadDate(0xB4);  
  68.   b1  = bmp180ReadDate(0xB6);  
  69.   b2  = bmp180ReadDate(0xB8);  
  70.   mb  = bmp180ReadDate(0xBA);  
  71.   mc  = bmp180ReadDate(0xBC);  
  72.   md  = bmp180ReadDate(0xBE);
  73. }

  74. short bmp180GetTemperature(unsigned int ut)
  75. {
  76.   long x1, x2;
  77.   x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;  
  78.   x2 = ((long)mc << 11)/(x1 + md);               
  79.   b5 = x1 + x2;                                   
  80.   return ((b5 + 8)>>4);                           
  81. }

  82. long bmp180GetPressure(unsigned long up)
  83. {
  84.   long x1, x2, x3, b3, b6, p;
  85.   unsigned long b4, b7;
  86.   
  87.   b6 = b5 - 4000;

  88.   x1 = (b2 * (b6 * b6)>>12)>>11;
  89.   x2 = (ac2 * b6)>>11;
  90.   x3 = x1 + x2;
  91.   b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;
  92.   
  93.   x1 = (ac3 * b6)>>13;
  94.   x2 = (b1 * ((b6 * b6)>>12))>>16;
  95.   x3 = ((x1 + x2) + 2)>>2;
  96.   b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;
  97.   
  98.   b7 = ((unsigned long)(up - b3) * (50000>>OSS));
  99.   if (b7 < 0x80000000)
  100.     p = (b7<<1)/b4;
  101.   else
  102.     p = (b7/b4)<<1;
  103.    
  104.   x1 = (p>>8) * (p>>8);
  105.   x1 = (x1 * 3038)>>16;
  106.   x2 = (-7357 * p)>>16;
  107.   p += (x1 + x2 + 3791)>>4;
  108.   
  109.   return p;
  110. }

  111. int bmp180Read(unsigned char address)
  112. {
  113.   unsigned char data;
  114.   
  115.   Wire.beginTransmission(BMP180ADD);
  116.   Wire.write(address);
  117.   Wire.endTransmission();
  118.   
  119.   Wire.requestFrom(BMP180ADD, 1);
  120.   while(!Wire.available());
  121.    
  122.   return Wire.read();
  123. }

  124. int bmp180ReadDate(unsigned char address)
  125. {
  126.   unsigned char msb, lsb;
  127.   Wire.beginTransmission(BMP180ADD);
  128.   Wire.write(address);
  129.   Wire.endTransmission();
  130.   Wire.requestFrom(BMP180ADD, 2);
  131.   while(Wire.available()<2);
  132.   msb = Wire.read();
  133.   lsb = Wire.read();
  134.   return (int) msb<<8 | lsb;
  135. }

  136. unsigned int bmp180ReadUT()
  137. {
  138.   unsigned int ut;
  139.   Wire.beginTransmission(BMP180ADD);
  140.   Wire.write(0xF4);                       
  141.   Wire.write(0x2E);                       
  142.   Wire.endTransmission();  
  143.   delay(5);                              
  144.   ut = bmp180ReadDate(0xF6);               
  145.   return ut;
  146. }

  147. unsigned long bmp180ReadUP()
  148. {
  149.   unsigned char msb, lsb, xlsb;
  150.   unsigned long up = 0;
  151.   
  152.   Wire.beginTransmission(BMP180ADD);
  153.   Wire.write(0xF4);                        
  154.   Wire.write(0x34 + (OSS<<6));            
  155.   Wire.endTransmission();
  156.   delay(2 + (3<<OSS));                     
  157.   
  158.   Wire.beginTransmission(BMP180ADD);
  159.   Wire.write(0xF6);                        
  160.   Wire.endTransmission();
  161.   
  162.   Wire.requestFrom(BMP180ADD, 3);
  163.   while(Wire.available() < 3);            
  164.   msb = Wire.read();
  165.   lsb = Wire.read();
  166.   xlsb = Wire.read();
  167.   up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);//16 to 19 bit
  168.   return up;
  169. }

復(fù)制代碼


回復(fù)

使用道具 舉報(bào)

1313#
ID:513258 發(fā)表于 2019-7-25 11:52 | 只看該作者

回復(fù)

使用道具 舉報(bào)

1314#
ID:513258 發(fā)表于 2019-7-25 12:13 | 只看該作者
  1. /*
  2. 【Arduino】66種傳感器模塊系列實(shí)驗(yàn)(68)
  3. 實(shí)驗(yàn)六十八:BMP180 新款 BOSCH溫度模塊氣壓傳感器(代替BMP085)
  4. 程序之三,溫度、實(shí)時(shí)氣壓、已知海拔計(jì)算的海平面的氣壓、已知海平面氣壓計(jì)算的高度
  5. 只是算法有點(diǎn)爛,做做實(shí)驗(yàn)而已
  6. */

  7. #include <SFE_BMP180.h>
  8. #include <Wire.h>

  9. SFE_BMP180 pressure;

  10. #define ALTITUDE 255.0

  11. unsigned long gpstimes;

  12. void setup()
  13. {
  14. Serial.begin(9600);

  15. pressure.begin();

  16. }

  17. void loop()
  18. {
  19. gpstimes=millis();

  20. char status;
  21. double T,P,p0,a;

  22. status = pressure.startTemperature();
  23. delay(status);
  24. status = pressure.getTemperature(T);
  25. delay(status);

  26. Serial.print("temperature: ");
  27. Serial.print(T,2);
  28. Serial.println(" deg C, ");



  29. status = pressure.startPressure(3);
  30. delay(status);

  31. status = pressure.getPressure(P,T);

  32. // Print out the measurement:
  33. Serial.print("absolute pressure A: ");
  34. Serial.print(P,2);
  35. Serial.println(" mb, ");

  36. p0=1013.2;

  37. a = pressure.altitude(P,p0);
  38. Serial.print("computed altitude A: ");
  39. Serial.print(a,0);
  40. Serial.println(" meters, ");

  41. T=25.00;
  42. status = pressure.getPressure(P,T);

  43. Serial.print("absolute pressure B: ");
  44. Serial.print(P,2);
  45. Serial.println(" mb, ");

  46. p0=1013.2;

  47. a = pressure.altitude(P,p0);
  48. Serial.print("computed altitude B: ");
  49. Serial.print(a,0);
  50. Serial.println(" meters, ");

  51. gpstimes=millis()-gpstimes;
  52. Serial.print("gpstimes=");
  53. Serial.println(gpstimes);
  54. Serial.println();
  55. delay(2000);
  56. }
復(fù)制代碼


回復(fù)

使用道具 舉報(bào)

1315#
ID:513258 發(fā)表于 2019-7-25 12:52 | 只看該作者

回復(fù)

使用道具 舉報(bào)

1316#
ID:513258 發(fā)表于 2019-7-25 13:47 | 只看該作者
實(shí)驗(yàn)六十九: AT24C256 I2C接口 EEPROM 存儲(chǔ)模塊 IIC

AT24C256
是ATMEL公司256kbit串行電可擦的可編程只讀存儲(chǔ)器,8引腳雙排直插式封裝,具有結(jié)構(gòu)緊湊、存儲(chǔ)容量大等特點(diǎn),可以在2線總線上并接4片該IC,特別適用于具有高容量數(shù)據(jù)儲(chǔ)存要求的數(shù)據(jù)采集系統(tǒng)。AT24C256采用SOP-8封裝。




回復(fù)

使用道具 舉報(bào)

1317#
ID:513258 發(fā)表于 2019-7-25 14:28 | 只看該作者
芯片參數(shù)
芯片有3種工作電壓;
  5.0V(VCC=4.5V~5.5V)
  2.7V(VCC=2.7V~5.5V)
  1.8V(VCC=1.8V~3.6V)
特性:
  內(nèi)部可以組成32k×8存儲(chǔ)單元
  2線串行接口
  斯密特觸發(fā),濾波輸入抑制噪聲
  雙向數(shù)據(jù)傳送協(xié)議
  硬件寫保護(hù)引腳和軟件數(shù)據(jù)保護(hù)功能
  具有64字節(jié)頁寫模式




回復(fù)

使用道具 舉報(bào)

1318#
ID:513258 發(fā)表于 2019-7-25 14:30 | 只看該作者

回復(fù)

使用道具 舉報(bào)

1319#
ID:513258 發(fā)表于 2019-7-25 14:45 | 只看該作者
A0、A1:地址選擇輸入端。在串行總線結(jié)構(gòu)中,可以連接4個(gè)AT24C256IC。用A0、A1來區(qū)分各IC。A0、A1懸空時(shí)為0。
SCL:串行時(shí)鐘輸入。上升沿將SDA上的數(shù)據(jù)寫入存儲(chǔ)器,下降沿從存儲(chǔ)器讀出數(shù)據(jù)送SDA上。
SDA:雙向串行數(shù)據(jù)輸入輸出口。用于存儲(chǔ)器與單片機(jī)之間的數(shù)據(jù)交換。
WP:寫保護(hù)輸入。此引腳與地相連時(shí),允許寫操作;與VCC相連時(shí),所有的寫存儲(chǔ)器操作被禁止。如果不連,芯片內(nèi)部下拉到地。
VCC:電源。
GND:地。
NC:空。




回復(fù)

使用道具 舉報(bào)

1320#
ID:513258 發(fā)表于 2019-7-25 15:20 | 只看該作者
AT24C256的工作原理
AT24C256內(nèi)部有512頁,每一頁為64字節(jié),任一單元的地址為15位。地址范圍0000H~7FFFH。
芯片工作狀態(tài)
1)時(shí)鐘和數(shù)據(jù)傳送
一般情況下,SDA被外部的設(shè)備拉到高,只有當(dāng)SCL為低電平時(shí),SDA上的數(shù)據(jù)變化,表示要傳送數(shù)據(jù)。SCL為高時(shí)SDA變化表示狀態(tài)變化。
2)開始狀態(tài)(START)
當(dāng)SCL為高時(shí),SDA由高到低表示數(shù)據(jù)傳送開始,這一狀態(tài)必須在所有命令之前。
3)結(jié)束狀態(tài)(STOP)
當(dāng)SCL為高時(shí),SDA由低到高表示數(shù)據(jù)傳送結(jié)束狀態(tài)。
4)應(yīng)答狀態(tài)(ACK)
所有的地址和數(shù)據(jù)都是以8位的形式串行傳送給存儲(chǔ)器或從存儲(chǔ)器讀出的。存儲(chǔ)器在第9個(gè)時(shí)鐘周期SDA發(fā)零信號(hào)表示已經(jīng)收到8位數(shù)據(jù)。見圖總線協(xié)議圖。



回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表