Blinker项目实例:Nodemcu驱动ws2812(附项目代码)-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: ly_wcy

[分享] Blinker项目实例:Nodemcu驱动ws2812(附项目代码)

[复制链接]
发表于 2020-6-1 00:28 | 显示全部楼层
本帖最后由 涟水河 于 2020-6-2 11:15 编辑

搞定了,

这个可以编译通过的,还是楼主的,只是重新排了下

  1. #include <ESP8266LLMNR.h>

  2. #define BLINKER_WIFI
  3. #include <Blinker.h>
  4. #include <math.h>
  5. char auth[] = "********";//IoT秘钥
  6. char ssid[] = "***";//wifi名称
  7. char pswd[] = "*******"; //wifi秘钥

  8. bool tab[5] = { false };
  9. bool modestate[4] = { false }; //工作模式选项卡
  10. bool AutoBit = false; //判断手动模式是否有效
  11. bool SingleAdjust = false; //判断逐个调节是否有效
  12. int LEDserial = 0; //
  13. int Offset = 30; //灯珠整体移动若干单位
  14. #include <Adafruit_NeoPixel.h>
  15. #ifdef __AVR__  
  16. #include <avr/power.h>
  17. #endif
  18. #if defined (__AVR_ATtiny85__)  
  19. if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  20. #endif  
  21. #define PIN            5
  22. #define NUMPIXELS      30
  23. #define RGB_1 "RGBKey"
  24. #define Tab_1 "tab-mode"
  25. #define Number_1 "LEDNum"
  26. #define Number_2 "LED_R"
  27. #define Number_3 "LED_G"
  28. #define Number_4 "LED_B"  
  29. BlinkerRGB WS2812(RGB_1);
  30. BlinkerTab Tab1(Tab_1);//定义数据结构
  31. Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
  32. BlinkerNumber Number1 (Number_1);
  33. BlinkerNumber Number2 (Number_2);
  34. BlinkerNumber Number3 (Number_3);
  35. BlinkerNumber Number4 (Number_4); //*************************************************************//选项卡触发函数
  36. void tab1_callback(uint8_t tab_set) {   //BLINKER_LOG("get tab set: ", tab_set);
  37.   digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  38.   switch (tab_set)    {
  39.     case BLINKER_CMD_TAB_0 :
  40.       tab[0] = true;            //BLINKER_LOG("tab 0 set");
  41.       AutoBit = !AutoBit; //手动位取反
  42.       break;
  43.     case BLINKER_CMD_TAB_1 :
  44.       tab[1] = true;            //BLINKER_LOG("tab 1 set");
  45.       Mode1();//开启Mode1,灯光模式1
  46.       break;
  47.     case BLINKER_CMD_TAB_2 :
  48.       tab[2] = true;            //BLINKER_LOG("tab 2 set");
  49.       SingleAdjust = !SingleAdjust; //开启Mode2,灯光模式2            break;
  50.     case BLINKER_CMD_TAB_3 :
  51.       tab[3] = true;            //BLINKER_LOG("tab 3 set");
  52.       Mode3();//开启Mode3,流水灯模式
  53.       break;
  54.     case BLINKER_CMD_TAB_4 :
  55.       tab[4] = true;            //BLINKER_LOG("tab 4 set");
  56.       break;
  57.     default:
  58.       break;
  59.   }
  60. }
  61. void tab1_feedback() {

  62.   for (uint8_t num = 0; num < 5; num++)    {
  63.     if (tab[num])        {
  64.       Tab1.tab(num);
  65.       tab[num] = false;
  66.     }
  67.   }
  68.   Tab1.print();
  69. }  //*******************************************************************//自由模式整体调节/逐个调节服务函数
  70. void ws2812_callback(uint8_t r_value, uint8_t g_value, uint8_t b_value, uint8_t bright_value)
  71. {   
  72. digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));   
  73. if (AutoBit==true)
  74.    {
  75.   digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));         
  76.    Mode0(r_value,g_value,b_value,bright_value);
  77.    //return NULL;
  78.    }   
  79.   else if (SingleAdjust == true)
  80.   {
  81.     digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  82.     Mode2(r_value, g_value, b_value, bright_value);
  83.   }
  84. }
  85. //********************************************************************//自由控制(整体调节)Mode0
  86. void Mode0(uint8_t r_value, uint8_t g_value, uint8_t b_value, uint8_t bright_value) {
  87.   pixels.setBrightness(bright_value);
  88.   for (int i = 0; i < NUMPIXELS; i++) {
  89.     pixels.setPixelColor(i, r_value, g_value, b_value);
  90.   }
  91.   pixels.show();
  92.   Number2.print(r_value);
  93.   Number3.print(g_value);
  94.   Number4.print(b_value);
  95. }
  96. //********************************************************************//七色模式Mode1
  97. void Mode1() {
  98.   int r = 0;    int g = 0;    int b = 0;    int i = 0;    int full = NUMPIXELS;
  99.   digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  100.   for (int i = 0; i < NUMPIXELS; i++) {
  101.     if (i < full / 3) {
  102.       r = 255;             //********************************************************************//逐个调节Mode2
  103.       g = ceil(255 * 3 * i / full);
  104.       b = 0;
  105.     } else if (i < full / 2) {
  106.       r = ceil(750 - i * (250 * 6 / full));
  107.       g = 255;
  108.       b = 0;
  109.     } else if (i < full * 2 / 3) {
  110.       r = 0;
  111.       g = 255;
  112.       b = ceil(i * (250 * 6 / full) - 750);
  113.     } else if (i < full * 5 / 6) {
  114.       r = 0;
  115.       g = ceil(1250 - i * (250 * 6 / full));
  116.       b = 255;
  117.     } else {
  118.       r = ceil(150 * i * (6 / full) - 750);
  119.       g = 0;
  120.       b = 255;
  121.     }             pixels.setPixelColor(i, pixels.Color(r, g, b));
  122.   }    pixels.show();
  123. }
  124. void Mode2(uint8_t r_value, uint8_t g_value, uint8_t b_value, uint8_t bright_value) {
  125.   pixels.setBrightness(bright_value);     //*******************************************************************//护眼照明模式 黄光Mode3
  126.   pixels.setPixelColor(LEDserial, r_value, g_value, b_value);
  127.   pixels.show();
  128.   LEDserial = LEDserial + 1;
  129.   LEDserial = LEDserial % NUMPIXELS;
  130.   Number2.print(r_value);
  131.   Number3.print(g_value);
  132.   Number4.print(b_value);
  133. }
  134. void Mode3() {
  135.   int bright_value = 200;         //*******************************************************************//显示数值
  136.   int r_value = 255;
  137.   int g_value = 215;
  138.   int b_value = 0;
  139.   pixels.setBrightness(bright_value);
  140.   for (int i = 0; i < NUMPIXELS; i++) {
  141.     pixels.setPixelColor(i, r_value, g_value, b_value);
  142.   }               pixels.show();
  143.   Number2.print(r_value);
  144.   Number3.print(g_value);
  145.   Number4.print(b_value);
  146. }
  147. void dataRead(const String & data) {
  148.   uint32_t BlinkerTime = millis();      //*********************************************************************
  149.   Number1.print(BlinkerTime / 1000);
  150. }
  151. void setup() {
  152.   Serial.begin(115200);    BLINKER_DEBUG.stream(Serial);        Blinker.attachData(dataRead);     pinMode(LED_BUILTIN, OUTPUT);//引脚设置为输出模式
  153.   digitalWrite(LED_BUILTIN, LOW);     Blinker.begin(auth, ssid, pswd);       pixels.begin();//开启pixel对ws2812输出
  154.   WS2812.attach(ws2812_callback);
  155.   Tab1.attach(tab1_callback,
  156.               tab1_feedback);
  157. }
  158. void loop() {
  159.   Blinker.run();
  160. }
