描述
<div>
<p style="line-height:1.8">注:* 为必填项</p>
<p style="line-height:1.8"><strong><span style="color:#0093e6">请在报名阶段填写 ↓</span></strong></p>
<p style="line-height:1.8"> </p>
<h3 style="line-height:1.8">* 1、项目功能介绍</h3>
<hr>
<p style="line-height:1.8"> </p>
<p style="line-height:1.8"><span style="color:#000000;background-color:#ffffff"><span style="font-size:14px;background-color:#ffffff">基于 CH554 实现一个小夜灯。</span></span></p>
<p style="line-height:1.8"><span style="color:#000000;background-color:#ffffff"><span style="font-size:14px;background-color:#ffffff">当下的小夜灯普遍存在着痛点:</span></span></p>
<p style="line-height:1.8"><span style="color:#000000;background-color:#ffffff"><span style="font-size:14px;background-color:#ffffff">1.待机时间短</span></span></p>
<p style="line-height:1.8"><span style="color:#000000;background-color:#ffffff"><span style="font-size:14px;background-color:#ffffff">2.颜色不可调,夜间太亮光线刺眼</span></span></p>
<p style="line-height:1.8"><span style="color:#000000;background-color:#ffffff"><span style="font-size:14px;background-color:#ffffff">3.点亮时间不可调,不方便使用</span></span></p>
<p style="line-height:1.8"> </p>
<p style="line-height:1.8"><span style="color:#000000;background-color:#ffffff"><span style="font-size:14px;background-color:#ffffff">为此,制作了这样一个小夜灯:使用 18650 电池,同时外壳设计上预留了最够的空间,可以根据用户需要自行扩展加大电池通量。颜色和点亮时间可以用过串口自行设置。</span></span></p>
<p style="line-height:1.8"> </p>
<p>核心部件有2个,一个是 HC-SR602 人体红外感应模块;另外一个是CH554 单片机芯片。此外,外部还有TP4056充电模块,18650电池,XT1861B502MR-G升压芯片,5V开关芯片和SN74AHC1G32DBVR或门芯片。</p>
<p>基本原理是 18650和TP4056充电模块配合工作,负责充放电管理。TP4056充电模块自带一个TypeC接口可以用于充电。当18650放电到2.4V时,TP4056充电模块自动停止工作防止过放。然后XT1861芯片负责将2.4-4.2V电压升压到5V 提供给HC-SR602 人体红外感应模块使用。当这个有人触发红外感应模块后,模块输出到或门芯片,经过运算后用于触发SY6280AAC进行供电。之后,CH554 根据存储的颜色控制 WS2812 LED 发光。同时根据设定的时间控制前面提到的或门。这样就可以实现即便人体红外感应模块输出停止工作之后,仍然输出5V。</p>
<p> </p>
<p><strong>HC-SR602</strong><strong>模块主要参数(在底板上)</strong></p>
<ul>
<li>工作电压:3.3V-15V;</li>
<li>静态电流:20uA;</li>
<li>感应距离:最大5M;建议0-3.5M;</li>
<li>信号电平输出:H=3.3V(检测到周围有人体);L=0V(检测周围无人体);</li>
</ul>
<p><strong>XT1861产品特点(在底板上)</strong></p>
<p>· 最高效率:94%</p>
<p>· 最高工作频率:300KHz</p>
<p>· 低静态电流:15µA</p>
<p>· 输出电压:1.8V~5.0V(步进 0.1V)</p>
<p>· 输入电压:0.9V~6.5V</p>
<p>· 低纹波,低噪声 小体积封装</p>
<p style="line-height:1.8"> </p>
<p style="line-height:1.8"> </p>
<h3 style="line-height:1.8">*2、项目属性</h3>
<hr>
<p style="line-height:1.8"><span style="color:#000000;font-size:14px">首次公开原创项目</span></p>
<p style="line-height:1.8"> </p>
<p style="line-height:1.8"> </p>
<h3 style="line-height:1.8">* 3、开源协议</h3>
<hr>
<p style="line-height:1.8">Public Domain</p>
<p style="line-height:1.8"> </p>
<p style="line-height:1.8"><strong><span style="color:#0093e6">请在竞赛阶段填写 ↓</span></strong></p>
<p style="line-height:1.8"> </p>
<h3 style="line-height:1.8">*4、硬件部分</h3>
<hr>
<p style="line-height:1.8"><span style="color:#95a5a6"><span style="font-size:14px">这里设计的是主控部分,如果想整体工作起来需要配合底板。具体项目在 <a href="https://oshwhub.com/zoologist/ch554-xiao-ye-deng-20250510" target="_blank">https://oshwhub.com/zoologist/ch554-xiao-ye-deng-20250510</a></span></span></p>
<p style="line-height:1.8"><span style="color:#95a5a6"><span style="font-size:14px">这里主控部分完整的主要功能是:</span></span></p>
<p style="line-height:1.8"><span style="color:#95a5a6"><span style="font-size:14px">1.接收来自串口的,LED 颜色和时长的设定;</span></span></p>
<p style="line-height:1.8"><span style="color:#95a5a6"><span style="font-size:14px">2.工作之后负责控制LED 颜色</span></span></p>
<p style="line-height:1.8"> </p>
<h3 style="line-height:1.8">*5、软件部分</h3>
<hr>
<p style="line-height:1.8"> 代码使用 Arduino 完成:</p>
<p style="line-height:1.8"> </p>
<p style="line-height:1.8"> </p>
<p>#ifndef USER_USB_RAM<br>#error "This example needs to be compiled with a USER USB setting"<br>#endif<br>#include "src/userUsbCdc/USBCDC.h"<br>#include <br>#include "DataFlash.H"<br>#include "include/ch5xx.h"</p>
<p style="line-height:1.8"> </p>
<p>#define NUM_LEDS 2<br>#define COLOR_PER_LEDS 3<br>#define NUM_BYTES (NUM_LEDS*COLOR_PER_LEDS)<br>__xdata uint8_t ledData[NUM_BYTES];</p>
<p style="line-height:1.8"> </p>
<p>#define BIT1 2</p>
<p style="line-height:1.8"> </p>
<p>// USB 串口 Buffer<br>uint8_t recvStr[6];<br>uint8_t recvStrPtr = 0;<br>// 之前保存的颜色值<br>uint8_t rValue, gValue, bValue;<br>uint16_t TimeLighting;</p>
<p style="line-height:1.8"> </p>
<p>// 定义电源控制引脚<br>#define POWERCTRL 15<br>// 定义LED信号线<br>#define LEDCOLOR 14<br>#define NEOPIXELSHOW neopixel_show_P1_4</p>
<p style="line-height:1.8"> </p>
<p>unsigned long ElspLighten = 0;<br>unsigned long Elsp = 0;</p>
<p style="line-height:1.8"> </p>
<p>void SetLEDColor(uint8_t r, uint8_t g, uint8_t b) {<br> for (uint8_t i = 0; i {<br> set_pixel_for_GRB_LED(ledData, i, r,g,b);<br> NEOPIXELSHOW(ledData, NUM_BYTES);<br> delay(10);<br> }<br>}<br>void setup() {<br> // 供电引脚接管电源<br> pinMode(POWERCTRL, OUTPUT);<br> digitalWrite(POWERCTRL, HIGH);</p>
<p style="line-height:1.8"> </p>
<p> // LED 颜色控制<br> pinMode(LEDCOLOR, OUTPUT);</p>
<p style="line-height:1.8"> </p>
<p><br> USBInit();</p>
<p style="line-height:1.8"> </p>
<p> // 读取颜色信息<br> Flash_Op_Check_Byte1 = 0x00;<br> Flash_Op_Check_Byte2 = 0x00;<br> ReadDataFlash(0, 1, &rValue);<br> ReadDataFlash(1, 1, &gValue);<br> ReadDataFlash(2, 1, &bValue);</p>
<p style="line-height:1.8"> </p>
<p> // 读取时长<br> ReadDataFlash(3, 2, &TimeLighting);</p>
<p style="line-height:1.8"> </p>
<p> // 这里需要写成这样,避免上电亮一下的问题<br> delay(10);<br> //set_pixel_for_GRB_LED(ledData, 0, 0, 0, 0);<br> //NEOPIXELSHOW(ledData, NUM_BYTES);<br> SetLEDColor(0,0,0);<br> delay(10);</p>
<p style="line-height:1.8"> </p>
<p> // 读取之前保存的灯颜色<br> //set_pixel_for_GRB_LED(ledData, 0, rValue, gValue, bValue);<br> //NEOPIXELSHOW(ledData, NUM_BYTES);<br> SetLEDColor(rValue, gValue, bValue);<br> delay(100);</p>
<p style="line-height:1.8"> </p>
<p> ElspLighten = millis();<br>}</p>
<p style="line-height:1.8"> </p>
<p>void Enter_DeepSleep(void)<br>{<br> // 第一步:关闭所有外设模块<br> SAFE_MOD = 0x55; // 进入安全模式<br> SAFE_MOD = 0xAA; // 解锁寄存器写保护<br> PCON &= ~BIT1; // 确保PD位初始为0<br> IE_EX = 0x00; // 关闭扩展中断<br> IE = 0x00; // 关闭所有中断<br> TCON = 0x00; // 关闭定时器控制<br> TMOD = 0x00; // 关闭定时器模式<br> SAFE_MOD = 0x00; // 恢复安全模式</p>
<p style="line-height:1.8"> </p>
<p> // 第二步:设置IO口为低功耗状态<br> P1_DIR_PU = 0x00; // 所有IO设为输入模式<br> P3_DIR_PU = 0x00; // 所有IO设为输入模式</p>
<p style="line-height:1.8"> </p>
<p> // 第三步:进入停机模式<br> SAFE_MOD = 0x55; // 二次确认安全模式<br> SAFE_MOD = 0xAA;<br> PCON |= BIT1; // 置位PD位进入停机模式<br> PCON |= BIT1; // 推荐重复写入确保执行</p>
<p style="line-height:1.8"> </p>
<p> while (1);<br>}</p>
<p style="line-height:1.8"> </p>
<p><br>void loop() {<br> while (USBSerial_available()) {<br> char serialChar = USBSerial_read();<br> recvStr[recvStrPtr++] = serialChar;</p>
<p style="line-height:1.8"> </p>
<p> if (recvStrPtr == 5) {<br> // 测试命令<br> if ((recvStr[0] == 0x55) && (recvStr[1] == 0xCC)) {<br> USBSerial_print(rValue);<br> USBSerial_flush();<br> USBSerial_print(gValue);<br> USBSerial_flush();<br> USBSerial_print(bValue);<br> USBSerial_flush();<br> USBSerial_println(TimeLighting);<br> USBSerial_flush();<br> }</p>
<p style="line-height:1.8"> </p>
<p> // 设置颜色<br> if ((recvStr[0] == 0x55) && (recvStr[1] == 0xAA)) {<br> // 记录收到的颜色信息<br> rValue = recvStr[2];<br> gValue = recvStr[3];<br> bValue = recvStr[4];</p>
<p style="line-height:1.8"> </p>
<p> // 将颜色信息写入 eeprom<br> Flash_Op_Check_Byte1 = DEF_FLASH_OP_CHECK1;<br> Flash_Op_Check_Byte2 = DEF_FLASH_OP_CHECK2;<br> uint8_t result = WriteDataFlash(0, &recvStr[2], 3);<br> if (result == 0) {<br> // 写入成功<br> USBSerial_println(result);<br> USBSerial_flush();<br> } else {<br> // 写入失败<br> USBSerial_println(result);<br> USBSerial_println("f1");<br> USBSerial_flush();<br> }</p>
<p style="line-height:1.8"> </p>
<p> //set_pixel_for_GRB_LED(ledData, 0, rValue, gValue, bValue);<br> //NEOPIXELSHOW(ledData, NUM_BYTES);<br> SetLEDColor(rValue, gValue, bValue);</p>
<p style="line-height:1.8"> </p>
<p> }</p>
<p style="line-height:1.8"> </p>
<p> // 设定时长的命令<br> if ((recvStr[0] == 0x55) && (recvStr[1] == 0xBB)) {<br> // 记录收到的颜色信息<br> TimeLighting = (recvStr[2]) + (recvStr[3] 200) {<br> recvStrPtr = 0;<br> Elsp = millis();<br> }</p>
<p style="line-height:1.8"> </p>
<p> // 到达点亮的时间后关闭,如果是插在电脑上则不关闭<br> if ((millis() - ElspLighten > TimeLighting * 1000UL) && (USBConfiged == 0)) {<br> // 关灯<br> //set_pixel_for_GRB_LED(ledData, 0, 0, 0, 0);<br> //NEOPIXELSHOW(ledData, NUM_BYTES);<br> SetLEDColor(0, 0, 0);</p>
<p style="line-height:1.8"> </p>
<p> digitalWrite(POWERCTRL, LOW);<br> // 进入省电模式<br> Enter_DeepSleep();<br> }</p>
<p style="line-height:1.8"> </p>
<p><br>}</p>
<p style="line-height:1.8"> </p>
<h3 style="line-height:1.8">*6、BOM清单</h3>
<hr>
<p style="line-height:1.8"><span style="color:#95a5a6;font-size:14px">请输入内容…</span></p>
<p style="line-height:1.8"> </p>
<p style="line-height:1.8"><span style="color:#95a5a6;font-size:14px">注:项目涉及的BOM清单。在<span style="text-decoration:underline"><a href="https://lceda.cn/editor" target="_blank">嘉立创EDA</a> </span>生成/上传设计文件后,BOM将自动生成至项目详情;建议包括型号、品牌、名称、封装、采购渠道、用途等内容。具体内容和形式应以表达清楚项目构成为准。 </span></p>
<p style="line-height:1.8"> </p>
<h3 style="line-height:1.8">*7、大赛LOGO验证</h3>
<hr>
<p style="line-height:1.8"> </p>
<p style="line-height:1.8"><img src="//image.lceda.cn/pullimage/bmu5DoZrRZDzLDXlIfQtkrymLkoImxyUKvMxbDeR.png"></p>
<p style="line-height:1.8"> </p>
<p style="line-height:1.8"><img src="//image.lceda.cn/pullimage/daSwxo3h1lji1eiJk6vBoQUlanRdxwo8dt27S3A8.png"></p>
<p style="line-height:1.8"> </p>
<p style="line-height:1.8"><img src="//image.lceda.cn/pullimage/gsjKhaF72WDjZglxARy8iEoceEI0X7YooiiRdbqG.png"></p>
<p style="line-height:1.8"> </p>
<h3 style="line-height:1.8">* 8、演示您的项目并录制成视频上传</h3>
<hr>
<p style="line-height:1.8"> </p>
<p style="line-height:1.8"><span style="color:#95a5a6;font-size:14px">视频要求:请横屏拍摄,分辨率不低于1280×720,格式Mp4/Mov,单个视频大小限100M内;</span></p>
<p style="line-height:1.8"><span style="color:#95a5a6;font-size:14px">视频标题:立创电赛:{项目名称}-{视频模块名称};如立创电赛:《自动驾驶》-团队介绍。</span></p>
<p style="line-height:1.8"> </p>
<p style="line-height:1.8"><span style="font-size:14px"><a href="/posts/42551e8f2f2548cabc1c36626a42da94" target="_blank">前往查看更多详情 ></a></span></p>
<p style="line-height:1.8"> </p>
</div>
评论(0)