利用小爱同学与点灯科技+esp8266+舵机,制作智能关灯神器:小白也可制作,米家同步设备可实现多部手机进行控制。(亲测有用)

news2024/11/18 5:38:17

利用小爱同学与点灯科技,制作智能关灯神器:小白也可制作,米家同步设备可实现多部手机进行控制。

文章目录

    • 利用小爱同学与点灯科技,制作智能关灯神器:小白也可制作,米家同步设备可实现多部手机进行控制。
      • 1.材料清单
        • 1.1Esp8266串口WiFi模块
        • 1.2 sg90舵机 我买的一个 180度的(控制开关)
        • 1.3电源(充电宝或其它电源,我建议电宝)。
      • 2.官网下载Arduino IDE
        • 2.1 网址
        • 2.2 点击这里可以下载软件
        • 2.3 注册后 点击浏览器端下载
        • 2.4 找到下载好的安装包 双击运行
        • 2.5 切换为中文模式
        • 2.6 回到之前的网站 点击离线安装包
        • 2.7 复制这个网址
        • 2.8 粘贴到这里
        • 2.9 点击历史版本下载
        • 2.10 下载这个
        • 2.11 将下载好的安装包解压
        • 2.12 重要步骤一定要看
            • 用户名这这里如果有中文 安装3.0.2 英文 安装 3.0.1 版本 双击安装![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/e1590d1ac4694bd5ac8f02e28049b5a2.png)
      • 3.将 Esp8266串口WiFi模块 和 sg90舵机 安装好
        • 3.1 按照第一个图片安装就好
        • 3.1 (可以忽略) 按照第一个图片安装就好 红线条 接5v VU 棕 GND 黄色 D4
        • 3.2 线接好后, 把usb插到电脑上 ,usb线条 要有数据传输功能 ,电脑端的插头也要支持 传输数据多换几个地方插入
      • 4.把代码上传到 esp8266 开发板 这里我提供两套代码,
        • 4.1 这个代码 适合家里的灯, 开 关 开 关 开 ,是最亮的开关的
        • 4.2 代码2 适合 开关是 开一次就是亮的灯
        • 4.3 上面代码的无线网 账号密码 需要选这种 名字结尾不带5G 的网
        • 4.4 代码里面的点灯app key 获取方式 步骤见下面图片
        • 4.5配置 点灯app 使的点灯app 可以开关灯和定时关灯
            • 动作 配置代码 复制粘贴进去
            • 界面 配置代码 复制粘贴进去
      • 5.代码上传到 esp8266 开发板 代码在目录4
        • 5.1 复制代码新建文件 auto_off_light.ino 把文件 拖动到 Arduino IDE 这个图标上 或者 用软件打开
        • 5.2 上传到 esp8266 开发板 点击这个按钮
        • 要先选择 板子的端口
        • 5.3 上传完成右下角会提示
      • 6. 小爱同学 控制 开灯 ,关灯 需要 下载 小爱同学 和 米家
      • 7. 确保 录入语音控制 ,然后就可以用小爱同学控制
      • 8. 多个手机控制 也就是用多个 小爱同学绑定 同一个 点灯app 账号
      • 9. 我在墙上 这样粘住的 舵机下面垫了 纸板,胶带 粘在墙上。大家可以用 纳米胶好用

1.材料清单

材料费大概15大洋左右,多说无益,开始制作!!!

1.1Esp8266串口WiFi模块

Esp8266串口WiFi模块(12.4块大洋左右,配套线可以用于烧录,所以能买就买)。

【淘宝】https://m.tb.cn/h.gjgmND9Pv9ilE6m?tk=PYdI324I9na CZ3456 「ESP8266串口WIFI模块 CP2102/CH340 NodeMCU Lua V3物联网开发板」
1.2 sg90舵机 我买的一个 180度的(控制开关)
【淘宝】限时满145减6 https://m.tb.cn/h.gQaqqV35piYBw1D?tk=4zz3324ra1u HU0025 「SG90 9g舵机MG996R mg90s MG995模块马达遥控飞机航模9克360度180」
1.3电源(充电宝或其它电源,我建议电宝)。

2.官网下载Arduino IDE

2.1 网址
https://arduino.me/home

在这里插入图片描述

在这里插入图片描述

2.2 点击这里可以下载软件

在这里插入图片描述

2.3 注册后 点击浏览器端下载

在这里插入图片描述

