查看: 1417|回复: 10

[分享] 小爱同学开电脑 esp8266 12f

[复制链接]

该用户从未签到

发表于 2020-4-17 21:20 | 显示全部楼层 |阅读模式
本帖最后由 suen.sun 于 2020-4-17 21:31 编辑

1.mini D1 wifi ESP-12F N ESP8266开发板
2.1路 5V继电器模块 高电平触发
3.AMS1117-3.3V原装 SOT-223 稳压芯片4. 10uf电容两只

无电路图,参考抖音 暴改车间主任 视频

esp12f和继电器从电脑主机ATX电源紫色线取常电5V, 检测开机状态是通过ATX电源中任意红色电线的电平(稳压管、滤波)
继电器输出并连电脑主板开机线,模拟点按电源键。
小米手机可以在米家APP绑定其它平台设备(点灯科技);
小爱同学APP里新增个人训练-控制设备,比如“打开电脑”指令为打开绑定的插座设备。即可打开电脑。
*:关闭电脑需要设置windows电源按键为关机(或者休眠)。


[mw_shl_code=arduino,true]
#define BLINKER_WIFI
#define BLINKER_ESP_SMARTCONFIG //开启智能配网
#define BLINKER_MIOT_OUTLET //模拟为小爱同学控制的插座
#define BLINKER_ALIGENIE_OUTLET //模拟为天猫精灵控制的插座
#define OUT_PORT 4  //接继电器信号
#define CHK_PORT 12  //检测是否有高电平(高电平即电脑已开机)
#include <Blinker.h>
#include <Ticker.h>
Ticker myTicker;
int count = 0;
uint32_t lstPw = 0; //默认是关机态
char auth[] = "******";//设备code
#define btn_key "btn_swt"

BlinkerButton BtnRemote(btn_key);

void switchChange(int32_t stateCodeSetting) {
  uint32_t nowPw = digitalRead(CHK_PORT);
  if ((nowPw == HIGH && stateCodeSetting == 1) || (nowPw == LOW && stateCodeSetting == 0)) {
    return;
  }
  digitalWrite(OUT_PORT, HIGH);
  delay(200);
  digitalWrite(OUT_PORT, LOW);
}

void btn_callback(const String & state)
{
  BLINKER_LOG("Button pressed!");
  switchChange(lstPw ? 0 : 1);
}
void aligeniePowerState(const String & state)
{
  if (state == BLINKER_CMD_ON) {
    switchChange(1);
    BlinkerAliGenie.powerState(lstPw ? "on" : "off");
    BlinkerAliGenie.print();
  }
  else if (state == BLINKER_CMD_OFF) {
    switchChange(0);
    BlinkerAliGenie.powerState(lstPw ? "on" : "off");
    BlinkerAliGenie.print();
  }
}
void aligenieQuery(int32_t queryCode)
{
  lstPw = digitalRead(CHK_PORT);
  switch (queryCode)
  {
    case BLINKER_CMD_QUERY_ALL_NUMBER :
      BLINKER_LOG("AliGenie Query All");
      BlinkerAliGenie.powerState(lstPw ? "on" : "off");
      BlinkerAliGenie.print();
      break;
    case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
      BLINKER_LOG("AliGenie Query Power State");
      BlinkerAliGenie.powerState(lstPw ? "on" : "off");
      BlinkerAliGenie.print();
      break;
    default :
      BlinkerAliGenie.powerState(lstPw ? "on" : "off");
      BlinkerAliGenie.print();
      break;
  }
}
void miotPowerState(const String & state)
{
  if (state == BLINKER_CMD_ON) {
    switchChange(1);
    BlinkerMIOT.powerState(lstPw ? "on" : "off");
    BlinkerMIOT.print();
  } else if (state == BLINKER_CMD_OFF) {
    switchChange(0);
    BlinkerMIOT.powerState(lstPw ? "on" : "off");
    BlinkerMIOT.print();
  }
}

void miotQuery(int32_t queryCode)
{
  lstPw = digitalRead(CHK_PORT);
  switch (queryCode)
  {
    case BLINKER_CMD_QUERY_ALL_NUMBER :
      BLINKER_LOG("MIOT Query All");
      BlinkerMIOT.powerState(lstPw ? "on" : "off");
      BlinkerMIOT.print();
      break;
    case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
      BLINKER_LOG("MIOT Query Power State");
      BlinkerMIOT.powerState(lstPw ? "on" : "off");
      BlinkerMIOT.print();
      break;
    default :
      BlinkerMIOT.powerState(lstPw ? "on" : "off");
      BlinkerMIOT.print();
      break;
  }
}

void dataRead(const String & data)
{
  BLINKER_LOG("Blinker readString: ", data);
  Blinker.vibrate();
  uint32_t BlinkerTime = millis();
  Blinker.print("millis", BlinkerTime);
}
void tickHandle() {
  count++;
}
void heartbeat() {
  uint32_t nowPw = digitalRead(CHK_PORT);
  BtnRemote.text(nowPw ? "开机" : "关机");
  BtnRemote.print(nowPw ? "on" : "off");
  BLINKER_LOG("反馈电平:", nowPw);
}
void setup()
{
  Serial.begin(115200);
  BLINKER_DEBUG.stream(Serial);
  pinMode(CHK_PORT, INPUT);
  pinMode(OUT_PORT, OUTPUT);
  digitalWrite(OUT_PORT, LOW);
  lstPw = digitalRead(CHK_PORT);
  Blinker.begin(auth);
  Blinker.attachData(dataRead);
  BlinkerMIOT.attachPowerState(miotPowerState);
  BlinkerMIOT.attachQuery(miotQuery);
  BlinkerAliGenie.attachPowerState(aligeniePowerState);
  BlinkerAliGenie.attachQuery(aligenieQuery);
  BtnRemote.attach(btn_callback);
  myTicker.attach(4, tickHandle);//4s ticked
  Blinker.attachHeartbeat(heartbeat);
}
void reconnect() {
  BLINKER_LOG("Reconnecting MQTT...");
  if (!Blinker.connected()) {
    Blinker.connect();
    count = 0;
  }
}
void loop()
{
  Blinker.run();
  if (count >= 5) {
    if (!Blinker.connected()) {
      reconnect();
    } else {
      count = 0;
    }
  }
  uint32_t nowPw = digitalRead(CHK_PORT);
  if (nowPw != lstPw) {
    BtnRemote.text(nowPw ? "开机" : "关机");
    BtnRemote.print(nowPw ? "on" : "off");
    BLINKER_LOG("变化电平:", nowPw);
  }
  lstPw = nowPw;
}[/mw_shl_code]





b.png
a.png
  • TA的每日心情
    开心
    2020-8-11 10:02
  • 签到天数: 504 天

    [LV.9]以坛为家II

    发表于 2020-4-17 22:23 | 显示全部楼层
    你这个板接通电源瞬间,ESP8266会自检,用于控制电脑,会自动开机的需要改电路。

    该用户从未签到

     楼主| 发表于 2020-4-19 17:14 | 显示全部楼层
    keliyuan 发表于 2020-4-17 22:23
    你这个板接通电源瞬间,ESP8266会自检,用于控制电脑,会自动开机的需要改电路。 ...

    我最开始测试其它设备比如小灯什么的,确实会上电动作,但我不是这方面专业人士,不会解决。
    但主机电源刚通电那一瞬间,继电器虽然会动作一下,但主板供电条件不完全具备,开不了机的,亲测。

    该用户从未签到

    发表于 2020-4-20 00:36 | 显示全部楼层
    其实不需要继电器
  • TA的每日心情
    慵懒
    2020-4-15 14:17
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2020-4-20 15:31 | 显示全部楼层
    电源选项设置一下是不是可以关机?
    再接一个引脚给重置键,是不是就可以重启?
    再接一个引脚给显示器电源,是不是就可以把屏幕一起给控制了?

    该用户从未签到

     楼主| 发表于 2020-4-20 20:29 | 显示全部楼层
    本帖最后由 suen.sun 于 2020-4-20 20:31 编辑
    shark526 发表于 2020-4-20 15:31
    电源选项设置一下是不是可以关机?
    再接一个引脚给重置键,是不是就可以重启?
    再接一个引脚给显示器电源, ...

    理论上都是可以的,我这么做主要是想在公司开家里的电脑,远程传点资料,下个片什么的。
    电源选项我设置的是休眠。关机很久都没有关过了。

    该用户从未签到

    发表于 2020-4-28 11:46 | 显示全部楼层
    shark526 发表于 2020-4-20 15:31
    电源选项设置一下是不是可以关机?
    再接一个引脚给重置键,是不是就可以重启?
    再接一个引脚给显示器电源, ...

    显示器电源不需要控制的呀
  • TA的每日心情
    无聊
    2020-7-17 14:41
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    发表于 2020-7-12 21:13 | 显示全部楼层
    你好,请问一下ESP-01S是否可以拿GPIO2当输入检测角?我自己写的程序会出现:当给2输入3.3v电压时,及时断电了。但此时2角还是高电平。只有再次给3.3v才会变成低电平!

    该用户从未签到

    发表于 2020-7-14 12:12 | 显示全部楼层
    本帖最后由 lh5263872 于 2020-7-14 12:13 编辑
    xiamo 发表于 2020-7-12 21:13
    你好,请问一下ESP-01S是否可以拿GPIO2当输入检测角?我自己写的程序会出现:当给2输入3.3v电压时,及时断 ...

    01s就两个gpio,我的方法是一个gpio直接输出1秒高电平到电脑开机按钮那根线
    检测状态是另外一个gpio直接程序里PULLUP拉高,接到电脑电源指示灯那根线检测
  • TA的每日心情
    擦汗
    2020-3-9 08:21
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2020-7-14 12:55 | 显示全部楼层
    lh5263872 发表于 2020-7-14 12:12
    01s就两个gpio,我的方法是一个gpio直接输出1秒高电平到电脑开机按钮那根线
    检测状态是另外一个gpio直接程 ...

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

    本版积分规则

    热门推荐

    5分钟带你快速了解新一代开发板:M5STACK
    5分钟带你快速了解新一代
    一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
    创客火首发无人机编队套装,开启不一样的人工智能教育
    创客火首发无人机编队套装
    2017年国务院发布《新一代人工智能发展规划》,提出要广泛开展人工智能科普活动,在中
    未见过的TFT屏,是什么驱动芯片?
    未见过的TFT屏,是什么驱
    这两块屏是从POS机里拆的,准备做几个锂电池组电压监测,在网上没找到资料,在这里问
    win10系统显示不出端口信息,编译后显示serial port not selected。
    win10系统显示不出端口信
    求各位哥哥帮忙,小兄弟实在不懂是win10系统的原因,还是需要安装什么驱动程式?具体
    更智能的电脑远程开关机-基于继电器
    更智能的电脑远程开关机-
    我只是刚刚入门的萌新,所以有不足请指出 先展示下 功能:开关机,开关机检测,
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表