chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【HarmonyOS HiSpark Wi-Fi IoT 套件試用連載】驅(qū)動(dòng)AHT20并顯示溫濕度

開發(fā)板試用精選 ? 來源:開發(fā)板試用 ? 作者:電子發(fā)燒友論壇 ? 2022-10-31 14:24 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文來源電子發(fā)燒友社區(qū),作者:華仔stm32, 帖子地址:https://bbs.elecfans.com/jishu_2299452_1_1.html


在前面驅(qū)動(dòng)OLED的前提下,驅(qū)動(dòng)AHT20并顯示到顯示屏,是監(jiān)測溫濕度常用的手法。
1、在app目錄下新建i2caht20文件夾,把oled_ssd1306.c以及oled_ssd1306.h拷貝到該目錄下。
2、新建aht20.c、aht20.h,以及aht20.test.c,以及BUILD.gn三個(gè)文件。
3、aht20.c內(nèi)容如下:

/*
 * Copyright (C) 2021 HiHope Open Source Organization .
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 *
 * limitations under the License.
 */

#include "aht20.h"

#include 
#include 
#include 

#include "hi_i2c.h"
#include "hi_errno.h"

#define AHT20_I2C_IDX HI_I2C_IDX_0

#define AHT20_STARTUP_TIME     20*1000 // 上電啟動(dòng)時(shí)間
#define AHT20_CALIBRATION_TIME 40*1000 // 初始化(校準(zhǔn))時(shí)間
#define AHT20_MEASURE_TIME     75*1000 // 測量時(shí)間

#define AHT20_DEVICE_ADDR   0x38
#define AHT20_READ_ADDR     ((0x38<<1)|0x1)
#define AHT20_WRITE_ADDR    ((0x38<<1)|0x0)

#define AHT20_CMD_CALIBRATION       0xBE // 初始化(校準(zhǔn))命令
#define AHT20_CMD_CALIBRATION_ARG0  0x08
#define AHT20_CMD_CALIBRATION_ARG1  0x00

/**
 * 傳感器在采集時(shí)需要時(shí)間,主機(jī)發(fā)出測量指令(0xAC)后,延時(shí)75毫秒以上再讀取轉(zhuǎn)換后的數(shù)據(jù)并判斷返回的狀態(tài)位是否正常。
 * 若狀態(tài)比特位[Bit7]為0代表數(shù)據(jù)可正常讀取,為1時(shí)傳感器為忙狀態(tài),主機(jī)需要等待數(shù)據(jù)處理完成。
 **/
#define AHT20_CMD_TRIGGER       0xAC // 觸發(fā)測量命令
#define AHT20_CMD_TRIGGER_ARG0  0x33
#define AHT20_CMD_TRIGGER_ARG1  0x00

// 用于在無需關(guān)閉和再次打開電源的情況下,重新啟動(dòng)傳感器系統(tǒng),軟復(fù)位所需時(shí)間不超過20 毫秒
#define AHT20_CMD_RESET      0xBA // 軟復(fù)位命令

#define AHT20_CMD_STATUS     0x71 // 獲取狀態(tài)命令

/**
 * STATUS 命令回復(fù):
 * 1. 初始化后觸發(fā)測量之前,STATUS 只回復(fù) 1B 狀態(tài)值;
 * 2. 觸發(fā)測量之后,STATUS 回復(fù)6B: 1B 狀態(tài)值 + 2B 濕度 + 4b濕度 + 4b溫度 + 2B 溫度
 *      RH = Srh / 2^20 * 100%
 *      T  = St  / 2^20 * 200 - 50
 **/
#define AHT20_STATUS_BUSY_SHIFT 7       // bit[7] Busy indication
#define AHT20_STATUS_BUSY_MASK  (0x1<#define AHT20_STATUS_BUSY(status) ((status & AHT20_STATUS_BUSY_MASK) >> AHT20_STATUS_BUSY_SHIFT)

#define AHT20_STATUS_MODE_SHIFT 5       // bit[6:5] Mode Status
#define AHT20_STATUS_MODE_MASK  (0x3<#define AHT20_STATUS_MODE(status) ((status & AHT20_STATUS_MODE_MASK) >> AHT20_STATUS_MODE_SHIFT)

                                        // bit[4] Reserved