复制代码





发表于 2021-1-25 17:44 | 显示全部楼层
涟水河 发表于 2020-6-1 00:28
搞定了,

这个可以编译通过的,还是楼主的,只是重新排了下

能帮我看下,问题出在哪吗?
提示Arduino:1.8.13 (Windows 7), 开发板:"NodeMCU 1.0 (ESP-12E Module), 80 MHz, Flash, Legacy (new can return nullptr), All SSL ciphers (most compatible), 4MB (FS:2MB OTA:~1019KB), 2, v2 Lower Memory, Disabled, None, Only Sketch, 115200"





















E:\单片机\氛围灯\1.25\1.25\1.251\1.251.ino: In function 'void tab1_callback(uint8_t)':

1.251:45:13: error: 'Mode1' was not declared in this scope

1.251:53:13: error: 'Mode3' was not declared in this scope

E:\单片机\氛围灯\1.25\1.25\1.251\1.251.ino: In function 'void button1_callback(const String&)':

1.251:138:50: error: 'SET_RGB' was not declared in this scope

1.251:139:27: error: 'SET_RGB' was not declared in this scope

E:\单片机\氛围灯\1.25\1.25\1.251\1.251.ino: In function 'void Mode0(uint32_t, int)':

1.251:143:18: error: 'strip' was not declared in this scope

1.251:149:37: error: a function-definition is not allowed here before '{' token

1.251:355:1: error: expected '}' at end of input

exit status 1

'Mode1' was not declared in this scope



在文件 -> 首选项开启
“编译过程中显示详细输出”选项
这份报告会包含更多信息。

#include <Adafruit_NeoPixel.h>

#define BLINKER_PRINT Serial
#define BLINKER_WIFI
#define BLINKER_MIOT_LIGHT

#include <Blinker.h>
#include <Adafruit_NeoPixel.h>

char auth[] = "64e4f6335177";
char ssid[] = "LYH";
char pswd[] = "lyh788799";

bool tab[4] = { false };
bool modestate[4] = { false }; //工作模式选项卡
bool AutoBit = false; //判断手动模式是否有效
bool SingleAdjust = false; //判断逐个调节是否有效
int LEDserial = 15; //
int Offset = 60; //灯珠整体移动若干单位
#define PIN 15  //  DIN PIN (GPIO15, D8)
#define NUMPIXELS 60  // Number of you led
#define RGB_1 "RGBKey"
#define Tab_1 "tab-mode"
#define Number_1 "LEDNum"
#define Number_2 "LED_R"
#define Number_3 "LED_G"
#define Number_4 "LED_B"  
BlinkerRGB WS2812(RGB_1);
BlinkerButton Button1("key");
BlinkerTab Tab1(Tab_1);//定义数据结构
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
BlinkerNumber Number1 (Number_1);
BlinkerNumber Number2 (Number_2);
BlinkerNumber Number3 (Number_3);
BlinkerNumber Number4 (Number_4); //*************************************************************//选项卡触发函数
void tab1_callback(uint8_t tab_set) {   //BLINKER_LOG("get tab set: ", tab_set);
  digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  switch (tab_set)    {
    case BLINKER_CMD_TAB_0 :
      tab[0] = true;            //BLINKER_LOG("tab 0 set");
      AutoBit = !AutoBit; //手动位取反
      break;
    case BLINKER_CMD_TAB_1 :
      tab[1] = true;            //BLINKER_LOG("tab 1 set");
      Mode1();//开启Mode1,
      break;
    case BLINKER_CMD_TAB_2 :
      tab[2] = true;            //BLINKER_LOG("tab 2 set");
      SingleAdjust = !SingleAdjust; //开启Mode2,         
      break;
    case BLINKER_CMD_TAB_3 :
      tab[3] = true;            //BLINKER_LOG("tab 3 set");
      Mode3();//开启Mode3,
      break;
    case BLINKER_CMD_TAB_4 :
      tab[4] = true;            //BLINKER_LOG("tab 4 set");
      break;
    default:
      break;
  }
}
void tab1_feedback() {

  for (uint8_t num = 0; num < 5; num++)    {
    if (tab[num])        {
      Tab1.tab(num);
      tab[num] = false;
    }
  }
  Tab1.print();
}

