(练习篇)萤火虫esp32与小爱音响---实现笔记本电脑唤醒

目录

初步工作:

进入正题:


初步工作:

已使用过ESP32的同志们,可以忽略这一步

首先下载arduinoIDE

Software | Arduino

我安装的是1.8.18直装版本

勾选上所有安装选项

配置arduinoIDE:

1.文件-->首选项

将以下地址复制到附加开发板管理器网址

https://www.arduino.cn/package_esp32_index.json

2.下载esp32.inf驱动更新,点右键安装即可

2.5若inf文件安装不成功,报出未有数字签名的错误

打开WIN10的设置-->更新与安全-->恢复-->立即重启-->疑难解答-->高级选项-->启动设置

根据提示,选择和数字签名有关的选项。等待自动重启后即可解决问题。

3.手动安装一次ESP32开发板驱动包

此时需要删除以前与esp32相关的开发板数据包,否则容易产生冲突

删除方法:文件管理器地址栏输入 %LOCALAPPDATA%/Arduino15/packages,回车进入,然后删除掉其中的esp32文件夹

esp32开发板驱动包 链接:https://pan.baidu.com/s/1reBfqBlgN-mr5avxOt4qag?pwd=ku4z 
提取码:ku4z

4.将属于自己型号的ESP32选择到开发板中,并选择已经插好开发板的串口号

4.5如果查不到新的串口接入,可以上网下载一个CH340串口驱动,安装即可解决问题

5.尝试实现烧录和闪烁灯

void setup() 
{ 
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() 
{
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);
}

进入正题:

1.安装 “米家”APP 和 “blinker”APP 。

blinker的库以及手机控制软件可以从如下地址下载

点灯科技-点灯物联网解决方案

米家APP可自行在应用商城下载安装

2.在blinkerAPP创建成为开发者,并保存好自己的密钥

3.理解以下代码并补充相关信息

感谢源代码的分享者:Blinker-xiaoAi-WOL/Blinker_WOL.ino at master · xujunjie96/Blinker-xiaoAi-WOL · GitHub

/**********************************************
 * ESP32 + ARDUINO + Blinker + XiaoAi
 * Remote boot by WOL
 * Creater:Faiz
 * Borrower:单音字
 */

#define BLINKER_WIFI
#define BLINKER_MIOT_OUTLET

#include <Blinker.h>
#include <WiFiUdp.h>
#include <WiFi.h>
char auth[] = "************"; //密钥
char ssid[] = "单音字"; //wifi名
char pswd[] = "************"; //wifi密码

//The udp library class
WiFiUDP udp;

bool oState = false;
BlinkerButton Button1("awaking");

//awaking!
void button1_callback(const String & state)
{
   BLINKER_LOG("get button state: ", state);
   digitalWrite(LED_BUILTIN, HIGH);
   delay(50);
   digitalWrite(LED_BUILTIN,LOW);
   delay(50);
   pcawaking();
   digitalWrite(LED_BUILTIN, HIGH);
   delay(50);
   digitalWrite(LED_BUILTIN, LOW);
   delay(50);
   digitalWrite(LED_BUILTIN, HIGH);
   delay(50);
   digitalWrite(LED_BUILTIN, LOW);
   delay(50);
}


void miotPowerState(const String & state)
{
    BLINKER_LOG("need set power state: ", state);

    if (state == BLINKER_CMD_ON) {
        BlinkerMIOT.powerState("on");
        BlinkerMIOT.print();
         digitalWrite(LED_BUILTIN, HIGH);
         delay(25);
         digitalWrite(LED_BUILTIN, LOW);
         delay(25);
         pcawaking();
         digitalWrite(LED_BUILTIN, HIGH);
         delay(25);
         digitalWrite(LED_BUILTIN, LOW);
         delay(25);
         digitalWrite(LED_BUILTIN, HIGH);
         delay(25);
         digitalWrite(LED_BUILTIN, LOW);
         oState = false;  //force off!!
    }
    else if (state == BLINKER_CMD_OFF) {
        digitalWrite(LED_BUILTIN, LOW);

        BlinkerMIOT.powerState("off");
        BlinkerMIOT.print();

        oState = false;
    }
}

void miotQuery(int32_t queryCode)
{
    BLINKER_LOG("MIOT Query codes: ", queryCode);

    switch (queryCode)
    {
        case BLINKER_CMD_QUERY_ALL_NUMBER :
            BLINKER_LOG("MIOT Query All");
            BlinkerMIOT.powerState(oState ? "on" : "off");
            BlinkerMIOT.print();
            break;
        case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
            BLINKER_LOG("MIOT Query Power State");
            BlinkerMIOT.powerState(oState ? "on" : "off");
            BlinkerMIOT.print();
            break;
        default :
            BlinkerMIOT.powerState(oState ? "on" : "off");
            BlinkerMIOT.print();
            break;
            
    }
        digitalWrite(LED_BUILTIN, HIGH);
        delay(25);
        digitalWrite(LED_BUILTIN, LOW);
        delay(25);
        digitalWrite(LED_BUILTIN, HIGH);
        delay(25);
        digitalWrite(LED_BUILTIN, LOW);
}

void pcawaking()
{
    int i=0;
    char mac[6]={0xF8,0xB4,0x6A,0xB2,0x6F,0x0F};  //例如mac地址F8-B4-6A-B2-6F-0F
    char pac[102];
    char * Address = "192.168.1.255";//udp adress 网关地址或路由器分配的IP//群发最后为.255
    int Port = 3333;//udp port
     //make magicpacket,网络启动的魔术封包
    for(i=0;i<6;i++)
    {
      pac[i]=0xFF;
    }
    for(i=6;i<102;i+=6)
    {
      memcpy(pac+i,mac,6);
    }
    udp.beginPacket(Address, Port);
    udp.write((byte*)pac, 102);//send pac to txbuffer
    udp.endPacket();//biubiubiu
}

void dataRead(const String & data)
{
    BLINKER_LOG("Blinker readString: ", data);

    Blinker.vibrate();
    
    uint32_t BlinkerTime = millis();
    
    Blinker.print("millis", BlinkerTime);
}

void setup()
{
    Serial.begin(115200);
    BLINKER_DEBUG.stream(Serial);

    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, LOW);

    Blinker.begin(auth, ssid, pswd);
    Blinker.attachData(dataRead);
    
    BlinkerMIOT.attachPowerState(miotPowerState);
    BlinkerMIOT.attachQuery(miotQuery);

    Button1.attach(button1_callback);
}

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

3.5 在电脑win+R输入cmd并打开,输入ipconfig /all,查看有线网卡的mac地址(在以太网适配器分类中)和自己的网关地址(在无线局域网适配器分类中)。

        将mac地址和网关地址(网关最后的.1改为.255)分别填入代码相关位置。

4.将编译好的内容烧录/上传到开发板

5.打开blinkerAPP添加搜索到的wifi设备

   

6.为米家APP添加设备。在其他设备中搜索 点灯科技 并绑定账号

  

7.打开blinkerAPP,为搜索到的WiFi设备添加一个初始案例。

        并点击右上角的编辑按钮,添加一个叫awaking的文本按钮。

    

 

8.打开电脑的控制面板,进行网络属性设置

控制面板--网络和共享中心--以太网--属性--配置--高级--魔术封包唤醒--开启。

注意,只有有线以太网才有魔术封包唤醒的设置

9.部分电脑无法实现网络唤醒,则要进行主板BIOS设置

进入BIOS方法:关机--启动--在启动界面显示的同时,按下F2或ESC(因电脑而异)

以下将以 惠普战66笔记本为例:

 在BIOS中的Advanced分类中,找到与Devices Options相关的选项

找到Wake On LAN(或叫WOL)的选项卡,建议选择常规启动顺序

( 部分电脑如果唤醒不成功,可能要在电源控制面板中关闭快速启动)

10.重新关机后,保持电源与网线的连接状态。