2.4 找到下载好的安装包 双击运行

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.5 切换为中文模式

在这里插入图片描述
在这里插入图片描述

2.6 回到之前的网站 点击离线安装包
https://arduino.me/download

在这里插入图片描述

2.7 复制这个网址

在这里插入图片描述

https://arduino.me/packages/esp8266.json
2.8 粘贴到这里

在这里插入图片描述
在这里插入图片描述

2.9 点击历史版本下载

在这里插入图片描述

2.10 下载这个

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.11 将下载好的安装包解压

在这里插入图片描述

2.12 重要步骤一定要看
用户名这这里如果有中文 安装3.0.2 英文 安装 3.0.1 版本 双击安装在这里插入图片描述

在这里插入图片描述

3.将 Esp8266串口WiFi模块 和 sg90舵机 安装好

3.1 按照第一个图片安装就好

在这里插入图片描述

3.1 (可以忽略) 按照第一个图片安装就好 红线条 接5v VU 棕 GND 黄色 D4

在这里插入图片描述

3.2 线接好后, 把usb插到电脑上 ,usb线条 要有数据传输功能 ,电脑端的插头也要支持 传输数据多换几个地方插入

4.把代码上传到 esp8266 开发板 这里我提供两套代码,

4.1 这个代码 适合家里的灯, 开 关 开 关 开 ,是最亮的开关的
#define BLINKER_WIFI
#define BLINKER_MIOT_LIGHT

#include <Blinker.h>
#include <Servo.h>

Servo myservo;//定义舵机

char auth[] = "";  //点灯Key 下面我讲如何获取  目录 4.4 
char ssid[] = "";      //wifi名称  需要选这种 名字结尾不带5G 的网  见目录 4.3
char pswd[] = "";     //wifi密码

// 新建组件对象
BlinkerButton Button1("btn-on");//开灯或关灯
BlinkerButton Button2("btn-off");//关灯
BlinkerButton Button3("btn-bright");//降低灯亮度

BlinkerButton Button4("btn-banZi");//开发板灯亮度
BlinkerButton Button5("btn-go");//只开灯
BlinkerNumber Number1("num-abc");
bool isLightOn = false; // 初始状态设为关
BlinkerButton Button6("btn-onOne");//开灯
// 舵机动作角度定义
const int SERVO_ANGLE_OFF = 10;
const int SERVO_ANGLE_ON = 170;
const int SERVO_ANGLE_RESET = 90;

int counter = 0;

// 舵机动作函数 修改舵机度数
void servoTurn(int angle) {
    myservo.write(angle);
    delay(1000);
}

// 更新灯的状态
void updateLightStatus(bool newStatus) {
    isLightOn = newStatus;
    if (newStatus) {
        BlinkerMIOT.powerState("on");
        BlinkerMIOT.print();
        isLightOn = true;
        //开灯
        servoTurn(SERVO_ANGLE_ON);
        servoTurn(SERVO_ANGLE_OFF);
        servoTurn(SERVO_ANGLE_ON);
        servoTurn(SERVO_ANGLE_OFF);
        servoTurn(SERVO_ANGLE_ON);
        servoTurn(SERVO_ANGLE_RESET);
    } else {
        BlinkerMIOT.powerState("off");
        BlinkerMIOT.print();
        isLightOn = false;
        //关灯
        servoTurn(SERVO_ANGLE_OFF);
        servoTurn(SERVO_ANGLE_RESET);
    }
     updateEspLightStatus();//关闭esp8266灯
}


// 更新esp8266 灯的状态
void updateEspLightStatus() {
digitalWrite(LED_BUILTIN, HIGH); // 如果状态是 "on",设置 LED 为高电平(亮) 搜索后发现有的是相反的
}


//小爱同学判断开灯关灯
void miotPowerState(const String &state) {
    BLINKER_LOG("电源状态: ", state);
    if (state == BLINKER_CMD_ON) {
        updateLightStatus(true);
    } else if (state == BLINKER_CMD_OFF) {
        updateLightStatus(false);
    }
}


//点灯app判断开灯关灯   Button1的回调函数
void button1_callback(const String &state) {
  if (state == "on") {
    updateLightStatus(true);//开关
    Button1.print("on");//将开关变成开状态
   	Button1.text("开");//在开关上显示文字 开
   }else if (state == "off") {
    updateLightStatus(false);//关灯
    Button1.print("off");//将开关变成关状态
   	Button1.text("关");//在开关上显示文字 关
   } else if (state == "press" || state == "tap") {//长按,短按 关灯
    updateLightStatus(false);//关灯
    Button1.print("off");//将开关变成关状态
   	Button1.text("关");//在开关上显示文字 关
   } else {
        BLINKER_LOG("未知的按钮状态: ", state);
    }
}