/***************配网函数**************/
bool WIFI_Status = true;
void smartConfig()//配网函数
{
  WiFi.mode(WIFI_STA);
  Serial.println("\r\nWait for Smartconfig...");
  WiFi.beginSmartConfig();//等待手机端发出的用户名与密码
  while (1)
  {
    Serial.print(".");
    digitalWrite(LED_BUILTIN, HIGH);  
    delay(1000);                     
    digitalWrite(LED_BUILTIN, LOW);   
    delay(1000);                     
    if (WiFi.smartConfigDone())//退出等待
    {
      Serial.println("SmartConfig Success");
      Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
      Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
      break;
    }
  }
}
void WIFI_Set()//
{
    //Serial.println("\r\n正在连接");
    int count = 0;
    while(WiFi.status()!=WL_CONNECTED)
    {
        if(WIFI_Status)
        {
            Serial.print(".");
            digitalWrite(LED_BUILTIN, HIGH);  
            delay(500);                       
            digitalWrite(LED_BUILTIN, LOW);   
            delay(500);                 
            count++;
            if(count>=5)//5s
            {
                WIFI_Status = false;
                Serial.println("WiFi连接失败,请用手机进行配网");
            }
        }
        else
        {
            smartConfig();  //微信智能配网
        }
     }  
    /* Serial.println("连接成功");  
     Serial.print("IP:");
     Serial.println(WiFi.localIP());*/
}



int counter = 0;
int LED_R=0,LED_G=0,LED_B=0,LED_Bright=255;// RGB和亮度
bool LED_Flag = false;

void button1_callback(const String & state)
{
    BLINKER_LOG("get button state: ", state);
    Blinker.print(state);
    //digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
      LED_Flag = !LED_Flag;
      if(LED_Flag) SET_RGB(255,255,255,LED_Bright);
      else SET_RGB(0,0,0,0);
}

void Mode0(uint32_t color, int wait){
  for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
    strip.setPixelColor(i, color);         //  Set pixel's color (in RAM)
    strip.show();                          //  Update strip to match
    delay(wait);                           //  Pause for a moment
}

void Mode1(uint32_t color, int wait){
  for(int a=0; a<10; a++) {  // Repeat 10 times...
    for(int b=0; b<3; b++) { //  'b' counts from 0 to 2...
      strip.clear();         //   Set all pixels in RAM to 0 (off)
      // 'c' counts up from 'b' to end of strip in steps of 3...
      for(int c=b; c<strip.numPixels(); c += 3) {
        strip.setPixelColor(c, color); // Set pixel 'c' to value 'color'
      }
      strip.show(); // Update strip with new contents
      delay(wait);  // Pause for a moment
    }
  }
}

void Mode2(int wait){
  // Hue of first pixel runs 5 complete loops through the color wheel.
  // Color wheel has a range of 65536 but it's OK if we roll over, so
  // just count from 0 to 5*65536. Adding 256 to firstPixelHue each time
  // means we'll make 5*65536/256 = 1280 passes through this outer loop:
  for(long firstPixelHue = 0; firstPixelHue < 5*65536; firstPixelHue += 256) {
    for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
      // Offset pixel hue by an amount to make one full revolution of the
      // color wheel (range of 65536) along the length of the strip
      // (strip.numPixels() steps):
      int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
      // strip.ColorHSV() can take 1 or 3 arguments: a hue (0 to 65535) or
      // optionally add saturation and value (brightness) (each 0 to 255).
      // Here we're using just the single-argument hue variant. The result
      // is passed through strip.gamma32() to provide 'truer' colors
      // before assigning to each pixel:
      strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
    }
    strip.show(); // Update strip with new contents
    delay(wait);  // Pause for a moment
  }
}

