Arduino和C51開發光敏傳感器


技術:51單片機、Arduino、光敏傳感器、PCF8591、AD/DA轉換
 

概述

本文介紹了如何接收傳感器的模擬信號和如何使用PCF8591 AD/DA轉換模塊對光敏傳感器的模擬信號進行轉換。講述了51單片機和Arduino如何讀取模擬信號,並通過串口實時顯示出來。

詳細

一、光敏傳感器

1545624326555030055.png光敏傳感器是利用光敏元件將光信號轉換為電信號的傳感器,它的敏感波長在可見光波長附近,包括紅外線波長和紫外線波長。光傳感器不只局限於對光的探測,它還可以作為探測元件組成其他傳感器,對許多非電量進行檢測,只要將這些非電量轉換為光信號的變化即可。光敏傳感器中最簡單的電子器件是光敏電阻,它能感應光線的明暗變化,輸出微弱的電信號,通過簡單電子線路放大處理,可以控制LED燈具的自動開關。

 

模塊使用說明

 

  • 光敏電阻模塊對環境光線最敏感,一般用來檢測周圍環境的光線的亮度,觸發單片機或繼電器模塊等;

  • 模塊在環境光線亮度達不到設定閾值時,DO 端輸出高電平,當外界環境光線亮度超過設定閾值時,DO端輸出低電平;

  • DO 輸出端可以與單片機直接相連,通過單片機來檢測高低電平,由此來檢測環境的光線亮度改變;

  • 小板模擬量輸出 AO 可以和 AD 模塊相連,通過 AD 轉換,可以獲得環境光強更精准的數值.

二、C51單片機串口顯示光照強度

光敏傳感器的AO引腳輸出的是模擬信號,而51單片機內部沒有AD/DA轉換器,不能接收模擬信號,只能接收到數字信號,所以我們需要一個能夠進行AD/DA轉換的模塊,這里我選擇了PCF8591模塊來進行AD轉換。

1545625014533085926.pngPCF8591是一個單片集成、單獨供電、低功耗、8-bit CMOS數據獲取器件。PCF8591 具有 4 個模擬輸入、1 個模擬輸出和 1個串行 I2C 總線接口。PCF8591 的 3 個地址引腳 A0, A1 和 A2 可用於硬件地址編程,允許在同個 I2C 總線上接入8個PCF8591 器件,而無需額外的硬件。在 PCF8591 器件上輸入輸出的地址、控制和數據信號都是通過雙線雙向 I2C 總線以串行的方式進行傳輸。(簡單的說:可以實現4路 模擬輸入,1路模擬輸出,具體功能看模塊使用說明)

硬件連接: 圖片3.png

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();
    }
}

打開串口調試助手,獲取光照強度值:

1545625249470004185.png

三、Arduino串口顯示光照強度

Arduino內部有AD/DA轉換器,所以接收模擬信號會變得非常容易操作。

硬件連接: 圖片5.png

代碼如下:

#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
}

 

串口讀取到的光照強度值如下圖:

1545625406996032991.png

四、總結

本文實現51單片機和Arduino串口顯示光照強度,介紹了光敏傳感器和PCF8591 AD/DA轉換模塊的使用方法,如果你對模擬信號和數字信號還不怎么了解,我建議你先去學下。學完了這個,建議去讀取其他傳感器的模擬信號,具體實現方法是一樣的。

五、項目結構圖

圖片7.png

注:本文著作權歸作者,由demo大師發表,拒絕轉載,轉載需要作者授權


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM