日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

光照信息屏

更新時(shí)間:

實(shí)驗(yàn)整體介紹

背景

光照傳感器用于檢測光照強(qiáng)度,其工作原理是將檢測光照強(qiáng)度值并將其轉(zhuǎn)化為電壓值,目前在智能家居,智慧城市,智慧農(nóng)業(yè),智慧工廠等物聯(lián)網(wǎng)領(lǐng)域被大量使用。 本實(shí)驗(yàn)的主要結(jié)果是通過I2C總線控制光強(qiáng)度傳感器AP3216C對(duì)環(huán)境光強(qiáng)度及物體接近情況進(jìn)行測量并獲取環(huán)境光強(qiáng)度及是否有物體靠近,然后通過OLED顯示屏將讀取到的光強(qiáng)度、接近程度、紅外信息顯示在HaaS EDU K1的屏幕上。 HaaS EDU K1搭載了豐富實(shí)用的傳感器,開發(fā)者可以使用這些傳感器針對(duì)實(shí)際場景需求開發(fā)自己的應(yīng)用。

涉及的知識(shí)點(diǎn)

  • AP3216C光照與接近傳感器原理

  • OLED繪圖

開發(fā)環(huán)境準(zhǔn)備

硬件

開發(fā)用電腦一臺(tái)
HAAS EDU K1 開發(fā)板一塊
USB2TypeC 數(shù)據(jù)線一根

軟件

開發(fā)環(huán)境的搭建請(qǐng)參考《AliOS Things集成開發(fā)環(huán)境使用說明之搭建開發(fā)環(huán)境》,其中詳細(xì)的介紹了AliOS Things 3.3的IDE集成開發(fā)環(huán)境的搭建流程。

本案例的代碼下載請(qǐng)參考《AliOS Things集成開發(fā)環(huán)境使用說明之創(chuàng)建工程》

> 選擇解決方案:“HaaS EDU K1教育開發(fā)案例合集”

> 選擇開發(fā)板:haaseduk1 board configure

-- 編譯固件可參考《AliOS Things集成開發(fā)環(huán)境使用說明之編譯固件》

-- 燒錄固件可參考《AliOS Things集成開發(fā)環(huán)境使用說明之燒錄固件》

代碼編譯、燒錄

參考 @ref HaaS_EDU_K1_Quick_Start(3.1 編譯工程章節(jié)),點(diǎn)擊 ? 即可完成編譯固件。
參考 @ref HaaS_EDU_K1_Quick_Start(3.2 燒錄鏡像章節(jié)),點(diǎn)擊 "??" 即可完成燒錄固件。

上手把玩

實(shí)驗(yàn)運(yùn)行結(jié)果如下:

  1. 室內(nèi)自然燈光下:

  1. 用手機(jī)閃光燈照射屏幕上方的透明孔位

  1. 屏幕前沒有遮擋情況下

  1. 拿物體靠近屏幕上方的透明孔位

實(shí)際應(yīng)用場景(產(chǎn)品)介紹

目前光強(qiáng)度傳感器及接近傳感器在以下日常生活、工業(yè)生產(chǎn)等環(huán)境中都有非常廣泛的應(yīng)用。

  • 家庭智能燈系統(tǒng)

  • 檢測到光強(qiáng)度低于一定亮度之后,觸發(fā)信號(hào)控制客廳自動(dòng)開燈

  • 檢測到光強(qiáng)度低于一定亮度之后,有人體靠近則自動(dòng)打開夜燈/燈帶

  • 智能路燈

  • 智慧路燈安裝光強(qiáng)度傳感器后可以自動(dòng)的感知環(huán)境強(qiáng)度,從而做到智能開關(guān),保證交通安全的同時(shí)節(jié)省了系統(tǒng)能源

  • 智能手機(jī)/平板/電視等

  • 智能手機(jī)、平板、電視等消費(fèi)類電子需要感知環(huán)境光溫度并根據(jù)環(huán)境光溫度自動(dòng)調(diào)節(jié)屏幕亮度,給使用者最佳的視覺體驗(yàn)的同時(shí)也降低了系統(tǒng)的功耗

  • 智能手機(jī)上都存在的距離傳感器還可以在通話過程中檢測到聽筒靠近頭部的時(shí)候自動(dòng)熄滅屏幕,防止誤觸碰

  • 智能手機(jī)還會(huì)用距離傳感器與其它感應(yīng)器實(shí)現(xiàn)反轉(zhuǎn)手機(jī)靜音及解鎖/鎖屏等操作