void Mode3(int wait){
  int firstPixelHue = 0;     // First pixel starts at red (hue 0)
  for(int a=0; a<30; a++) {  // Repeat 30 times...
    for(int b=0; b<3; b++) { //  'b' counts from 0 to 2...
      strip.clear();         //   Set all pixels in RAM to 0 (off)
      // 'c' counts up from 'b' to end of strip in increments of 3...
      for(int c=b; c<strip.numPixels(); c += 3) {
        // hue of pixel 'c' is offset by an amount to make one full
        // revolution of the color wheel (range 65536) along the length
        // of the strip (strip.numPixels() steps):
        int      hue   = firstPixelHue + c * 65536L / strip.numPixels();
        uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB
        strip.setPixelColor(c, color); // Set pixel 'c' to value 'color'
      }
      strip.show();                // Update strip with new contents
      delay(wait);                 // Pause for a moment
      firstPixelHue += 65536 / 90; // One cycle of color wheel over 90 frames
    }
  }
}
void dataRead(const String & data)
{
    BLINKER_LOG("Blinker readString: ", data);
    counter=counter;
    Number1.print(counter);
}


void SET_RGB(int R,int G,int B,int bright)
{
    for (uint16_t i = 0; i < NUMPIXELS; i++) //把灯条变色
    {
        pixels.setPixelColor(i,R,G,B);
    }
    pixels.setBrightness(bright);//亮度
    pixels.show();    //送出显示
}
//APP RGB颜色设置回调
void rgb1_callback(uint8_t r_value, uint8_t g_value,
                    uint8_t b_value, uint8_t bright_value)
{
   
    //digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
    BLINKER_LOG("R value: ", r_value);
    BLINKER_LOG("G value: ", g_value);
    BLINKER_LOG("B value: ", b_value);
    BLINKER_LOG("Rrightness value: ", bright_value);
    LED_Bright = bright_value;
    SET_RGB(r_value,g_value,b_value,LED_Bright);
}


//小爱电源类回调
void miotPowerState(const String & state)
{
    BLINKER_LOG("need set power state: ", state);

    if (state == BLINKER_CMD_ON) {
        //digitalWrite(LED_BUILTIN, LOW);
        SET_RGB(255,255,255,255);        
        BlinkerMIOT.powerState("on");
        BlinkerMIOT.print();
    }
    else if (state == BLINKER_CMD_OFF) {
        //digitalWrite(LED_BUILTIN, HIGH);
        SET_RGB(255,255,255,0);
        BlinkerMIOT.powerState("off");
        BlinkerMIOT.print();
    }
}
//小爱设置颜色回调
void miotColor(int32_t color)
{
    BLINKER_LOG("need set color: ", color);
    int colorR,colorG,colorB;
    colorR = color >> 16 & 0xFF;
    colorG = color >>  8 & 0xFF;
    colorB = color       & 0xFF;

    BLINKER_LOG("colorR: ", colorR, ", colorG: ", colorG, ", colorB: ", colorB);
    SET_RGB(colorR,colorG,colorB,LED_Bright);
    //pixelShow();

    BlinkerMIOT.color(color);//反馈小爱控制状态
    BlinkerMIOT.print();
}
//小爱调亮度回调
void miotBright(const String & bright)
{
    BLINKER_LOG("need set brightness: ", bright);

    int colorW = bright.toInt();

    BLINKER_LOG("now set brightness: ", colorW);
    LED_Bright = colorW;
    SET_RGB(LED_R,LED_G,LED_B,LED_Bright);
    Serial.printf("亮度调节中...%d",colorW);
   
    BlinkerMIOT.brightness(colorW);//反馈小爱控制状态
    BlinkerMIOT.print();
}