// 如果未绑定的组件被触发,则会执行其中内容
void dataRead(const String & data)
{
  BLINKER_LOG("Blinker readString: ", data);
  counter++;
  Number1.print(counter);
}

//点灯app关灯
//回调函数意思 手机每点击一次组件 就出发回调函数
void button2_callback(const String & state){//回调函数
   updateLightStatus(false);//关灯
   Button2.print("off");//将开关变成关状态
   Button2.text("关");//在开关上显示文字 关
 }

//点灯app 降低灯亮度
//回调函数意思 手机每点击一次组件 就出发回调函数
void button3_callback(const String & state){//回调函数
        servoTurn(SERVO_ANGLE_OFF);
        servoTurn(SERVO_ANGLE_ON);
        servoTurn(SERVO_ANGLE_OFF);
        servoTurn(SERVO_ANGLE_ON);
        servoTurn(SERVO_ANGLE_RESET);
        //修改状态
        BlinkerMIOT.powerState("on");
        BlinkerMIOT.print();
        Button3.print("on");//将开关变成开状态
   	    Button3.text("开");//在开关上显示文字 开
        isLightOn = true;
        updateEspLightStatus();//关闭esp8266灯
 }

// 按下按键即会执行该函数 esp8266灯
void button4_callback(const String& state) {
    BLINKER_LOG("get button state: ", state);

    if (state == "on") {
        digitalWrite(LED_BUILTIN, LOW); // 如果状态是 "off",设置 LED 为低电平(灭)
        Button4.print("on");//将开关变成开状态
        Button4.text("开");//在开关上显示文字 开
    } else if (state == "off") {
        digitalWrite(LED_BUILTIN, HIGH); // 如果状态是 "on",设置 LED 为高电平(亮)
        Button4.print("off");//将开关变成关状态
        Button4.text("关");//在开关上显示文字 关
    } else {
        BLINKER_LOG("Invalid state received.");
    }
}

// 只开灯
void button5_callback(const String& state) {
    BLINKER_LOG("get button state: ", state);
        servoTurn(SERVO_ANGLE_ON);
        servoTurn(SERVO_ANGLE_OFF);
        servoTurn(SERVO_ANGLE_ON);
        servoTurn(SERVO_ANGLE_OFF);
        servoTurn(SERVO_ANGLE_ON);
        servoTurn(SERVO_ANGLE_RESET);
        Button5.print("on");//将开关变成开状态
        Button5.text("开");//在开关上显示文字 开
        isLightOn = true;
        updateEspLightStatus();//关闭esp8266灯
}

// 只开灯一次
void button6_callback(const String& state) {
    BLINKER_LOG("get button state: ", state);
        servoTurn(SERVO_ANGLE_ON);
        servoTurn(SERVO_ANGLE_RESET);
        Button6.print("on");//将开关变成开状态
        Button6.text("开");//在开关上显示文字 开
        isLightOn = true;
        updateEspLightStatus();//关闭esp8266灯
}
void setup()
{
  // 初始化串口
  Serial.begin(115200);
  BLINKER_DEBUG.stream(Serial);
  // 初始化舵机
  myservo.attach(2);//舵机的IO口,nodemcu的D4口
  myservo.write(SERVO_ANGLE_RESET);//上电时舵机归零垂直
  BlinkerMIOT.attachPowerState(miotPowerState);

  // 初始化blinker
  Blinker.begin(auth, ssid, pswd);
  Blinker.attachData(dataRead);

  Button1.attach(button1_callback);//将组件与回调函数绑定
  Button2.attach(button2_callback);//将组件与回调函数绑定
  Button3.attach(button3_callback);//将组件与回调函数绑定
  Button4.attach(button4_callback);//将组件与回调函数绑定
  Button5.attach(button5_callback);//将组件与回调函数绑定
  Button6.attach(button6_callback);//将组件与回调函数绑定
    // 初始化有LED的IO
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);
}

void loop() {
  Blinker.run();
}


4.2 代码2 适合 开关是 开一次就是亮的灯
#define BLINKER_WIFI
#define BLINKER_MIOT_LIGHT