這些是我們?nèi)粘I钪凶畛R姷膸讉€(gè)應(yīng)用場景。 光強(qiáng)度傳感器是一種光電傳感器,光電傳感器擁有更廣泛的應(yīng)用范圍,比如煙霧報(bào)警系統(tǒng)、工廠煙塵檢測系統(tǒng)、條形碼掃描儀、產(chǎn)品計(jì)數(shù)器、轉(zhuǎn)速檢測系統(tǒng)等等。

硬件介紹

電路原理圖

AP3216芯片位于屏幕上方,是通過OLED擴(kuò)展接口和HaaS EDU K1主板連接,最終連接到HaaS1000的I2C1通道。

AP3216C傳感器

AP3216C外觀

AP3216C芯片特性

  • 7-bit地址模式,地址:0x1E

  • 支持I2C接口Fast Mode (400kbps)

  • 支持多種連續(xù)測量/單次測量及光強(qiáng)度、接近指標(biāo)單獨(dú)測試及組合測試

  • 內(nèi)置溫度補(bǔ)償電路

  • 工作溫度范圍:-30°C到+80°C

  • 光強(qiáng)度傳感器 16-bit有效線性輸出 4種動(dòng)態(tài)可選范圍

  • 接近傳感器 10-bit有效線性輸出

AP3216C內(nèi)部框圖

AP3216C主要包含如下幾部分。

  1. 光亮度敏感元件

  2. 接近度敏感元件

  3. ADC數(shù)模轉(zhuǎn)換模塊

  4. 內(nèi)部邏輯控制電路(包含條件觸發(fā)中斷功能)

  5. I2C總線控制器

  6. 紅外LED發(fā)射二極管

AP3216C工作模式

根據(jù)AP3216C的datasheet說明,在正常工作時(shí),它共有3種工作模式:

  1. ALS模式 在這種模式下,AP3216C只對(duì)光強(qiáng)度進(jìn)行量測

  2. PS+IR模式 在這種模式下,AP3216C只對(duì)接近程度進(jìn)行量測

  3. ALS+PS+IR模式 在這種模式下,AP3216C會(huì)同時(shí)對(duì)光強(qiáng)度及接近程度進(jìn)行量測

三種模式均支持單次量測也支持循環(huán)量測,其量測穩(wěn)定時(shí)間如下:

AP3216C中斷模式

AP3216C提供中斷檢測功能,MCU可以設(shè)定ALS及PS中斷觸發(fā)門限及持續(xù)時(shí)間閾值。在環(huán)境亮度及接近程度到達(dá)門限值后持續(xù)時(shí)間超出持續(xù)時(shí)間閾值之后,會(huì)向INT管腳發(fā)送中斷通知MCU進(jìn)行處理。 本案例中未使用中斷模式。

AP3216C工作流程

AP3216C的典型工作流程如下:

對(duì)AP3226C進(jìn)行復(fù)位之后,設(shè)定工作模式(連續(xù)/單次測量,ALS/PS/IR組合設(shè)定),之后等待硬件測量穩(wěn)定時(shí)間,再發(fā)起讀取測量值的過程。 其中,復(fù)位及模式設(shè)定是對(duì)AP3216C的System Configuration寄存器進(jìn)行操作,datasheet中對(duì)System Configuration寄存器定義及描述如下:

  • 復(fù)位操作 參考datasheet的描述,是通過I2C 向地址為0x00的寄存器寫入0x4(對(duì)應(yīng)二進(jìn)制的100)。

  • 模式設(shè)定 ALS only連續(xù)測量模式:是通過I2C 向地址為0x00的寄存器寫入0x4(對(duì)應(yīng)二進(jìn)制的100)。 PS/IR only連續(xù)測量模式:是通過I2C 向地址為0x00的寄存器寫入0x1(對(duì)應(yīng)二進(jìn)制的001)。 ALS+PS/IR連續(xù)測量模式:是通過I2C 向地址為0x00的寄存器寫入0x2(對(duì)應(yīng)二進(jìn)制的010)。 ALS only單次測量模式:是通過I2C 向地址為0x00的寄存器寫入0x5(對(duì)應(yīng)二進(jìn)制的101)。 PS/IR only單次測量模式:是通過I2C 向地址為0x00的寄存器寫入0x6(對(duì)應(yīng)二進(jìn)制的110)。 ALS+PS/IR單次測量模式:是通過I2C 向地址為0x00的寄存器寫入0x7(對(duì)應(yīng)二進(jìn)制的111)。

  • 讀取測量結(jié)果 ALS、PS、IR值可以通過如下寄存器的值來獲取。寄存器地址及所讀取數(shù)值詳細(xì)解析方法請(qǐng)參考下表:

ALS光強(qiáng)度解析

通過讀取ALS數(shù)據(jù)寄存器(0x0C和0x0D)得到16bit的ADC count數(shù)據(jù)之后,需要根據(jù)ALS Configuration寄存器的ALS Gain欄位將ADC count數(shù)據(jù)根據(jù)芯片手冊(cè)的說明轉(zhuǎn)換成以lux為單位的亮度值。如下圖所示:

PS/IR數(shù)據(jù)解析

PS Data寄存器詳細(xì)定義如下:

  • PS 有效位數(shù)為10bit。

  • OBJ bit在有物體靠近的時(shí)候被設(shè)置成1,否則設(shè)置為0。

  • IR_OF bit被設(shè)置成1代表PS值無效(高強(qiáng)度紅外光的情況下會(huì)出現(xiàn))

IR數(shù)據(jù)有效位數(shù)同樣為10bit,也有一個(gè)IR_OF來標(biāo)識(shí)IR/PS數(shù)據(jù)是否有效。

AP3216C判斷物體靠近和遠(yuǎn)離的動(dòng)作是通過兩組PS 高低閾值寄存器和PS Data寄存器進(jìn)行比對(duì),PS Data高于PS High Threshold之后,則判定為物體遠(yuǎn)離;PS Data低于PS Low Threshold之后,則視為物體靠近。

  • PS Low Threshold計(jì)算方法:Value(Reg_0x2B) * 4 + Value(Reg_0x2A)

  • PS High Threshold計(jì)算方法:Value(Reg_0x2D) * 4 + Value(Reg_0x2C)

PS中斷模式說明

在開啟了AP3216C的中斷模式,為了避免靠近物體抖動(dòng)帶來頻繁觸發(fā)中斷的情況,在PS Data高于PS High Threashold或低于PS Low Threshold之后,需要等待一個(gè)PS persist時(shí)間,如果PS persist時(shí)間之內(nèi),PS Data狀態(tài)沒有發(fā)生變化,則觸發(fā)中斷。

PS Persist的時(shí)間可以通過配置PS Configuration寄存器的bit 0:1。

I2C總線技術(shù)

HaaS EDU K1上AP3216C和HaaS1000通過I2C1接口進(jìn)行通信。 I2C總線是飛利浦公司在80年代為了讓CPU可以連接低速周邊設(shè)備而設(shè)計(jì)的。外接傳感器是I2C總線最典型的應(yīng)用場景。目前I2C Spec已經(jīng)發(fā)展到了6.0版本。可以通過https://www.nxp.com.cn/docs/en/user-guide/UM10204.pdf 進(jìn)行下載 I2C采用多主從結(jié)構(gòu),I2C主設(shè)備基于地址對(duì)I2C從設(shè)備進(jìn)行尋址,采用8-bit數(shù)據(jù)傳輸模式,支持7-bit/10-bit地址模式。I2C總線對(duì)I2C傳輸開始/結(jié)束/數(shù)據(jù)傳輸/ACK機(jī)制/時(shí)鐘同步/沖突仲裁等進(jìn)行了詳細(xì)的定義。這里就不再贅述。

軟件介紹

HaaS EDU K1的edk_demo 應(yīng)用程序中包含多個(gè)應(yīng)用案例,所有的案例軟件設(shè)計(jì)都遵循HaaS EDK應(yīng)用架構(gòu)的設(shè)計(jì)思想。其設(shè)計(jì)思想可以參考“HaaS EDK主系統(tǒng)框架”中的“添加新應(yīng)用”小節(jié)的說明。 簡單來說,所有的子應(yīng)用頁面都需要實(shí)現(xiàn)MENU_TYP結(jié)構(gòu)體。 光照信息屏應(yīng)用代碼位于:solutions/eduk1_demo/k1_apps/lightmeter/lightmeter.c中。

MENU_TYP lightmeter = {
    "lightmeter",
    &lightmeter_cover,
    &lightmeter_tasks,
    NULL,
    &lightmeter_child_list};

在HaaS EDU K1上電之后,按K1或K2鍵左右切換應(yīng)用的時(shí)候,如果切換到光照信息屏頁面再到退出該頁面的過程中,lightmeter下面的API會(huì)依此被呼叫:

  1. lightmeter_init

  2. lightmeter_uninit