11.对你的小爱音响说打开“电脑”(blinker中的设备名称),或者Blinker软件上点击awaking按键一下。板子上灯闪几下,电脑就会开机了。

 

此处感谢这位博主给予的开发教程:

使用ESP32和Blinker实现远程网络唤醒电脑(接入语音助手,以小爱同学为例)_网络设备_什么值得买创作立场声明:希望多多分享购买理由点灯科技 Blinker是提供远程接入物联网方案的一家公司,使用他们家的库,可以轻松将设备联网,并接入主流语音助手https://post.smzdm.com/p/aoown0g7/

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,以下是 python 实现萤火虫算法并可视化萤火虫移动过程的代码: ```python import random import math import matplotlib.pyplot as plt import numpy as np # 设置萤火虫算法的参数 num_fireflies = 20 # 萤火虫数量 num_iter = 10 # 迭代次数 alpha = 0.2 # 吸引因子 beta = 1 # 感应因子 gamma = 1 # 收缩因子 delta = 0.97 # 衰减因子 xmin, xmax, ymin, ymax = -5, 5, -5, 5 # 随机生成萤火虫的范围 def init_fireflies(num_fireflies): """ 随机初始化萤火虫的位置和亮度(即适应度值) """ fireflies = [] for i in range(num_fireflies): x = xmin + (xmax - xmin) * random.random() y = ymin + (ymax - ymin) * random.random() intensity = -1 # 初始亮度为-1 fireflies.append([x, y, intensity]) return fireflies def distance(f1, f2): """ 计算两个萤火虫之间的距离 """ return math.sqrt((f1[0] - f2[0]) ** 2 + (f1[1] - f2[1]) ** 2) def brightness(f): """ 计算萤火虫的亮度(即适应度值) """ return math.exp(-distance(f, [0, 0]) ** 2) def move(f, brightest): """ 根据萤火虫的亮度和距离,更新萤火虫的位置 """ r = distance(f, brightest) theta = random.uniform(-math.pi, math.pi) x = f[0] + beta * math.exp(-gamma * r ** 2) * math.cos(theta) + alpha * (random.random() - 0.5) y = f[1] + beta * math.exp(-gamma * r ** 2) * math.sin(theta) + alpha * (random.random() - 0.5) x = max(xmin, min(x, xmax)) y = max(ymin, min(y, ymax)) intensity = brightness([x, y]) return [x, y, intensity] def find_brightest(fireflies): """ 找到亮度最大的萤火虫 """ brightest = None for f in fireflies: if brightest is None or f[2] > brightest[2]: brightest = f return brightest def main(): # 初始化萤火虫 fireflies = init_fireflies(num_fireflies) # 记录每次迭代的最优解 best_scores = [] # 迭代 for i in range(num_iter): # 找到亮度最大的萤火虫 brightest = find_brightest(fireflies) # 更新萤火虫的位置 for j in range(num_fireflies): fireflies[j] = move(fireflies[j], brightest) # 衰减吸引因子 alpha *= delta # 记录最优解 best_scores.append(brightest[2]) # 可视化萤火虫移动过程 plt.clf() for f in fireflies: plt.scatter(f[0], f[1], c='r') plt.scatter(brightest[0], brightest[1], c='b') plt.title('Iteration %d' % (i + 1)) plt.xlim(xmin, xmax) plt.ylim(ymin, ymax) plt.pause(0.1) # 打印最优解 print('Best solution: (%f, %f)' % (brightest[0], brightest[1])) # 绘制最优解的亮度曲线 plt.clf() plt.plot(best_scores) plt.title('Brightness of the brightest firefly') plt.xlabel('Iteration') plt.ylabel('Brightness') plt.show() if __name__ == '__main__': main() ``` 运行代码后,会弹出一个窗口,不停地显示萤火虫的移动过程。在每次迭代结束后,会打印当前最优解的位置,以及最优解的亮度曲线。可以根据需要修改萤火虫算法的参数和随机生成萤火虫的范围。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值