#include <Blinker.h>
#include <Servo.h>

Servo myservo;//定义舵机

char auth[] = "";  //点灯Key 下面我讲如何获取   目录 4.4 
char ssid[] = "";      //wifi名称  需要选这种 名字结尾不带5G 的网  见目录 4.3
char pswd[] = "";     //wifi密码

// 新建组件对象
BlinkerButton Button1("btn-on");//开灯或关灯
BlinkerButton Button2("btn-off");//关灯
BlinkerButton Button3("btn-bright");//降低灯亮度

BlinkerButton Button4("btn-banZi");//开发板灯亮度
BlinkerButton Button5("btn-go");//只开灯
BlinkerNumber Number1("num-abc");
bool isLightOn = false; // 初始状态设为关
BlinkerButton Button6("btn-onOne");//开灯
// 舵机动作角度定义
const int SERVO_ANGLE_OFF = 10;
const int SERVO_ANGLE_ON = 170;
const int SERVO_ANGLE_RESET = 90;

int counter = 0;

// 舵机动作函数 修改舵机度数
void servoTurn(int angle) {
    myservo.write(angle);
    delay(1000);
}

// 更新灯的状态
void updateLightStatus(bool newStatus) {
    isLightOn = newStatus;
    if (newStatus) {
        BlinkerMIOT.powerState("on");
        BlinkerMIOT.print();
        isLightOn = true;
        //开灯
        servoTurn(SERVO_ANGLE_ON);
        servoTurn(SERVO_ANGLE_RESET);
    } else {
        BlinkerMIOT.powerState("off");
        BlinkerMIOT.print();
        isLightOn = false;
        //关灯
        servoTurn(SERVO_ANGLE_OFF);
        servoTurn(SERVO_ANGLE_RESET);
    }
     updateEspLightStatus();//关闭esp8266灯
}


// 更新esp8266 灯的状态
void updateEspLightStatus() {
digitalWrite(LED_BUILTIN, HIGH); // 如果状态是 "on",设置 LED 为高电平(亮) 搜索后发现有的是相反的
}


//小爱同学判断开灯关灯
void miotPowerState(const String &state) {
    BLINKER_LOG("电源状态: ", state);
    if (state == BLINKER_CMD_ON) {
        updateLightStatus(true);
    } else if (state == BLINKER_CMD_OFF) {
        updateLightStatus(false);
    }
}


//点灯app判断开灯关灯   Button1的回调函数
void button1_callback(const String &state) {
  if (state == "on") {
    updateLightStatus(true);//开关
    Button1.print("on");//将开关变成开状态
   	Button1.text("开");//在开关上显示文字 开
   }else if (state == "off") {
    updateLightStatus(false);//关灯
    Button1.print("off");//将开关变成关状态
   	Button1.text("关");//在开关上显示文字 关
   } else if (state == "press" || state == "tap") {//长按,短按 关灯
    updateLightStatus(false);//关灯
    Button1.print("off");//将开关变成关状态
   	Button1.text("关");//在开关上显示文字 关
   } else {
        BLINKER_LOG("未知的按钮状态: ", state);
    }
}



// 如果未绑定的组件被触发,则会执行其中内容
void dataRead(const String & data)
{
  BLINKER_LOG("Blinker readString: ", data);
  counter++;
  Number1.print(counter);
}

//点灯app关灯
//回调函数意思 手机每点击一次组件 就出发回调函数
void button2_callback(const String & state){//回调函数
   updateLightStatus(false);//关灯
   Button2.print("off");//将开关变成关状态
   Button2.text("关");//在开关上显示文字 关
 }

//点灯app 降低灯亮度
//回调函数意思 手机每点击一次组件 就出发回调函数
void button3_callback(const String & state){//回调函数
        servoTurn(SERVO_ANGLE_OFF);
        servoTurn(SERVO_ANGLE_RESET);
        //修改状态
        BlinkerMIOT.powerState("on");
        BlinkerMIOT.print();
        Button3.print("on");//将开关变成开状态
   	    Button3.text("开");//在开关上显示文字 开
        isLightOn = true;
        updateEspLightStatus();//关闭esp8266灯
 }

