• 发文章

  • 发资料

  • 发帖

  • 提问

  • 发视频

创作活动
0
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
返回

电子发烧友 电子发烧友

  • 全文搜索
    • 全文搜索
    • 标题搜索
  • 全部时间
    • 全部时间
    • 1小时内
    • 1天内
    • 1周内
    • 1个月内
  • 默认排序
    • 默认排序
    • 按时间排序
  • 全部板块
    • 全部板块
大家还在搜
  • CSU18M92两电极的电路怎么接

    请问,我用CSU18M92做两手的测脂功能,每只手只用1个电极片。这个电路应该怎么接,直接短路ISIN和VSEN吗

    2024-04-19 11:08

  • 【晒奖品】盘古 PGX-MINI 4K 开发板

    3月在群里成功签到满勤,今天收到奖品啦: 背面: 盘古 PGX-MINI 4K 开发板是一套基于紫光同创 compa 系列 PGC4KD-6ILPG144芯片为核心的开发套件,支持主自加载双启动功能,集成板载 jtag 调试接口,预留两组 20PIN 扩展 IO、数码管、按键、led 灯等硬件资源,为用户提供基本的开发环境。

    2024-04-19 11:01

  • 开源项目!做一台基于 ESP32 DIY 复古游戏机

    MicroByte 是一款mini主机,能够运行 NES、GameBoy、GameBoy Color、Game Gear 和 Sega Master 系统的游戏,所有元器件都设计在这 78 x 17 x 40 mm 的封装中。尽管成品尺寸很小,但它符合 SNES 游戏板的布局并且具有操作按钮。它还配有一个清晰的 1.3 英寸 IPS 显示屏,可以看到游戏的所有细节。 随后还会更新 Python 和 Arduino 库以便进行游戏以外的开发工作。 作者的GitHub仓库:<span>https://github.com/jfm92/microByte</span> 固件、PCB 设计、外壳 3D 文件等可以在文末下载。 BOM 清单:<span>https://github.com/jfm92/microByte_PCB/blob/main/microByte_BOM.xlsx</span> 项目架构 通常开始一个电子项目时,首先会创建一个框图,设置项目所需的功能及交互的方式,然后绘制原理图。在原理图上,选择符合要求的元器件并进行电气连接,之后进行 PCB 布局设计。最后,按照设计规则和物理设计准则设置每个元器件基座的位置。 上面是以面包板为原型的原始版本,下面是最终版本。 此处将按照模块化思想进行项目开发,辅以原理图设计和 PCB 布局设计。 该项目原理图和 PCB 布局是用 Kicad 设计的,下载链接:<span>https://github.com/jfm92/microByte_PCB/tree/5cb0fcf7a9658e331d677588a7f35327a7d491d7</span> 要打开它,只需安装 Kicad 并双击 <span>.pro</span> 文件。 ESP32 微控制器 首先选择合适的微控制器,对于该项目,选择 ESP32 Wrover E 模块。 该模块/微控制器特点:具有 240 MHZ 双核、16 MB 闪存、8 MB RAM、超低功耗协处理器、支持 Wi-Fi 和蓝牙以及全套外围设备和 GPIO,仿真性能极佳。 设计中可参考 Espressif,数据表如下:<span>https://www.espressif.com/sites/default/files/documentation/esp32-wrover-e_esp32-wrover-ie_datasheet_en.pdf</span> 电路板模块的原理图: 中间是与外围设备连接的 ESP32 模块。 引脚 25 是 IO 0 引脚。该引脚为选择设备的引导状态,可以闪存新固件或启动已闪存的固件。信号为高,启动已闪存的固件;信号为低,启动引导模式,并等待新固件。 引脚 3 是启用引脚(又名复位)。如果这个引脚是高电平,微控制器将工作,否则不工作。为了避免信号弹跳,此处有一个 RC 电路(电阻/电容),在板启动或跳变时产生干净的信号,以防止意外复位。由于该电路没有复位按钮,因此并不是完全必要,但最好保持谨慎。 引脚 24 是 IO 2 引脚,连接了一个带电阻器的蓝色 LED,起到显示通知的作用。让我们看看引脚 2 或 VDD 3V3。这引脚是给芯片供电的,电压 3.3 V。注意并联电容器,这些电容器是去耦电容器,用于清除寄生干扰。 下面是 PCB 设计布局和 PCB 板中重点研究的部分。 除此之外,相关的组件必须尽可能靠近。 添加 USB 模块 USB 收发器是一个将 USB 信号转换为串行、RS232 或其他类似协议的芯片。在市场上,有各种各样的型号可供选择,此处使用 CH340C。 CH340C 不需要像 CH340G 一样的外部时钟,其用法简单,价格是 CP2102 或 FT232 的一小部分。 图的右侧所示。它的设计非常简单,只有一块芯片,上面有两个去耦电容和一个 0 欧姆的电阻。如果不确定是否必须进行连接,则将这种电阻器用作电桥。 右边是 USB-C 连接器的示意图。其作用是连接到 PC 并给电池充电。在 PCB 布线时,使用 USB-C 更具挑战性,因为需要添加双连接,可以在任何方向使用导线。 提示:USB 信号是并行高速信号,必须尽量平行布线,避免信号间的串扰,并尽量将信号线布在靠近数字逻辑芯片的地方。 电池与电源管理 此处分为三个部分:电池充电和保护电路、电源管理和电池电量控制。电池充电和保护电路: 对于 Li-Po 电池的使用,安全第一,需要做一个正确的恒流充电控制器,使它不要在 4.2 V 以上充电或在 2.8 V 以下对电池放电,以免损坏电池。 TP4056 是一个锂聚合物电池充电器芯片,可提供恒定的线性电压电流,还可以通过修改 R 2 的阻值设置充电电流。切记充电电流应为电池容量的 25 % 左右。此芯片连接到 LED D1,以显示电池的充电状态。 FS312F-G 是一个电池保护电路芯片,如果检测到电池过度充电或过度放电,它会切断电池的使用。这样可以避免损坏电池。 FS8205 是一个集成两个 MOSFET 晶体管以选择电路功率的芯片,如果电池处于合适的范围内,它将从电池中获取能量,如果将设备连接到 USB 端口,它将直接利用 USB 的能量工作。 电源管理: 该模块是电压转换器的升压电路,可提供 3.3 V 的恒定电压。锂电池的最大充电电压为 4.2 V,最小安全电压为 2.8 V。因此,需要提供恒定电压以避免微控制器不稳定或显示器上的亮度较低。为解决这个问题,此处使用 MT3608,它是一种可配置的升压电压转换器。在该电路的输出端,电压为 4.2 V,高于器件所需的 3.3 V,所以使用 MCP1700 电压转换器将电压从 4.2 V 转换为 3.3 V。 这个方案可能存在过度设计或效率低下的问题,但这是最便宜有效的解决方案。 电池电量控制: 就像升压电路前的分压器一样简单。此点的电压最大将达到 4.2 V,因此仅需设计一个降至 3.3 V 的分压器以遵守 ESP32 的逻辑电平并将其连接到 ADC GPIO 即可测量模拟电平信号。 设计 SD 卡模块 SD 卡使用 SPI 协议,这是一种双向通信,可实现高速通信。使用外设时,不必担心串扰,因为它的速度不足以产生磁场(至少此处没有任何问题)。 电路也非常简单,将每条线连接到 MCU 的 SPI GPIO 口并添加一个上拉电阻。该电阻对于保持线路上的恒定高电平并避免可能破坏数据传输的中间电平信号很重要。 此处还有我们的老朋友去耦电容器。 音频输出 使用 ESP32,有两种方式输出音频。通过检查数据表,此处可以使用集成的 I2S 到 DAC 转换器或直接使用 I2S 外设。 获得音频输出的最简单方法是使用 I2S 到 DAC 转换器,因为可以将扬声器直接连接到 GPIO,如果音频音量很低,则可以使用模拟音频放大器,这非常容易实施。但是这种解决方案也带来了一些不便。DAC 仅使用 I2S 16 位中的 8 位,这意味着将丢失很多音频信息,导致音频质量非常差。 I2S 是一种数字音频协议,可保证高保真音频,而不造成质量损失或噪声。但需要一个转换器模拟转换器和放大器收到的东西。此处采用 MAX98357 音频放大器。该放大器将 I2S 信号转换为模拟信号,并将其放大以直接用于接扬声器或耳机。该放大器/转换器可为我们提供 6.4W 的输出功率,并具有可配置的输出选择——在单声道或立体声音频之间进行选择和阻抗选择。 作者免责声明:\"我对音频的了解不是很深,所以一些音频数据可能是错误的,仅供参考。\" 添加按键 ESP32 是一个不错的模块,但它的 GPIO 端口数量很少。但是不用担心,我们有 TCA9555 解决方案。 TCA9555 是 I2C GPIO 多路复用器。该器件最多允许使用 18 个额外的 GPIO。这些 GPIO 可用作输入或输出,并可通过 I2C 进行控制或检查。因此,仅使用两个 GPIO(I2C SDA 和 I2C SCLK),就有了 18 个额外的 GPIO!延迟不是问题,因为可以读取或写入高达 400 Khz的数据,这意味着每秒 400000 次! 让我们看一下原理图。该多路复用器可与 I2C 一起使用,因此需要上拉每个信号以避免线路上的噪声。它也有一个中断引脚,但未使用。I2C 信号为 SCL 和 SDA 引脚(19 和 20)。需要通过硬件配置设备的地址,此配置通过设置引脚 A0、A1 和 A2 的逻辑电平来完成。此处只有一个 I2C 设备,因此给出地址 0x00。 最后,所有开关按钮都直接连接到芯片,我们通过软件配置设置了上拉或下拉电阻,因为该多路复用器具有可配置的内部电阻。 该设备的有趣之处之一是电感式按钮,它们是没有丝印层的 PCB 布线,因此,带有碳膜的橡胶按钮可以用作开关按钮。这是游戏手柄上的常规配置。如果要在设计中使用,可以在项目附带的库中找到。 配一款亮丽的显示屏 显示器采用 IPS 1.3 英寸屏幕,分辨率为 240 x 240 px,可以提供非常漂亮的色彩和清晰的图像。通信协议是 SPI,可以实现高达 70 FPS 的帧速率(数据表中注明)。另一方面,可以控制显示器的背光以选择亮度等级。通过 BS138 MOSFET 晶体管完成控制显示屏上嵌入的 LED 的电流。 完成 现在就可以运行这台复古游戏机了,开启你的复古游戏回忆之旅吧! 文章来源:https://www.instructables.com/MicroByte-DIY-Retro-Console/ 项目作者:JuanF92 ​

    2024-04-19 10:20

  • I.MX6ULL-飞凌 ElfBoard ELF1板卡-Flash 剩余容量问题

    ElfBoard的IMX6U 核心板是EMMC 版本,Flash 为 8G。 启动系统后,在串口终端执行以下指令可以查看到剩余 Flash 容量: root@ELF1:~# df 可以看到剩余 Flash 为 5525848kb。

    2024-04-19 09:27

  • 飞凌嵌入式ElfBoard ELF 1板卡-Flash 剩余容量问题

    ElfBoard的IMX6U 核心板是EMMC 版本,Flash 为 8G。 启动系统后,在串口终端执行以下指令可以查看到剩余 Flash 容量: root@ELF1:~# df 可以看到剩余 Flash 为 5525848kb。

    2024-04-19 09:25

  • 找一款负-48V输入,24V输出的隔离电源

    电源是通讯上用的电源,设备上提供的电源是负电源,模块板上需要+24V电压,因此需要一款-48V转24V的电源板,隔离的

    2024-04-19 08:41

  • 如何用stm32做lwip一个IP地址多个端口通信?

    有没有用stm32做过lwip一个IP地址多个端口通信的,亲大佬指点下

    2024-04-19 08:26

  • USART3用DMA发送只能发送一次是什么原因导致的?

    单片机STM32F103R8T6,环境IAR8.22 请各位大神帮忙看下: /******************************************************************************* * Function Name: void USART3_Init(u32 baud) * Description : 初始化USART2 TX{:7:}A2RX{:7:}A3 * Input : 无 * Output: 无 * Return: 无 *******************************************************************************/ void USART3_Init(u32 baud) { GPIO_InitTypeDef GPIO_InitStructure;//定义结构体 USART_InitTypeDef USART_InitStructure; //定义结构体 //NVIC_InitTypeDef NVIC_InitStruct; // 第1步:打开GPIO和USART部件的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);//打开PIOA口的时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //打开UART_3的时钟 // 第2步:将USART Tx的GPIO(PB10)配置为推挽复用模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //配置PB口时钟 GPIO_Init(GPIOB,GPIO_InitStructure); //第3步:将USART Rx的GPIO配置为浮空输入模式 //将USART Rx的GPIO(PB11)配置为浮空输入模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB,GPIO_InitStructure); GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //配置PB口时钟 GPIO_Init(GPIOB,GPIO_InitStructure); //第4步:配置USART参数 USART_InitStructure.USART_BaudRate =baud;//设置波特率4800、9600、19200、38400、115200 USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8位数据 USART_InitStructure.USART_StopBits = USART_StopBits_1;//1个停止位 USART_InitStructure.USART_Parity = USART_Parity_No;//无校验 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无流量控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//接受和发送使能 USART_Init(USART3,USART_InitStructure); // 串口3初始化 //USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);// 开启 USART 接收缓冲区非空中断 //USART_ITConfig(USART1, USART_IT_TXE, ENABLE);// 开启 USART 发送缓冲区空中断 USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);//开启 USART1 总线空闲中断 //第5步:使能 USART, 配置完毕 USART_Cmd(USART3, ENABLE);//使能或失能USART USART_ClearFlag(USART3, USART_FLAG_TC);//清除发送完成标志 USART3_DMA_TxConfig(); } void USART3_DMA_TxConfig(void) { DMA_InitTypeDef DMA_InitStruct; /*开启DMA时钟*/ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); DMA_Cmd(DMA1_Channel2,DISABLE); //close DMA Channel DMA_DeInit(DMA1_Channel2); /*设置DMA源:串口数据寄存器地址*/ DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)( USART3->DR); //内存--->外设 /*内存地址(要传输的变量的指针)*/ DMA_InitStruct.DMA_MemoryBaseAddr = (u32)uart3.sendBuf; /*方向:从内存到外设*/ DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralDST; /*传输大小DMA_BufferSize=SENDBUFF_SIZE*/ DMA_InitStruct.DMA_BufferSize = uart3.sendLen; /*外设地址不增*/ DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable; /*内存地址自增*/ DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable; /*外设数据单位*/ DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; /*内存数据单位 8bit*/ DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; /*DMA模式:不断循环*/ DMA_InitStruct.DMA_Mode = DMA_Mode_Normal ; //DMA_InitStruct.DMA_Mode = DMA_Mode_Circular; /*优先级:中*/ DMA_InitStruct.DMA_Priority = DMA_Priority_Medium; /*禁止内存到内存的传输 */ DMA_InitStruct.DMA_M2M = DMA_M2M_Disable; /*配置DMA1的2通道*/ DMA_Init(DMA1_Channel2,DMA_InitStruct); DMA_ClearFlag(DMA1_FLAG_GL4); //DMA_ITConfig(DMA1_Channel2,DMA_IT_TC,ENABLE);//配置DMA发送完成后产生中断 DMA_ITConfig(DMA1_Channel2,DMA_IT_TC,ENABLE);//open DMA send inttrupt /*使能DMA*/ //DMA_Cmd (DMA1_Channel2,ENABLE); USART_DMACmd(USART3, USART_DMAReq_Tx, ENABLE); } //下面是调试函数,每500ms调用一次,执行一次发送 int debug = 0; void USART3_DealRev(void) { static long t=0; t++; if(t>2) { debug = 2; t = 0; } if(debug == 1) { for(int i= 0; i<50; i++) uart3.sendBuf[i] = i+1; uart3.sendLen = 50; USART3_SendData((unsigned char *)uart3.sendBuf,uart3.sendLen ); uart3.sendLen = 0; debug = 0; } else if(debug == 2) { for(int i= 0; i<50; i++) uart3.sendBuf[i] = i+1; DMA_SetCurrDataCounter(DMA1_Channel2, 50); DMA_Cmd (DMA1_Channel2,ENABLE); debug = 0; } } //中断函数一直不进入 void DMA1_Channel2_IRQHandler(void) { if(DMA_GetITStatus(DMA1_IT_TC1)) { uart3.sendLen = 0; DMA_ClearITPendingBit(DMA1_IT_GL1); //清除全部中断标志 DMA_Cmd(DMA1_Channel2, DISABLE); //处理完,重开DMA } }

    2024-04-19 08:21

  • stm32f030k6t6的串口配置下载后串口助手没有数据打印是怎么回事?

    #include \"stm32f0xx.h\" #include \"uart.h\" #include \"string.h\" #include \"stdlib.h\" ////////////////////////////////////////////////////////////////////////////////// //如果使用ucos,则包括下面的头文件即可. #if 1 #pragma import(__use_no_semihosting) //标准库需要的支持函数 struct __FILE { int handle; }; FILE __stdout; //定义_sys_exit()以避免使用半主机模式 void _sys_exit(int x) { x = x; } //重定义fputc函数 int fputc(int ch, FILE *f) { while((USART1->ISR 0X40)==0);//循环发送,直到发送完毕 USART1->RDR = (uint8_t) ch; return ch; } #endif //串口1中断服务程序 //注意,读取USARTx->SR能避免莫名其妙的错误 uint8_t USART_RX_BUF[USART_REC_LEN];//接收缓冲,最大USART_REC_LEN个字节. //接收状态 //bit15, 接收完成标志 //bit14, 接收到0x0d //bit13~0, 接收到的有效字节数目 uint16_t USART_RX_STA=0; //接收状态标记 //初始化IO 串口1 //bound:波特率 void uart_init(uint32_t bound){ //GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); //使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟 //串口1对应引脚复用映射 GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_1); //GPIOB6复用为USART1 GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_1); //GPIOB7复用为USART1 //USART1端口配置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; //GPIOB6与GPIOB7 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 GPIO_Init(GPIOB, GPIO_InitStructure); //初始化PB6,PB7 //Usart1 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道 NVIC_InitStructure.NVIC_IRQChannelPriority=0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能 NVIC_Init( NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、 //USART1 初始化设置 USART_InitStructure.USART_BaudRate = bound;//波特率设置 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式 USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位 USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式 USART_Init(USART1,USART_InitStructure); //初始化串口1、 USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); USART_Cmd(USART1, ENABLE);//使能串口1 //USART_ClearFlag(USART1, USART_FLAG_TC); } void USART1_IRQHandler(void)//串口1中断服务程序 { uint8_t Res; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//接收中断(接收到的数据必须是0x0d 0x0a结尾) { Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据 if((USART_RX_STA 0x8000)==0)//接收未完成 { if(USART_RX_STA 0x4000)//接收到了0x0d { if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始 else USART_RX_STA|=0x8000; //接收完成了 } else //还没收到0X0D { if(Res==0x0d)USART_RX_STA|=0x4000; else { USART_RX_BUF[USART_RX_STA 0X3FFF]=Res ; USART_RX_STA++; if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收 } } } } } ////////////////////////////////////////////// //主函数 #include \"stm32f0xx.h\" #include \"delay.h\" #include \"uart.h\" #include \"pwm.h\" int v=300;//占空比,绝对值最大500 int main(void) { delay_init(48); uart_init(115200); //TIM_PWM_Config(999,24-1);//频率5KHz //// pwmout(v); // TIM_SetCompare1(TIM1,v); // TIM_SetCompare2(TIM1,v); while (1) { //delay_ms(500); // printf(\"aarn\"); USART_SendData(USART1,0x31); } }

    2024-04-19 08:21

  • STM32F105RB通过FATFS0.12C写U盘失败的原因?

    从github上搬来的FATFS v0.12c代码;往U盘里文本文件写任意写符串(不超过30个字符)。第一次插入U盘失败,拔掉U盘再插入,就能写成功。 何故?? FATFS v0.12c源码:http://github.com/stm32duino/FatFs/tree/master/src char *STR = \"aa132cv41654654464rtyrryryrydfgs\"; fr = f_open( fil ,\"0:t123.txt\",FA_OPEN_ALWAYS|FA_WRITE|FA_READ); if(fr == FR_OK) { printf(\"文件打开成功!rn\"); //__disable_irq(); fr = f_write( fil,STR,strlen(STR),(UINT*)fw); //__enable_irq(); if(fr == FR_OK) { printf(\"数据写入完成!rn\"); } else { printf(\"数据写入失败!rn\"); } //HAL_Delay(200); fr = f_close( fil);//首次加电,写入U盘失败时,此处返回 1 ; if(fr == FR_OK) { printf(\"rn文件关闭成功.rn\"); printf(\"打印关闭文件代码:%drn\",fr); } else { printf(\"rn文件关闭失败!rn\"); printf(\"打印关闭文件代码:%drn\",fr); } }

    2024-04-19 08:16