#define AHT20_STATUS_CALI_SHIFT 3       // bit[3] CAL Enable
#define AHT20_STATUS_CALI_MASK  (0x1<#define AHT20_STATUS_CALI(status) ((status & AHT20_STATUS_CALI_MASK) >> AHT20_STATUS_CALI_SHIFT)
                                        // bit[2:0] Reserved

#define AHT20_STATUS_RESPONSE_MAX 6

#define AHT20_RESOLUTION            (1<<20)  // 2^20

#define AHT20_MAX_RETRY 10

static uint32_t AHT20_Read(uint8_t* buffer, uint32_t buffLen)
{
    hi_i2c_data data = { 0 };
    data.receive_buf = buffer;
    data.receive_len = buffLen;
    uint32_t retval = hi_i2c_read(AHT20_I2C_IDX, AHT20_READ_ADDR, &data);
    if (retval != HI_ERR_SUCCESS) {
        printf("I2cRead() failed, %0X!n", retval);
        return retval;
    }
    return HI_ERR_SUCCESS;
}

static uint32_t AHT20_Write(uint8_t* buffer, uint32_t buffLen)
{
    hi_i2c_data data = { 0 };
    data.send_buf = buffer;
    data.send_len = buffLen;
    uint32_t retval = hi_i2c_write(AHT20_I2C_IDX, AHT20_WRITE_ADDR, &data);
    if (retval != HI_ERR_SUCCESS) {
        printf("I2cWrite(%02X) failed, %0X!n", buffer[0], retval);
        return retval;
    }
    return HI_ERR_SUCCESS;
}

// 發(fā)送獲取狀態(tài)命令
static uint32_t AHT20_StatusCommand(void)
{
    uint8_t statusCmd[] = { AHT20_CMD_STATUS };
    return AHT20_Write(statusCmd, sizeof(statusCmd));
}

// 發(fā)送軟復(fù)位命令
static uint32_t AHT20_ResetCommand(void)
{
    uint8_t resetCmd[] = {AHT20_CMD_RESET};
    return AHT20_Write(resetCmd, sizeof(resetCmd));
}

// 發(fā)送初始化校準(zhǔn)命令
static uint32_t AHT20_CalibrateCommand(void)
{
    uint8_t clibrateCmd[] = {AHT20_CMD_CALIBRATION, AHT20_CMD_CALIBRATION_ARG0, AHT20_CMD_CALIBRATION_ARG1};
    return AHT20_Write(clibrateCmd, sizeof(clibrateCmd));
}

// 讀取溫濕度值之前, 首先要看狀態(tài)字的校準(zhǔn)使能位Bit[3]是否為 1(通過發(fā)送0x71可以獲取一個(gè)字節(jié)的狀態(tài)字),
// 如果不為1,要發(fā)送0xBE命令(初始化),此命令參數(shù)有兩個(gè)字節(jié), 第一個(gè)字節(jié)為0x08,第二個(gè)字節(jié)為0x00。
uint32_t AHT20_Calibrate(void)
{
    uint32_t retval = 0;
    uint8_t buffer[AHT20_STATUS_RESPONSE_MAX];
    memset(&buffer, 0x0, sizeof(buffer));

    retval = AHT20_StatusCommand();
    if (retval != HI_ERR_SUCCESS) {
        return retval;
    }

    retval = AHT20_Read(buffer, sizeof(buffer));
    if (retval != HI_ERR_SUCCESS) {
        return retval;
    }

    if (AHT20_STATUS_BUSY(buffer[0]) || !AHT20_STATUS_CALI(buffer[0])) {
        retval = AHT20_ResetCommand();
        if (retval != HI_ERR_SUCCESS) {
            return retval;
        }
        usleep(AHT20_STARTUP_TIME);
        retval = AHT20_CalibrateCommand();
        usleep(AHT20_CALIBRATION_TIME);
        return retval;
    }

    return HI_ERR_SUCCESS;
}

// 發(fā)送 觸發(fā)測量 命令,開始測量
uint32_t AHT20_StartMeasure(void)
{
    uint8_t triggerCmd[] = {AHT20_CMD_TRIGGER, AHT20_CMD_TRIGGER_ARG0, AHT20_CMD_TRIGGER_ARG1};
    return AHT20_Write(triggerCmd, sizeof(triggerCmd));
}