// 按下按键即会执行该函数 esp8266灯
void button4_callback(const String& state) {
    BLINKER_LOG("get button state: ", state);

    if (state == "on") {
        digitalWrite(LED_BUILTIN, LOW); // 如果状态是 "off",设置 LED 为低电平(灭)
        Button4.print("on");//将开关变成开状态
        Button4.text("开");//在开关上显示文字 开
    } else if (state == "off") {
        digitalWrite(LED_BUILTIN, HIGH); // 如果状态是 "on",设置 LED 为高电平(亮)
        Button4.print("off");//将开关变成关状态
        Button4.text("关");//在开关上显示文字 关
    } else {
        BLINKER_LOG("Invalid state received.");
    }
}

// 只开灯
void button5_callback(const String& state) {
    BLINKER_LOG("get button state: ", state);
        servoTurn(SERVO_ANGLE_ON);
        servoTurn(SERVO_ANGLE_RESET);
        Button5.print("on");//将开关变成开状态
        Button5.text("开");//在开关上显示文字 开
        isLightOn = true;
        updateEspLightStatus();//关闭esp8266灯
}

// 只开灯一次
void button6_callback(const String& state) {
    BLINKER_LOG("get button state: ", state);
        servoTurn(SERVO_ANGLE_ON);
        servoTurn(SERVO_ANGLE_RESET);
        Button6.print("on");//将开关变成开状态
        Button6.text("开");//在开关上显示文字 开
        isLightOn = true;
        updateEspLightStatus();//关闭esp8266灯
}
void setup()
{
  // 初始化串口
  Serial.begin(115200);
  BLINKER_DEBUG.stream(Serial);
  // 初始化舵机
  myservo.attach(2);//舵机的IO口,nodemcu的D4口
  myservo.write(SERVO_ANGLE_RESET);//上电时舵机归零垂直
  BlinkerMIOT.attachPowerState(miotPowerState);

  // 初始化blinker
  Blinker.begin(auth, ssid, pswd);
  Blinker.attachData(dataRead);

  Button1.attach(button1_callback);//将组件与回调函数绑定
  Button2.attach(button2_callback);//将组件与回调函数绑定
  Button3.attach(button3_callback);//将组件与回调函数绑定
  Button4.attach(button4_callback);//将组件与回调函数绑定
  Button5.attach(button5_callback);//将组件与回调函数绑定
  Button6.attach(button6_callback);//将组件与回调函数绑定
    // 初始化有LED的IO
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);
}

void loop() {
  Blinker.run();
}


4.3 上面代码的无线网 账号密码 需要选这种 名字结尾不带5G 的网

在这里插入图片描述

4.4 代码里面的点灯app key 获取方式 步骤见下面图片

手机百度搜点灯科技 下载点灯app 注册 登录
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.5配置 点灯app 使的点灯app 可以开关灯和定时关灯

在这里插入图片描述
在这里插入图片描述

