小爱同学开电脑 esp8266 12f-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7405|回复: 11

[分享] 小爱同学开电脑 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
发表于 2020-4-17 22:23 | 显示全部楼层
你这个板接通电源瞬间,ESP8266会自检,用于控制电脑,会自动开机的需要改电路。
 楼主| 发表于 2020-4-19 17:14 | 显示全部楼层
keliyuan 发表于 2020-4-17 22:23
你这个板接通电源瞬间,ESP8266会自检,用于控制电脑,会自动开机的需要改电路。 ...

我最开始测试其它设备比如小灯什么的,确实会上电动作,但我不是这方面专业人士,不会解决。
但主机电源刚通电那一瞬间,继电器虽然会动作一下,但主板供电条件不完全具备,开不了机的,亲测。
发表于 2020-4-20 00:36 | 显示全部楼层
其实不需要继电器
发表于 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
电源选项设置一下是不是可以关机?
再接一个引脚给重置键,是不是就可以重启?
再接一个引脚给显示器电源, ...

显示器电源不需要控制的呀
发表于 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拉高,接到电脑电源指示灯那根线检测
发表于 2020-7-14 12:55 | 显示全部楼层
lh5263872 发表于 2020-7-14 12:12
01s就两个gpio,我的方法是一个gpio直接输出1秒高电平到电脑开机按钮那根线
检测状态是另外一个gpio直接程 ...

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

本版积分规则

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

GMT+8, 2024-11-28 14:30 , Processed in 0.083318 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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