軟件流程

軟件流程圖如下所示。 在進(jìn)入光照信息屏頁面后,啟動(dòng)名為lightmeter_task的task,周期性的讀取ALS/PS/IR數(shù)據(jù)并判斷物體靠近標(biāo)志之后將相關(guān)數(shù)據(jù)按照一定的規(guī)則打印到OLED屏幕上。

代碼實(shí)現(xiàn)

光照信息屏頁面

代碼位置:solutions/eduk1_demo/k1_apps/lightmeter/lightmeter.c 詳細(xì)代碼及注釋如下:

#include <stdio.h>
#include <stdlib.h>
#include "lightmeter.h"
#include "aos/kernel.h"
#include "ap3216c.h"

/* 按照主程序框架的規(guī)則,聲明頁面相關(guān)信息(封面、初始化、反初始化、子頁面等)*/
MENU_COVER_TYP lightmeter_cover = {MENU_COVER_NONE};
MENU_TASK_TYP lightmeter_tasks = {
    lightmeter_init,
    lightmeter_uninit};
MENU_LIST_TYP lightmeter_child_list = {NULL, 0};
MENU_TYP lightmeter = {
    "lightmeter",
    &lightmeter_cover,
    &lightmeter_tasks,
    NULL,
    &lightmeter_child_list};

/* 頁面初始化函數(shù) */
int lightmeter_init(void)
{
    printf("lightmeter_init begin\n");
    /* AP3216C 初始化函數(shù) */
    ap3216c_init();
    printf("lightmeter_init done\n");

    /* 清空OLED屏幕 */
    OLED_Clear();
    OLED_Refresh_GRAM();
    
    /* 啟動(dòng)光照信息屏主任務(wù) */
    aos_task_new("lightmeter_task", lightmeter_task, NULL, 1000);
    printf("aos_task_new lightmeter_task \n");
    return 0;
}

void lightmeter_task(void)
{
    uint16_t tmp[3];
    uint8_t als[20];
    uint8_t ps[20];
    uint8_t ir[20];

    while (1)
    {
        /* 從AP3216C讀取ALS、PS、IR數(shù)據(jù) */
        tmp[0] = ap3216c_read_ambient_light();
        tmp[1] = ap3216c_read_ir_data();
        tmp[2] = ap3216c_read_ps_data();

        /* 打印ALS/IR信息字串 */
        sprintf(als, "ALS: %d", tmp[0]);
        sprintf(ir, "IR : %d", tmp[1]);

        /* 將lightmeter圖標(biāo)及ALS/IR信息輸出到屏幕 */
        OLED_Clear();
        OLED_Icon_Draw(20, 14, &icon_lighter_32_32, 0);
        OLED_Show_String(64, 6, als, 12, 1);
        OLED_Show_String(64, 20, ir, 12, 1);

        /* 判斷是否有物體靠近,并顯示在屏幕上 */
        if ((tmp[2] >> 15) & 1)
            OLED_Show_String(64, 36, "near !", 16, 1);
        else
            OLED_Show_String(64, 40, "far !", 16, 1);

        /* 將左右按鍵標(biāo)志輸出到屏幕上 */
        OLED_Icon_Draw(2, 24, &icon_skip_left, 0);
        OLED_Icon_Draw(122, 24, &icon_skip_right, 0);
        
        /* 刷新屏幕數(shù)據(jù) */
        OLED_Refresh_GRAM();
        
        /* 休眠150ms */
        aos_msleep(150);
    }
}

/* 光照信息屏頁面退出處理函數(shù) */
int lightmeter_uninit(void)
{
    /* 刪除光照信息屏主任務(wù) */
    aos_task_delete("lightmeter_task");
    printf("aos_task_delete lightmeter_task \n");
    return 0;
}

AP3216C驅(qū)動(dòng)

代碼位置:components/peripherals/sensor/drv/drv_als_ps_ir_liteon_ap3216c.c 以ap3216C初始化和讀取ALS數(shù)值為例,詳細(xì)代碼及注釋如下:

/**
 * This function initializes ap3216c registered device driver
 *
 * @param no
 *
 * @return the ap3216c device.
 */