动作 配置代码 复制粘贴进去
[{"cmd":{"btn-on":"on"},"text":"打开?name"},{"cmd":{"btn-on":"off"},"text":"关闭?name"}]1
界面 配置代码 复制粘贴进去
{¨version¨¨2.0.0¨¨config¨{¨headerColor¨¨transparent¨¨headerStyle¨¨dark¨¨background¨{¨img¨¨assets/img/bg/f2.jpg¨¨isFull¨»}}¨dashboard¨|{¨type¨¨btn¨¨ico¨¨fal fa-power-off¨¨mode¨Ê¨t0¨¨开发板灯¨¨t1¨¨文本2¨¨bg¨É¨cols¨Ë¨rows¨Ë¨key¨¨btn-banZi¨´x´É´y´É¨clr¨¨#076EEF¨}{ßCßDßEßFßGÊßH¨开灯或关灯¨ßJßKßLÉßMËßNËßO¨btn-on¨´x´Ë´y´É¨lstyle¨ÉßQ¨#6010E4¨}{ßCßDßEßFßGÊßH¨降低灯亮度¨ßJßKßLÉßMËßNËßO¨btn-bright¨´x´Í´y´ÉßQ¨#FBA613¨}{ßCßDßE¨fad fa-lightbulb-on¨ßGÊßH¨开灯¨ßJßKßLÉßMÍßNÍßO¨btn-go¨´x´Ë´y´ÌßQ¨#00A90C¨ßUË}{ßCßDßE¨fad fa-lightbulb¨ßGÊßH¨关灯¨ßJßKßLÉßMÍßNÍßO¨btn-off¨´x´Ë´y´ÒßQ¨#EA0909¨ßUË}{ßC¨tim¨ßLÉßMËßNËßO¨timing¨´x´Ï´y´É}{ßCßDßEßFßGÊßH¨只开灯一次¨ßJßKßLÉßMËßNËßO¨btn-onOne¨´x´É´y´ËßQßc}÷¨actions¨|¦¨cmd¨¦ßT‡¨text¨‡¨on¨¨打开?name¨¨off¨¨关闭?name¨—÷¨triggers¨|{¨source¨¨switch¨¨source_zh¨¨开关状态¨¨state¨|ßoßq÷¨state_zh¨|¨打开¨´关闭´÷}÷´rt´|÷}

5.代码上传到 esp8266 开发板 代码在目录4

5.1 复制代码新建文件 auto_off_light.ino 把文件 拖动到 Arduino IDE 这个图标上 或者 用软件打开

在这里插入图片描述

5.2 上传到 esp8266 开发板 点击这个按钮
要先选择 板子的端口

在这里插入图片描述

在这里插入图片描述

5.3 上传完成右下角会提示

6. 小爱同学 控制 开灯 ,关灯 需要 下载 小爱同学 和 米家

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7. 确保 录入语音控制 ,然后就可以用小爱同学控制

8. 多个手机控制 也就是用多个 小爱同学绑定 同一个 点灯app 账号

9. 我在墙上 这样粘住的 舵机下面垫了 纸板,胶带 粘在墙上。大家可以用 纳米胶好用

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1955507.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3 快速入门 (六) : vue中调用HTTP请求

1. 本文环境 Vue版本 : 3.4.29Node.js版本 : v20.15.0系统 : Windows11 64位IDE : VsCode 1.91.0 2. 访问HTTP 在Vue中&#xff0c;访问HTTP&#xff0c;可以使用axios第三方库。 axios 是一个基于 promise 的网络请求库&#xff0c;可以用于浏览器和 node.js。 axios使用简…

一步步理清开源路径规划导航引擎GraphHopper

一步步理清开源路径规划导航引擎GraphHopper&#xff0c;学习应用 GraphHopper简介 源码用 Java 编写&#xff0c;开发人员可以通过 Maven 轻松上手。可以用作** Java 库**来计算两个或多个点之间路线的距离、时间、逐向指示和许多道路属性。可以用作独立的 Web 服务器来计算…

redis的学习

! 快速入门 安装 1.使用docker安装redis docker pull redisdocker run -d --name redis -p 6379:6379 --restart unless-stopped -v /etc/docker/Redis/data:/data -v /etc/docker/Redis/conf/redis.conf:/usr/local/etc/redis/redis.conf redis redis-server /usr/local/e…

Python 百题(实战快速掌握语法)_2(链表)

目录 实现链表类 挑战介绍 挑战内容 挑战要求 示例代码 版权说明 参考答案 代码分析&#xff1a; Node 类 LinkedList 类 方法分析 总结 删除链表的重复项 挑战介绍 挑战内容 挑战要求 示例代码 版权说明 参考答案 代码分析&#xff1a; 寻找链表倒数第 k…

算法笔记--知识点记录2

enumerate函数 enumerate 是 Python 中的一个内置函数&#xff0c;它用于将一个可遍历的数据对象&#xff08;如列表、元组或字符串&#xff09;组合为一个索引序列&#xff0c;同时列出数据和数据下标&#xff0c;通常用在 for 循环当中。 使用 enumerate 可以同时获得每个元…

什么是C++活锁?

听过太多的死锁&#xff08;Deadlock&#xff09;&#xff0c;今天来聊聊什么是C活锁&#xff08;Livelock&#xff09;。 C中的活锁&#xff08;Livelock&#xff09;并非特指C语言本身的一个概念&#xff0c;而是并发编程和操作系统中可能遇到的一种现象。活锁指的是任务或者…

数据库 执行sql添加删除字段

添加字段&#xff1a; ALTER TABLE 表明 ADD COLUMN 字段名 类型 DEFAULT NULL COMMENT 注释 AFTER 哪个字段后面; 效果&#xff1a; 删除字段&#xff1a; ALTER TABLE 表明 DROP COLUMN 字段;

【C++】C++入门知识(上)

好久不见&#xff0c;本篇介绍一些C的基础&#xff0c;没有特别的主题&#xff0c;话不多说&#xff0c;直接开始。 1.C的第一个程序 C中需要把定义文件代码后缀改为 .cpp 我们在 test.cpp 中来看下面程序 #include <stdio.h> int main() {printf("hello world\n…

Linux文件与相关函数的知识点3

main函数参数 int main(int argc,char *argv[]) { return 0; } C语言规定了main函数的参数只能有两个&#xff0c;一个是argc,一个是argv并且&#xff0c;argc只能是整数&#xff0c;第二个必须是指向字符 串的指针数组。 argc: 参数表示命令行中参数的个数&#xff0…

【建议收藏】CTF网络安全夺旗赛刷题指南(非常详细)零基础入门到精通,收藏这一篇就够了

在数字化浪潮汹涌澎湃的今天&#xff0c;网络安全已成为国家、企业和个人无法忽视的重要议题。为了挖掘和培养网络安全人才&#xff0c;一场场紧张刺激、充满智慧的CTF&#xff08;Capture The Flag&#xff09;安全竞赛应运而生。 一、CTF安全竞赛简介 CTF安全竞赛&#xff0c…

鸿蒙仓颉语言之【安全密码库crypto4cj】功能示例

功能示例 MD5使用样例 from crypto4cj import md5cj.*main() { var md: Array<UInt8> Array<UInt8>(16, item: 0)var result: String String(Array<Char>(33, item: 0))var str: String "helloworld"var ret md5(str.toUtf8Array(), md)r…

lua 游戏架构 之 游戏 AI (六)ai_auto_skill

定义一个为ai_auto_skill的类&#xff0c;继承自ai_base类。ai_auto_skill类的目的是在AI自动战斗模式下&#xff0c;根据配置和条件自动选择并使用技能。 lua 游戏架构 之 游戏 AI &#xff08;一&#xff09;ai_base-CSDN博客文章浏览阅读379次。定义了一套接口和属性&#…

ASCII码图片

在许多计算机语言中&#xff0c;比较字母、字符串大小时&#xff0c;都会运用到ASCII码。而这是很多创客容易遗忘的&#xff0c;今天发给大家ASCII码大全图片&#xff0c;记得收藏

Redis是多线程还是单线程?

文章目录 1、用户态和内核态2、阻塞IO3、非阻塞IO4、IO多路复用4.1 select4.2 poll4.3 epoll4.4 epoll中的ET和LT4.5 epoll的服务端流程 5、信号驱动6、异步IO7、对比8、Redis是单线程的吗&#xff1f;9、单线程多线程网络模型变更 1、用户态和内核态 1、ubuntu和Centos 都是Li…

Golang 知识结构图

总结Go的入门知识结构&#xff0c;如下图所示&#xff1a;

(史上最全的)Spring6框架学习教程

一、什么是Spring 1.javaWeb框架发展史 1、ServletJSPJavaBean(跳转页面、业务逻辑判断、数据库查询) 2、MVC三层架构(M Model pojo(User)V-view(USP)C-(controller-servlet)) (web-跳转页面service-业务逻辑判断 new UserService0;dao-数据库查询 new UserDao(); ) 3、使用…

【C++】—— 类和对象(一)

【C】—— 类和对象&#xff08;一&#xff09; 1、类的定义1.1、类定义1.1.1、类定义格式1.1.2、成员变量的标识1.1.3、C 中的 s t r u c t struct struct1.1.4、C 中的内联函数1.1.5、总结 1.2、访问限定符1.3、类域 2、实例化2.1、实例化的概念2.2、对象大小2.2.1、对象的大…

黑神话悟空游戏什么时候上线能玩 黑神话悟空是哪个公司 苹果电脑能玩黑神话悟空吗

《黑神话&#xff1a;悟空》是一款以中国神话为背景的动作角色扮演游戏。故事取材于中国古典小说“四大名著”之一的《西游记》。 你将扮演一位“天命人”&#xff0c;为了探寻昔日传说的真相&#xff0c;踏上一条充满危险与惊奇的西游之路。 一、《黑神话&#xff1a;悟空》什…

【Linux系统】线程的互斥

互斥 互斥概念 多个线程能够看到的资源称为共享资源&#xff0c;那我们需要对这种资源进行保护&#xff0c;需要用到互斥&#xff01;&#xff01;&#xff01; 见一见多线程访问的问题 --- 抢票问题 int tickets 1000;void route(const std::string& name) {while(tr…

Docker容器的数据管理

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 我们在使用Docker的过程中&#xff0c;往往需要能查看容器内应用产生的数据&#xff0c;或者需要把容器内的数据进行备份&#x…