// 接收測量結(jié)果,拼接轉(zhuǎn)換為標(biāo)準(zhǔn)值
uint32_t AHT20_GetMeasureResult(float* temp, float* humi)
{
    uint32_t retval = 0, i = 0;
    if (temp == NULL || humi == NULL) {
        return HI_ERR_FAILURE;
    }

    uint8_t buffer[AHT20_STATUS_RESPONSE_MAX];
    memset(&buffer, 0x0, sizeof(buffer));
    retval = AHT20_Read(buffer, sizeof(buffer));  // recv status command result
    if (retval != HI_ERR_SUCCESS) {
        return retval;
    }

    for (i = 0; AHT20_STATUS_BUSY(buffer[0]) && i < AHT20_MAX_RETRY; i++) {
        // printf("AHT20 device busy, retry %d/%d!rn", i, AHT20_MAX_RETRY);
        usleep(AHT20_MEASURE_TIME);
        retval = AHT20_Read(buffer, sizeof(buffer));  // recv status command result
        if (retval != HI_ERR_SUCCESS) {
            return retval;
        }
    }
    if (i >= AHT20_MAX_RETRY) {
        printf("AHT20 device always busy!rn");
        return HI_ERR_SUCCESS;
    }

    uint32_t humiRaw = buffer[1];
    humiRaw = (humiRaw << 8) | buffer[2];
    humiRaw = (humiRaw << 4) | ((buffer[3] & 0xF0) >> 4);
    *humi = humiRaw / (float)AHT20_RESOLUTION * 100;

    uint32_t tempRaw = buffer[3] & 0x0F;
    tempRaw = (tempRaw << 8) | buffer[4];
    tempRaw = (tempRaw << 8) | buffer[5];
    *temp = tempRaw / (float)AHT20_RESOLUTION * 200 - 50;
    // printf("humi = %05X, %f, temp= %05X, %frn", humiRaw, *humi, tempRaw, *temp);
    return HI_ERR_SUCCESS;
}
)<>)<>)<>

4、aht20.h內(nèi)容如下:

/*
 * Copyright (C) 2021 HiHope Open Source Organization .
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 *
 * limitations under the License.
 */

#ifndef AHT20_H
#define AHT20_H

#include 

uint32_t AHT20_Calibrate(void);

uint32_t AHT20_StartMeasure(void);

uint32_t AHT20_GetMeasureResult(float* temp, float* humi);

#endif  // AHT20_H

5、aht20_test.c內(nèi)容如下:

/*
 * Copyright (C) 2021 HiHope Open Source Organization .
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 *
 * limitations under the License.
 */

#include "aht20.h"

#include 
#include 

#include "ohos_init.h"
#include "cmsis_os2.h"
#include "hi_gpio.h"
#include "hi_io.h"
#include "hi_i2c.h"
#include "oled_ssd1306.h"

void Aht20TestTask(void* arg)
{
    (void) arg;
    uint32_t retval = 0;
    char str_temp[12];
    char str_Humi[12];
    hi_io_set_func(HI_IO_NAME_GPIO_13, HI_IO_FUNC_GPIO_13_I2C0_SDA);
    hi_io_set_func(HI_IO_NAME_GPIO_14, HI_IO_FUNC_GPIO_14_I2C0_SCL);

    hi_i2c_init(HI_I2C_IDX_0, 400*1000);
    OledInit();

    OledFillScreen(0x00);  
    OledShowString(26, 0, "AHT20-TEST!", FONT8x16);
    retval = AHT20_Calibrate();
    printf("AHT20_Calibrate: %drn", retval);

    while (1) {
        float temp = 0.0, humi = 0.0;
        
        retval = AHT20_StartMeasure();
        printf("AHT20_StartMeasure: %drn", retval);

        retval = AHT20_GetMeasureResult(&temp, &humi);
        sprintf(str_temp,"TEMP:%.2f",temp);
        sprintf(str_Humi,"HUMI:%.2f",humi);
        printf("AHT20_GetMeasureResult: %d, temp = %.2f, humi = %.2frn", retval, temp, humi);
        OledShowString(26,2,str_temp,FONT8x16);
        OledShowString(26,4,str_Humi,FONT8x16);
        sleep(1);
    }
}

void Aht20Test(void)
{
    osThreadAttr_t attr;

    attr.name = "Aht20Task";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 4096;
    attr.priority = osPriorityNormal;

    if (osThreadNew(Aht20TestTask, NULL, &attr) == NULL) {
        printf("[Aht20Test] Failed to create Aht20TestTask!n");
    }
}

APP_FEATURE_INIT(Aht20Test);

7、BUILD.gn:

#Copyright (C) 2021 HiHope Open Source Organization .
#Licensed under the Apache License, Version 2.0 (the "License");
#you may not use this file except in compliance with the License.
#You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
#Unless required by applicable law or agreed to in writing, software
#distributed under the License is distributed on an "AS IS" BASIS,
#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#See the License for the specific language governing permissions and
#
#limitations under the License.

static_library("i2cd_emo") {
    sources = [
        "aht20_test.c",
        "aht20.c",
        "oled_ssd1306.c"
    ]

    include_dirs = [
        "http://utils/native/lite/include",
        "http://kernel/liteos_m/components/cmsis/2.0",
        "http://base/iot_hardware/peripheral/interfaces/kits",
        "http://device/hisilicon/hispark_pegasus/sdk_liteos/include"
    ]
}

8、修改app/BUILD.gn如下:

import("http://build/lite/config/component/lite_component.gni")

lite_component("app") {
    features = [
        "i2caht20:i2cd_emo",
    ]
}

然后就可以編譯下載了。
運(yùn)行效果如下圖:

db590bd3892ca88dd1c4b7a40e5c139.jpg

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • wi-fi
    +關(guān)注

    關(guān)注

    15

    文章

    2399

    瀏覽量

    129126
  • HarmonyOS
    +關(guān)注

    關(guān)注

    80

    文章

    2151

    瀏覽量

    35845
  • HiSpark
    +關(guān)注

    關(guān)注

    1

    文章

    156

    瀏覽量

    7713
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Nordic發(fā)布nRF7002 EBII 開發(fā)板, 支持Wi-Fi 6, 解鎖nRF54L新玩法

    Wi-Fi 6 功能,幫助開發(fā)人員創(chuàng)建高性能、高能效的Wi-Fi 6 物聯(lián)網(wǎng)解決方案。 基于 Nordic 的 nRF7002 Wi-Fi 協(xié)同 IC,nRF7002 EBII幫助 采用
    發(fā)表于 12-10 11:58

    如何更新 NuMaker IoT 板上的 Wi-Fi 模塊固件?

    更新 NuMaker IoT 板上的 Wi-Fi 模塊固件
    發(fā)表于 09-04 08:28

    【上海晶珩睿莓1開發(fā)板試用體驗(yàn)】Home Assistant 物聯(lián)網(wǎng)溫濕度計(jì)

    AHT10 傳感器; 環(huán)境配置:安裝 Python 工具庫,包括 i2c-tools 和 smbus2 ; AHT10 驅(qū)動(dòng)驅(qū)動(dòng) AHT
    發(fā)表于 08-18 13:55

    功耗創(chuàng)新低!涂鴉產(chǎn)品級(jí)Zigbee 3.0溫濕度計(jì)開發(fā)包,開箱即用、完全開源

    低功耗類設(shè)備,采用Zigbee3.0協(xié)議,待機(jī)電流低至幾個(gè)微安(uA),一節(jié)紐扣電池可持續(xù)工作長達(dá)1~2年,遠(yuǎn)超Wi-Fi版續(xù)航時(shí)長(僅能維持2個(gè)月),是溫濕度類設(shè)
    的頭像 發(fā)表于 07-31 19:13 ?722次閱讀
    功耗創(chuàng)新低!涂鴉產(chǎn)品級(jí)Zigbee 3.0<b class='flag-5'>溫濕度</b>計(jì)開發(fā)包,開箱即用、完全開源

    有沒有什么修復(fù)方法可以確保 AP 模式下的 Wi-Fi 和 BLE 連接同時(shí)正常工作?

    我正在使用 CYBSYSKIT DEV 01 套件。我嘗試在 AP 模式下打開 Wi-Fi 宣傳 BLE。我可以宣傳 SoftAP 和 BLE。但是,我無法從中央設(shè)備連接到 BLE。它可以立即連接
    發(fā)表于 07-17 06:13

    STM32+esp8266連接機(jī)智云,上傳溫濕度數(shù)據(jù)控制繼電器開關(guān)(平臺(tái)配置、代碼生成、代碼移植)

    代碼,通過手機(jī)APP進(jìn)行設(shè)備控制。元器件準(zhǔn)備在開始之前,您需要準(zhǔn)備以下硬件元器件:1.STM32開發(fā)板2.ESP8266Wi-Fi模塊3.溫濕度傳感器(如DHT1
    的頭像 發(fā)表于 07-15 18:54 ?946次閱讀
    STM32+esp8266連接機(jī)智云,上傳<b class='flag-5'>溫濕度</b>數(shù)據(jù)<b class='flag-5'>并</b>控制繼電器開關(guān)(平臺(tái)配置、代碼生成、代碼移植)

    溫濕度變送器功能有哪些?一文詳細(xì)解析

    ,也能通過電腦、手機(jī)等設(shè)備實(shí)時(shí)查看溫濕度數(shù)據(jù)。對(duì)于一些需要實(shí)時(shí)監(jiān)控的場所,如機(jī)房、醫(yī)院的藥品倉庫等,遠(yuǎn)程監(jiān)控功能能夠讓管理人員及時(shí)發(fā)現(xiàn)異常情況采取措施。 三、報(bào)警功能 為了確保環(huán)境溫濕度處于合適的范圍
    發(fā)表于 06-03 10:56

    智能倉儲(chǔ):溫濕度監(jiān)控方案應(yīng)用

    隨著倉儲(chǔ)環(huán)境要求提高,溫濕度監(jiān)控對(duì)保障貨物品質(zhì)至關(guān)重要。本文介紹一個(gè)工廠倉庫溫濕度監(jiān)控方案,利用溫濕度變送器、LoRa技術(shù)和智能監(jiān)測平臺(tái),為倉庫業(yè)主提供高效、可靠的監(jiān)測解決方案。倉庫溫濕度
    的頭像 發(fā)表于 05-29 11:35 ?665次閱讀
    智能倉儲(chǔ):<b class='flag-5'>溫濕度</b>監(jiān)控方案應(yīng)用

    基于 Wi-Fi 的定位服務(wù)

    以下捕獲使用 location_wifi_get 函數(shù)請求 Wi-Fi 定位服務(wù)。該事件的總功耗為 125.85mC,日志顯示精確度為 30.0m。 Got location: method
    發(fā)表于 04-17 15:16

    nRF Cloud Wi-Fi 定位服務(wù)

    、Predictive-GPS、Single-Cell、Multi-Cell 和 Wi-Fi 定位。通過利用 nRF Cloud 的優(yōu)化定位算法,基于 Nordic SoC 和 模組的產(chǎn)品可在定位用例
    發(fā)表于 04-17 15:07

    Wi-Fi 定位服務(wù)

    定位服務(wù)提供商維護(hù)。 通過查找數(shù)據(jù)庫中的匹配模式計(jì)算信號(hào)強(qiáng)度來估計(jì)位置的算法。 當(dāng)設(shè)備查詢定位服務(wù)時(shí),它會(huì)提供它能看到的所有 Wi-Fi 網(wǎng)絡(luò)的數(shù)據(jù)。該服務(wù)會(huì)在其數(shù)據(jù)庫中查找這些網(wǎng)絡(luò),找到相關(guān)位置,根據(jù)相似性和信號(hào)強(qiáng)度估算設(shè)
    發(fā)表于 04-17 15:01

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-I2C設(shè)備驅(qū)動(dòng)之I2C驅(qū)動(dòng)溫濕度傳感器

    例程代碼路徑:ELF 1開發(fā)板資料包\\03-例程源碼\\03-2 驅(qū)動(dòng)例程源碼\\07_I2C驅(qū)動(dòng)-aht20下面編寫一個(gè)溫濕度傳感器的驅(qū)動(dòng)
    發(fā)表于 04-15 10:41

    飛凌嵌入式ElfBoard ELF 1板卡-I2C設(shè)備驅(qū)動(dòng)之I2C驅(qū)動(dòng)溫濕度傳感器

    例程代碼路徑:ELF 1開發(fā)板資料包\\03-例程源碼\\03-2 驅(qū)動(dòng)例程源碼\\07_I2C驅(qū)動(dòng)-aht20下面編寫一個(gè)溫濕度傳感器的驅(qū)動(dòng)
    發(fā)表于 04-15 10:24

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-開發(fā)板適配之I2C-溫濕度傳感器

    ;elf,aht20\"; reg = <0x38>; status = \"okay\";};添加后效果如下:添加AHT20驅(qū)動(dòng)一、將ELF 1
    發(fā)表于 02-11 09:17

    飛凌嵌入式ElfBoard ELF 1板卡-開發(fā)板適配之I2C-溫濕度傳感器

    ;elf,aht20\"; reg = <0x38>; status = \"okay\";};添加后效果如下:添加AHT20驅(qū)動(dòng)一、將ELF 1
    發(fā)表于 02-10 10:31