void ap3216c_init(void)
{
    /**
    1. ap3216c連接到HaaS edu k1的I2C1端口, 所以i2c_dev的端口好需要設(shè)定為1
    2. ap3216c為7-bit地址模式
    3. haas1000芯片內(nèi)部的I2C1作為主模式, ap3216c作為從設(shè)備
    4. ap3216c外設(shè)定制用AP3216C_ADDR聲明
    */
#if 1
    i2c_dev.port                 = 1;
    i2c_dev.config.address_width = I2C_HAL_ADDRESS_WIDTH_7BIT;
    i2c_dev.config.freq          = I2C_BUS_BIT_RATES_100K;
    i2c_dev.config.mode          = I2C_MODE_MASTER;
    i2c_dev.config.dev_addr      = AP3216C_ADDR;
    /* 呼叫hal_i2c_init對(duì)haas1000內(nèi)部的I2C1控制器進(jìn)行初始化 */
    hal_i2c_init(&i2c_dev);
#endif
    /* 復(fù)位ap3216c芯片, 向system configuration寄存器寫入0x0對(duì)其進(jìn)行軟件復(fù)位 */
    reset_sensor();
    /* 等待ap3216c復(fù)位穩(wěn)定時(shí)間 */
    aos_msleep(100);
    /* 設(shè)置ap3216c工作在連續(xù)量測ALS/PS/IR模式 */
    ap3216c_set_param(AP3216C_SYSTEM_MODE, AP3216C_MODE_ALS_AND_PS);
    /* 休眠150ms等待量測到穩(wěn)定值 */
    aos_msleep(150); // delay at least  150ms

    /* 配置中斷腳和中斷數(shù)據(jù) - 函數(shù)內(nèi)部實(shí)現(xiàn)置空        */
    ap3216c_int_Config();
    ap3216c_int_init();
}
/**
 * This function reads light by ap3216c sensor measurement
 *
 * @param no
 *
 * @return the ambient light converted to float data.
 */
uint16_t ap3216c_read_ambient_light(void)
{
    uint16_t brightness = 0; // default error data
    uint16_t read_data;
    uint8_t range;

    /*分別讀取 0x0c和0x0d的值,組成16-bit的ALS ADC count */
    read_data  = (uint16_t )read_low_and_high(AP3216C_ALS_DATA_L_REG, 1);
    /* 讀取ALS range 配置 */
    ap3216c_get_param(AP3216C_ALS_RANGE, &range);
    /* 根據(jù)ALS range 配置,完成從ADC count到lux的換算 */
    if (range == AP3216C_ALS_RANGE_20661)
    {
        brightness = 0.36 * read_data; //sensor ambient light converse to reality
    }
    else if (range == AP3216C_ALS_RANGE_5162)
    {
        brightness = 0.089 * read_data; //sensor ambient light converse to reality
    }
    else if (range == AP3216C_ALS_RANGE_1291)
    {
        brightness = 0.022 * read_data; //sensor ambient light converse to reality
    }
    else if (range == AP3216C_ALS_RANGE_323)
    {
        brightness = 0.0056 * read_data; //sensor ambient light converse to reality
    }
    return brightness;
}

/**
 * This function is convenient to getting data except including high and low data for this sensor.
 * note:after reading lower register first,reading higher add one.
 */
 /* 讀取從reg開始的兩個(gè)字節(jié), 并對(duì)數(shù)據(jù)進(jìn)行合并*/
static uint32_t read_low_and_high(uint8_t reg, uint8_t len)
{
    uint32_t data;
    uint8_t buf = 0;

    read_regs( reg, len, &buf);        // 讀低字節(jié)
    data = buf;
    read_regs( reg + 1, len, &buf);    // 讀高字節(jié)
    data = data + (buf << len * 8);    // 合并數(shù)據(jù)

    return data;
}

/* 讀寄存器的值 */
static void read_regs(uint8_t reg, uint8_t len, uint8_t *buf)
{  
    hal_i2c_mem_read(&i2c_dev, i2c_dev.config.dev_addr, reg, 1, buf, len, 100);
}

這里的hal_i2c_mem_read的實(shí)現(xiàn)和AP3216C datasheet上面讀取寄存器的描述相匹配。

  • MCU I2C 主設(shè)備先將寄存器地址通過I2C寫操作發(fā)給AP3216C從設(shè)備

  • MCUI2C 主設(shè)備發(fā)起讀操作從AP3216C從設(shè)備讀取寄存器的值 AP3216C寄存器讀取的整個(gè)I2C傳輸過程中,詳細(xì)數(shù)據(jù)傳輸過程如下圖所示:

讀取AP3216C的PS和IR寄存器的過程和讀取ALS的過程中I2C的傳輸過程完全一致,這里就不再贅述。