RGB灯带控制(恒流控制)-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 826|回复: 0

[分享] RGB灯带控制(恒流控制)

[复制链接]
发表于 2022-4-7 16:28 | 显示全部楼层 |阅读模式
项目:智能灯带远程控制(12V RGB 版恒流控制)方案规划:初期看了很多案例基本上都是基于PWM+MOS 功能调光 ,后来想想能不能用恒流ic控制 (ic集中 温度 过压 限流。。。。。)逼格高一点。
方案选择:刚开始真纠结选择esp8266 还是32  因初期功能比较单一所以选择了8266。在规划过程中有想后期增加人体感应接口+光感+温度传感器,拓展外置天线等。后期还是选择esp32;恒流电ic选择:灯带是共vcc(12v) rbg 为gnd 故选择ic需要可以共阳多联市面找了一圈还真不便宜,而且不多。反正走了不少弯路建议有需要可搜索舞台灯rgb 驱动ic。
废话不多说  
目前软件已经开关灯+rgb调光+设置+断电存储+温度+光感

2.jpg
2.png
  1. #define BLINKER_WIFI
  2. #define BLINKER_ALIGENIE_SENSOR
  3. #include <Blinker.h>    /* 引用点亮函数 */
  4. #include <EEPROM.h>     /* 引用存储库函数 */
  5. #include "OneButton.h"  /* 引用按键库函数 */
  6. #include <Ticker.h>     /* 引用延迟库函数 */
  7. #include <OneWire.h>
  8. #include <DallasTemperature.h>
  9. /************************* RGB引脚 **************************/
  10. //#define led_red    14
  11. //#define led_green 12
  12. //#define led_blue  13


  13. #define led_red    25
  14. #define led_green 26
  15. #define led_blue  27
  16. /* ********************wifi设置****************************/
  17. // char  auth[]  = "";
  18. // char  ssid[]  = "qq2260376628";
  19. // char  pswd[]  = "qq2260376628";


  20. // 定义DS18B20数据口连接ESP32的33号IO上
  21. #define ONE_WIRE_BUS 33

  22. // 定义Dadc号IO上
  23. #define adcio 35


  24. int address = 3500;                     /* eeprom 地址 */

  25. unsigned char ztmode, setmode1, setmode2,dingshinum2,setmode3;      /* 运行状态 */
  26. unsigned char r_value1, g_value1, b_value1;
  27. byte    r_value2, g_value2, b_value2, rgb_value2;
  28. unsigned int ycnum, ycnum1;  //定时返回
  29. unsigned int  lednum;
  30. unsigned char ggval, ggnum, wendui;           /* 光感 num */
  31. Ticker    dstime;                 /* 定时关闭 */
  32. Ticker    ontime;                 /* 开灯延迟 */
  33. Ticker    offtime;                /* 关灯延迟 */
  34. Ticker    ggtime;                 /* 光感循环函数 */
  35. Ticker    ggnumtime;              /* 光感循环函数 */
  36. Ticker    numtime;              /* 倒计时定时函数  */


  37. /* 新建组件对象 */
  38. BlinkerButton Button1( "btn-abc" );     /* 开关 */
  39. BlinkerButton Buttongg( "btn-gg" );     /* 光感模式 */
  40. BlinkerButton Buttontg( "btn-s11" );    /* 体感模式 */
  41. BlinkerButton Buttonsz( "btn-2z8" );    /* 设置 */
  42. BlinkerButton Buttonbc( "btn-i4n" );    /* 保存 */
  43. BlinkerRGB RGB1( "col-y9z" );           /* RGB */
  44. BlinkerNumber guanggan( "num-gg" );     /* 光感 */
  45. BlinkerSlider Slider( "ran-ilz" );      /* 进度条 */
  46. BlinkerButton Buttonzt( "btn-t1q" );    /* 状态 */
  47. BlinkerNumber dingshi1( "num-m0x" );     /* 光感 */
  48. /******************按键调用&&&&&&&&&&&&&&&&&&&&&*/
  49. OneButton button4( 4, true );

  50. // 初始连接在单总线上的单总线设备
  51. OneWire oneWire(ONE_WIRE_BUS);
  52. DallasTemperature sensors(&oneWire);
  53. /* *******************按键事件定时关闭****************************************/
  54. void flip()
  55. {
  56.   ggtime.detach();/* 感光循环定时器关闭 */
  57.   ontime.detach();/* 开灯延迟定时器关闭 */
  58.   offtime.attach_ms( 30, offledtime );/*关闭灯光*/
  59.   Button1.print( "off" );/* 反馈开关 关 */
  60.   numtime.detach();/* 上传延迟定时器关闭 */
  61.   dingshinum2=0;  
  62.   setmode1 = 4;/*关闭灯光loop 标识符*/
  63. }

  64. /* *************************上传倒计时时间****************************************/
  65. void dingshidelay1()
  66. {
  67.   
  68.   if(dingshinum2==ycnum)
  69.   {
  70.     numtime.detach();/* 上传延迟定时器关闭 */
  71.     dingshinum2=0;
  72.    
  73.   }
  74.   //
  75.   //BLINKER_LOG( "ycnum: ", ycnum );
  76.   //BLINKER_LOG( "dingshi: ", ycnum- dingshinum2 );
  77.   dingshinum2++;
  78. }
  79. /********************************** 按键事件回调函数********************************************/
  80. /* 单击 */
  81. void attachClick()
  82. {
  83.   Serial.println( "人体感应开" );
  84.   if ( setmode2 == 3 )
  85.   {
  86.     ontime.attach_ms( 30, onledtime );/* 灯光 开 */
  87.     Button1.print( "on" );/* 反馈开关 开 */
  88.     dstime.once( ycnum*60, flip );/*倒计时分钟*/
  89. // dingshinum2=ycnum;
  90.   dingshinum2=0;
  91.   numtime.attach( 60, dingshidelay1 );/*上传定时函数运算倒计时*/
  92.     setmode1 = 1;
  93.   }
  94. }


  95. void button_event_init()
  96. {
  97.   button4.reset();                        /* 清除一下按钮状态机的状态 */
  98.   button4.setDebounceTicks( 80 );         /* 设置消抖时长为80毫秒,默认值为:50毫秒 */
  99.   button4.attachClick( attachClick );     /* 初始化单击回调函数 */
  100. }


  101. /*按钮检测状态子程序 */
  102. void button_attach_loop()
  103. {
  104.   
  105.   button4.tick();/*不断检测按钮按下状态 */
  106. }
  107. /************************************定时时间回调***************************************/
  108. void slider_callback( int32_t value )
  109. {
  110.   BLINKER_LOG( "Buttongg_callback state: ", value );

  111.   
  112.   ycnum1 = value;
  113. }


  114. /*****************体感模式***************************************/
  115. void Buttontg_callback( const String & state )
  116. {
  117.   BLINKER_LOG( "Buttongg_callback state: ", state );
  118.     EEPROM.begin( 4096 );
  119.       EEPROM.write( 3506, 3 ); /* 给EEPROM 第0位,写入byte_1的值 */
  120.       EEPROM.commit();
  121.     EEPROM.end();
  122.   if ( state == "on" )
  123.   {
  124.     /* 反馈开关状态 */
  125.     Button1.print( "off" );/* 反馈开关 关 */
  126.     Buttongg.print( "off" );/* 反馈光感模式 关 */
  127.     Buttontg.print( "on" );/* 反馈体感模式 开 */
  128.     Buttonsz.print( "off" );/* 反馈设置 关 */
  129.     setmode2 = 3;

  130.     /* onled(0); */
  131.   } else if ( state == "off" )
  132.   {
  133.     /* 反馈开关状态 */
  134.     Button1.print( "off" );/* 反馈开关 关 */
  135.     Buttongg.print( "off" );/* 反馈光感模式 关 */
  136.     Buttontg.print( "off" );/* 反馈体感模式 关 */
  137.     Buttonsz.print( "off" );/* 反馈设置 关 */
  138.   dstime.detach();               /* 定时关闭 */
  139.   ontime.detach();                /* 开灯延迟 */
  140.   offtime.detach();                /* 关灯延迟 */
  141.   ggtime.detach();                /* 光感循环函数 */
  142.   numtime.detach();             /* 倒计时定时函数  */  

  143. /*
  144. *  offled(0);
  145. * detach();
  146. */setmode2= 0;
  147.     setmode1 = 0;
  148.   }
  149. }



  150. /* **********************************************************开灯开灯回调函数*/
  151. void onledtime()
  152. {
  153.   ledcWrite( 0, map( lednum, 0, rgb_value2, 0, r_value2 ) );      /* 红色 */
  154.   ledcWrite( 1, map( lednum, 0, rgb_value2, 0, g_value2 ) );    /* 绿色 */
  155.   ledcWrite( 2, map( lednum, 0, rgb_value2, 0, b_value2 ) );
  156.   /*
  157.    *
  158.    * BLINKER_LOG( "lednum: ", lednum );
  159.    */
  160.   if ( lednum >= 257 )
  161.   {
  162.     lednum = 255;
  163.   }
  164.   /* BLINKER_LOG( "onenum: ", lednum ); */
  165.   lednum++;
  166. }


  167. /*****************开灯关闭***************************************/
  168. void offledtime()
  169. {
  170.   ledcWrite( 0, map( lednum, 0, rgb_value2, 0, r_value2 ) );      /* 红色 */
  171.   ledcWrite( 1, map( lednum, 0, rgb_value2, 0, g_value2 ) );    /* 绿色 */
  172.   ledcWrite( 2, map( lednum, 0, rgb_value2, 0, b_value2 ) );

  173.   /* BLINKER_LOG( "offnum: ", lednum ); */
  174.   lednum--;
  175. }


  176. /*****************开关模式***************************************/
  177. /* 按下按键即会执行该函数 */
  178. void button1_callback( const String & state )
  179. {
  180.   BLINKER_LOG( "get  button1_ state: ", state );

  181.   /*****************开灯打开***************************************/
  182. dstime.detach();               /* 定时关闭 */
  183. ontime.detach();                /* 开灯延迟 */
  184. offtime.detach();                /* 关灯延迟 */
  185. ggtime.detach();                /* 光感循环函数 */
  186. numtime.detach();             /* 倒计时定时函数  */

  187.   if ( state == "on" )
  188.   {
  189.     /* 反馈开关状态 */
  190.     Button1.print( "on" );/* 反馈开关 开 */
  191.     Buttongg.print( "off" );/* 反馈光感模式 关 */
  192.     Buttontg.print( "off" );/* 反馈体感模式 关 */
  193.     Buttonsz.print( "off" );/* 反馈设置 关 */

  194.     /* lednum = 0; */
  195.     ontime.attach_ms( 30, onledtime );/* 灯光 开 */


  196.     setmode1 = 1;
  197.   } else if ( state == "off" )
  198.   {
  199.     /*****************开灯关闭***************************************/
  200.     /* 反馈开关状态 */
  201.     Button1.print( "off" );/* 反馈开关 关 */
  202.     Buttongg.print( "off" );/* 反馈光感模式 关 */
  203.     Buttontg.print( "off" );/* 反馈体感模式 关 */
  204.     Buttonsz.print( "off" );/* 反馈设置 关 */

  205.     offtime.attach_ms( 30, offledtime );


  206.     setmode1 = 4;
  207.   }
  208. }



  209. /* ******************************感光数据返回回调函数定时1s 一次*********************/
  210. void ggnum1time()
  211. {
  212.   ggnum = analogRead( adcio ); /*感光数据获取0-1023*/
  213.   sensors.requestTemperatures(); // 发送命令获取温度  
  214.    wendui=sensors.getTempCByIndex(0);
  215. }

  216. /* ******************************感光数据上传数据*****************************/
  217. void heartbeat()
  218. {
  219.   unsigned char val;
  220.   val = map( ggnum, 0, 1023, 0, 100 );
  221.   //BLINKER_LOG( "光感B  ", val );
  222.   guanggan.print( val );/*上传感光数据*/
  223.   dingshi1.print( ycnum- dingshinum2);/*定时时间上传*/
  224. }
  225. /* ******************************感光数据上传数据*****************************/
  226. void dataStorage() {
  227.   unsigned char val;
  228.   val = map( ggnum, 0, 1023, 0, 100 );
  229.   //BLINKER_LOG( "光感B  ", val );
  230.   Blinker.dataStorage("gnum", val);
  231.     Blinker.dataStorage("weidu", wendui);
  232. }

  233. /************************************光感打开回调*/
  234. void ggledtimeon()
  235. {
  236.   /* BLINKER_LOG("光感 a ", ggnum); */
  237.   if ( ggnum <= 40 && ggval == 0 )
  238.   {
  239.     /*  BLINKER_LOG("光感1  ", ggnum); */
  240.     offtime.detach();

  241.     ontime.attach_ms( 30, onledtime );/* 灯光 开 */

  242.     ggval   = 1;
  243.     setmode1  = 1;
  244.   }
  245.   if ( ggnum >= 160 && ggval == 1 )
  246.   {
  247.     /* BLINKER_LOG("光感2 ", ggnum); */
  248.     ontime.detach();/* 开灯延迟定时器关闭 */

  249.     offtime.attach_ms( 30, offledtime );
  250.     ggval = 0;

  251.     setmode1 = 4;
  252.   }

  253.   /*  */
  254. }


  255. /*****************光感模式***************************************/
  256. void Buttongg_callback( const String & state )
  257. {
  258.   BLINKER_LOG( "Buttongg_callback state: ", state );
  259.   ledcWrite( 0, 0 );      /* 首先,先把所有的灯都关闭 */
  260.   ledcWrite( 1, 0 );    /* 可以随意设置开启关闭哪些灯,搭配出不同组合有不同颜色 */
  261.   ledcWrite( 2, 0 );
  262.   Buttonzt.print( "off" );
  263.   if ( state == "on" )
  264.   {
  265.     /* 反馈开关状态 */
  266.     Button1.print( "off" );/* 反馈开关 关 */
  267.     Buttongg.print( "on" );
  268.     Buttontg.print( "off" );/* 反馈体感模式 关 */
  269.     Buttonsz.print( "off" );/* 反馈设置 关 */
  270.     /* setmode1 = 2; */


  271.     offtime.detach();
  272.     ontime.detach();/* 开灯延迟定时器关闭 */
  273.     lednum = 0;
  274.     ggtime.attach_ms( 500, ggledtimeon );
  275.   } else if ( state == "off" )
  276.   {
  277.     /* 反馈开关状态 */
  278.     Button1.print( "off" );/* 反馈开关 关 */
  279.     Buttongg.print( "off" );/* 反馈光感模式 关 */
  280.     Buttontg.print( "off" );/* 反馈体感模式 关 */
  281.     Buttonsz.print( "off" );/* 反馈设置 关 */

  282.     ontime.detach();/* 开灯延迟定时器关闭 */
  283.     lednum = 0;
  284.     ggtime.detach();/* 感光循环定时器关闭 */


  285.     setmode1 = 0;
  286.   }
  287. }


  288. /*****************设置***************************************/
  289. void Buttonsz_callback( const String & state )
  290. {
  291.   BLINKER_LOG( "Buttongg_callback state: ", state );
  292.   if ( state == "on" )
  293.   {
  294.     /* 反馈开关状态 */
  295.     Buttonzt.print( "on" );
  296.     Buttonsz.print( "on" );
  297.     Button1.print( "off" );/* 反馈开关 关 */
  298.     Buttongg.print( "off" );/* 反馈光感模式 关 */
  299.     Buttontg.print( "off" );/* 反馈体感模式 关 */
  300.     ztmode = 1; /* 设置 */
  301.   } else if ( state == "off" )
  302.   {
  303.     /* 反馈开关状态 */
  304.     Buttonsz.print( "off" );/* 反馈设置 关 */
  305.     Button1.print( "off" );/* 反馈开关 关 */
  306.     Buttongg.print( "off" );/* 反馈光感模式 关 */
  307.     Buttontg.print( "off" );/* 反馈体感模式 关 */
  308.     ztmode = 0;
  309.   }
  310. }


  311. /*****************颜色调节***************************************/


  312. void rgb1_callback( unsigned char r_value, unsigned char g_value,
  313.         unsigned char b_value, unsigned char bright_value )
  314. {
  315.   bright_value = 255 - bright_value;
  316.   if ( bright_value > r_value )
  317.   {
  318.     r_value1 = 0;
  319.   }else{ r_value1 = r_value - bright_value; }
  320.   if ( bright_value > g_value )
  321.   {
  322.     g_value1 = 0;
  323.   }else{ g_value1 = g_value - bright_value; }
  324.   if ( bright_value > b_value )
  325.   {
  326.     b_value1 = 0;
  327.   }else{ b_value1 = b_value - bright_value; }


  328.   if ( ztmode == 1 )
  329.   {
  330.     ledcWrite( 0, r_value1 );       /* 首先,先把所有的灯都关闭 */
  331.     ledcWrite( 1, g_value1 );     /* 可以随意设置开启关闭哪些灯,搭配出不同组合有不同颜色 */
  332.     ledcWrite( 2, b_value1 );
  333.   }
  334. }


  335. /*****************保存***************************************/
  336. void Buttonbc_callback( const String & state )
  337. {
  338.   BLINKER_LOG( "Buttongg_callback state: ", state );

  339.   if ( state == "tap" )
  340.   {
  341.     /* 反馈开关状态 */
  342.     if ( ztmode == 1 )
  343.     {
  344.       EEPROM.begin( 4096 );
  345.       EEPROM.write( 3500, r_value1 ); /* 给EEPROM 第0位,写入byte_1的值 */
  346.       EEPROM.commit();
  347.       EEPROM.write( 3501, g_value1 ); /* 给EEPROM 第0位,写入byte_1的值 */
  348.       EEPROM.commit();
  349.       EEPROM.write( 3502, b_value1 );
  350.       EEPROM.commit();
  351.       EEPROM.write( 3503, ycnum1 );
  352.       EEPROM.commit();
  353.    
  354.       r_value2  = r_value1;
  355.       g_value2  = g_value1;
  356.       b_value2  = b_value1;
  357. /*****************熄灭灯光***************************************/
  358.       ledcWrite( 0, 0 );      /* 首先,先把所有的灯都关闭 */
  359.       ledcWrite( 1, 0 );    /* 可以随意设置开启关闭哪些灯,搭配出不同组合有不同颜色 */
  360.       ledcWrite( 2, 0 );
  361.       if ( g_value2 <= r_value2 )
  362.       {
  363.         rgb_value2 = r_value2;
  364.       }else{ rgb_value2 = g_value2; }
  365.       if ( rgb_value2 <= b_value2 )
  366.       {
  367.         rgb_value2 = b_value2;
  368.       }

  369.     dingshi1.print( ycnum1);
  370.       /*
  371.        *  BLINKER_LOG( "R value: ", r_value1 );
  372.        *  BLINKER_LOG( "G value: ", g_value1 );
  373.        *  BLINKER_LOG( "B value: ", b_value1 );
  374.        *  r_value2  = EEPROM.read( 3500 );
  375.        *  g_value2  = EEPROM.read( 3501 );
  376.        *  b_value2  = EEPROM.read( 3502 );
  377.        *  BLINKER_LOG( "R value: ", r_value2 );
  378.        *
  379.        *  BLINKER_LOG( "G value: ", g_value2 );
  380.        *
  381.        *  BLINKER_LOG( "B value: ", b_value2 );*/
  382.       EEPROM.end();
  383.       Button1.print( "off" );/* 反馈开关 关 */
  384.       Buttonsz.print( "off" );/* 反馈设置 关 */
  385.       Buttonzt.print( "off" );  
  386.       Buttongg.print( "off" );/* 反馈光感模式 关 */

  387.   if(setmode3==3)
  388.   {
  389.     Buttontg.print( "on" );/* 反馈体感模式 开 */
  390.     setmode2 = 3;
  391.    
  392.   }



  393. ztmode = 0;
  394.     }
  395.   }
  396. }


  397. void setup()
  398. {
  399.   Serial.begin( 115200 ); /* 初始化串口 */
  400.   button_event_init();    /*按钮事件初始化 */
  401.   BLINKER_DEBUG.stream( Serial );
  402.   Blinker.begin( auth, ssid, pswd );
  403.   Blinker.attachDataStorage(dataStorage);
  404.   EEPROM.begin( 4096 );
  405.   r_value2  = EEPROM.read( 3500 );
  406.   g_value2  = EEPROM.read( 3501 );
  407.   b_value2  = EEPROM.read( 3502 );
  408.   ycnum   = EEPROM.read( 3503 );
  409.    setmode3  = EEPROM.read( 3506 );  /* 1为开关开,2为光感 3为体感,4为开关开 */
  410.    dingshi1.print( ycnum);/*定时时间上传*/
  411.   if ( g_value2 <= r_value2 )
  412.   {
  413.     rgb_value2 = r_value2;
  414.   }else{ rgb_value2 = g_value2; }
  415.   if ( rgb_value2 <= b_value2 )
  416.   {
  417.     rgb_value2 = b_value2;
  418.   }
  419.   
  420.   Button1.print( "off" );/* 反馈开关 关 */
  421.     Buttongg.print( "off" );/* 反馈光感模式 关 */
  422.     Buttontg.print( "off" );/* 反馈体感模式 关 */
  423.     Buttonsz.print( "off" );/* 反馈设置 关 */
  424.   //pwm//
  425.   pinMode(25,OUTPUT);
  426. pinMode(26,OUTPUT);
  427. pinMode(27,OUTPUT);
  428. ledcSetup(0,50000,8); //LEDC的PWM通道参数,可选0~15;10Hz到40MHz , 但较高的频率精确度低; 占空比分辨率(可选1~16), 比如bit_num=8 则范围 0~2的8次方 , 也就是0~255
  429. ledcSetup(1,50000,8);
  430. ledcSetup(2,50000,8);
  431. ledcAttachPin(25,0);
  432. ledcAttachPin(26,1);
  433. ledcAttachPin(27,2);
  434.   
  435.   if(setmode3==3)
  436.   {
  437.     Buttontg.print( "on" );/* 反馈体感模式 开 */
  438.     setmode2 = 3;
  439.    
  440.   }

  441.   /*
  442.    * BLINKER_DEBUG.debugAll();
  443.    *   EEPROM.begin(4096);                  //开启EEPROM,开辟1024个位空间
  444.    */


  445.   /* 初始化有LED的IO */


  446.   /*
  447.    * 初始化blinker
  448.    *
  449.    * 初始化绑定按键
  450.    */
  451.   Button1.attach( button1_callback );     /* 开关 */
  452.   Buttongg.attach( Buttongg_callback );   /* 光感模式 */
  453.   Buttontg.attach( Buttontg_callback );   /* 体感模式 */
  454.   Buttonsz.attach( Buttonsz_callback );   /* 设置模式 */
  455.   Buttonbc.attach( Buttonbc_callback );   /* 保存模式 */

  456.   Slider.attach( slider_callback );       /* 设置时间 */
  457.   ggnumtime.attach( 1, ggnum1time );      /* 感光 */

  458. /* 初始化rgb */
  459.   RGB1.attach( rgb1_callback );

  460.   /* 注册一个心跳包 */
  461.   Blinker.attachHeartbeat( heartbeat );
  462.   ledcWrite( 0, 0 );              /* 红色 */
  463.   ledcWrite( 1, 0 );            /* 绿色 */
  464.   ledcWrite( 2, 0 );

  465.     // 初始库
  466.   sensors.begin();
  467. }


  468. void loop()
  469. {
  470.   Blinker.run();

  471.   button_attach_loop();
  472.   /* 1为开关开,2为光感 3为体感,4为开关开 */
  473.   switch ( setmode1 )
  474.   {
  475.   case 1:
  476.     if ( rgb_value2 <= lednum )
  477.     {
  478.       ontime.detach();/* 开灯延迟定时器关闭 */
  479.       offtime.detach();
  480.       setmode1 = 0;
  481.       Buttonzt.print( "on" );
  482.     }

  483.     break;
  484.   case 4:  /*BLINKER_LOG( "ednum: ", lednum );*/
  485.     if ( 0 >= lednum )
  486.     {
  487.       ontime.detach();/* 开灯延迟定时器关闭 */
  488.       offtime.detach();
  489.       ledcWrite( 0, 0 );      /* 红色 */
  490.       ledcWrite( 1, 0 );    /* 绿色 */
  491.       ledcWrite( 2, 0 );
  492.       setmode1 = 0; lednum = 0;
  493.       Buttonzt.print( "off" );
  494.     }

  495.     break;
  496.   case 3:


  497.     break;
  498.   default: break;
  499.   }
  500. }
复制代码
cs.pdf (77.02 KB, 下载次数: 9)


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 09:35 , Processed in 0.089601 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表