void setup() {
    // 初始化串口
    Serial.begin(115200);
    pixels.begin();//WS2812初始化
    pixels.show();
    pinMode(LED_BUILTIN, OUTPUT);
    #if defined(BLINKER_PRINT)
    BLINKER_DEBUG.stream(BLINKER_PRINT);
    #endif
    Serial.begin(115200);    BLINKER_DEBUG.stream(Serial);        Blinker.attachData(dataRead);     pinMode(LED_BUILTIN, OUTPUT);//引脚设置为输出模式
  digitalWrite(LED_BUILTIN, LOW);     Blinker.begin(auth, ssid, pswd);       pixels.begin();//开启pixel对ws2812输出
  WS2812.attach(ws2812_callback);
  Tab1.attach(tab1_callback,
              tab1_feedback);
   }
    // These lines are specifically to support the Adafruit Trinket 5V 16 MHz.
    // Any other board, you can remove this part (but no harm leaving it):
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif
  // END of Trinket-specific code.

  strip.begin();           // INITIALIZE NeoPixel strip object (REQUIRED)
  strip.show();            // Turn OFF all pixels ASAP
  strip.setBrightness(50); // Set BRIGHTNESS to about 1/5 (max = 255)         
   
    WIFI_Set();
    // 初始化blinker
    Blinker.begin(auth, WiFi.SSID().c_str(), WiFi.psk().c_str());

   
    Blinker.attachData(dataRead);//如果没有被绑定的组件被触发就执行这个回调
    Button1.attach(button1_callback);//Button1这个组件被触发就执行这个回调
    RGB1.attach(rgb1_callback);//注册调节颜色的回调函数
    BlinkerMIOT.attachPowerState(miotPowerState);
    BlinkerMIOT.attachColor(miotColor);//小爱调节颜色
    BlinkerMIOT.attachBrightness(miotBright);//小爱调节RGB亮度
}

void loop()
{
  // Fill along the length of the strip in various colors...
  colorWipe(strip.Color(255,   0,   0), 50); // Red
  colorWipe(strip.Color(  0, 255,   0), 50); // Green
  colorWipe(strip.Color(  0,   0, 255), 50); // Blue

  // Do a theater marquee effect in various colors...
  theaterChase(strip.Color(127, 127, 127), 50); // White, half brightness
  theaterChase(strip.Color(127,   0,   0), 50); // Red, half brightness
  theaterChase(strip.Color(  0,   0, 127), 50); // Blue, half brightness

  rainbow(10);             // Flowing rainbow cycle along the whole strip
  theaterChaseRainbow(50); // Rainbow-enhanced theaterChase variant
   }
   Blinker.run();

}
发表于 2022-5-13 07:50 来自手机 | 显示全部楼层
像优秀的人学习
发表于 2022-5-17 21:49 来自手机 | 显示全部楼层
优秀的人在哪里都是闪闪发光
发表于 2022-5-17 21:55 来自手机 | 显示全部楼层
大神点灯科技的界面配置代码有吗
发表于 2022-5-17 22:04 | 显示全部楼层
涟水河 发表于 2020-6-1 00:28
搞定了,

这个可以编译通过的,还是楼主的,只是重新排了下

点灯科技手机端界面配置代码呢有吗?
发表于 2022-5-18 07:06 来自手机 | 显示全部楼层
MUHEI 发表于 2020-3-17 00:23
上面那个库文件的问题解决了,可是还是有好多错误,貌似上面的程序的格式有错,请问可以给我源程序吗? ...

手机端界面配置代码有吗
发表于 2022-5-18 07:07 来自手机 | 显示全部楼层
YLGZS 发表于 2020-3-11 08:36
再来个小爱同学就完美了

手机端界面配置代码有吗
发表于 2022-5-18 22:20 来自手机 | 显示全部楼层
MUHEI 发表于 2020-3-17 00:23
上面那个库文件的问题解决了,可是还是有好多错误,貌似上面的程序的格式有错,请问可以给我源程序吗? ...

点灯科技界面配置代码有吗
发表于 2022-5-19 22:10 | 显示全部楼层
按键的组件名都是啥呀,方便说一下嘛
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-28 09:42 , Processed in 0.150358 second(s), 13 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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