概述
詳細
一、光敏傳感器
光敏傳感器是利用光敏元件將光信號轉換為電信號的傳感器,它的敏感波長在可見光波長附近,包括紅外線波長和紫外線波長。光傳感器不只局限於對光的探測,它還可以作為探測元件組成其他傳感器,對許多非電量進行檢測,只要將這些非電量轉換為光信號的變化即可。光敏傳感器中最簡單的電子器件是光敏電阻,它能感應光線的明暗變化,輸出微弱的電信號,通過簡單電子線路放大處理,可以控制LED燈具的自動開關。
模塊使用說明
-
光敏電阻模塊對環境光線最敏感,一般用來檢測周圍環境的光線的亮度,觸發單片機或繼電器模塊等;
-
模塊在環境光線亮度達不到設定閾值時,DO 端輸出高電平,當外界環境光線亮度超過設定閾值時,DO端輸出低電平;
-
DO 輸出端可以與單片機直接相連,通過單片機來檢測高低電平,由此來檢測環境的光線亮度改變;
-
小板模擬量輸出 AO 可以和 AD 模塊相連,通過 AD 轉換,可以獲得環境光強更精准的數值.
二、C51單片機串口顯示光照強度
光敏傳感器的AO引腳輸出的是模擬信號,而51單片機內部沒有AD/DA轉換器,不能接收模擬信號,只能接收到數字信號,所以我們需要一個能夠進行AD/DA轉換的模塊,這里我選擇了PCF8591模塊來進行AD轉換。
PCF8591是一個單片集成、單獨供電、低功耗、8-bit CMOS數據獲取器件。PCF8591 具有 4 個模擬輸入、1 個模擬輸出和 1個串行 I2C 總線接口。PCF8591 的 3 個地址引腳 A0, A1 和 A2 可用於硬件地址編程,允許在同個 I2C 總線上接入8個PCF8591 器件,而無需額外的硬件。在 PCF8591 器件上輸入輸出的地址、控制和數據信號都是通過雙線雙向 I2C 總線以串行的方式進行傳輸。(簡單的說:可以實現4路 模擬輸入,1路模擬輸出,具體功能看模塊使用說明)
硬件連接:
PCF8591的使用會涉及到I2C總線,程序中也要加入對I2C的操作,Pcf8591SendByte()來選擇使用PCF8591 模塊的哪一路輸入(這里選擇AIN0)
void Pcf8591SendByte(uchar channel) { I2C_Start(); //開始I2C總線 I2C_SendByte(WRITEADDR); //發送寫器件地址 I2C_SendByte(0x40|channel); //發送控制寄存器 I2C_Stop(); } uchar Pcf8591ReadByte() //讀取值 { uchar num; I2C_Start(); I2C_SendByte(READADDR); //發送讀器件地址 num=I2C_ReadByte(); //讀取數據 I2C_Stop(); //結束總線 return num; } void main() { uint adNum; float value; UsartInit(); while(1) { Pcf8591SendByte(0); //使用通道0 (可選擇通道0-3)光敏傳感器A0連接PCF8591傳感器的AIN0 /*adNum一定是0到255之間的一個數,因為pcf8591是8位的AD/DA芯片,所以輸出的范圍為00000000 到11111111,即0到255*/ adNum=Pcf8591ReadByte(); //讀出數值 value = adNum; value=100.0 - value*100.0/255.0; //把光敏值轉換為0-100的數值,這里255.0可更改 //(根據實際測試value最暗值) printf("light:"); printf("%.2f\n",value); //打印數據到串口 delay1s(); } }
打開串口調試助手,獲取光照強度值:
三、Arduino串口顯示光照強度
Arduino內部有AD/DA轉換器,所以接收模擬信號會變得非常容易操作。
硬件連接:
代碼如下:
#define light A5 //定義模擬口A5 float Intensity = 0;//光照度數值 void setup() //初始化 { Serial.begin(9600);//設置波特率9600 } void loop()//程序主體循環 { Intensity = analogRead(light); //讀取模擬口AD5的值,存入Intensity變量 //Intensity = 100.0 - Intensity / 6.7;//VCC接3.3V時,Intensity最高為670,最低為0 Intensity = 100.0 - Intensity / 10.23;//VCC接5V時,Intensity最高為1023,最低為0 Serial.print("Intensity = "); //串口輸出"Intensity = " Serial.print(Intensity); //串口輸出Intensity變量的值 Serial.print("%\n"); delay(1000); //延時1s }
串口讀取到的光照強度值如下圖:
四、總結
本文實現51單片機和Arduino串口顯示光照強度,介紹了光敏傳感器和PCF8591 AD/DA轉換模塊的使用方法,如果你對模擬信號和數字信號還不怎么了解,我建議你先去學下。學完了這個,建議去讀取其他傳感器的模擬信號,具體實現方法是一樣的。