利用ESP8266控制群晖ds120J开关机-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2891|回复: 3

利用ESP8266控制群晖ds120J开关机

[复制链接]
发表于 2021-5-6 15:46 | 显示全部楼层 |阅读模式
本帖最后由 dyydyy 于 2021-5-6 15:53 编辑

购买ds120J后,远程开关机研究不出方法。最近学习ESP8266模块,有所启发。关于该模块可上网搜索。借助该模块远程开关群晖有两种思路。一是关机利用群晖管家实现,开机用ESP8266发送局域网唤醒信号实现。该方法不需要变动群晖硬件电路,但本人初学ESP8266,没有去研究。本贴主要针对第二种方法进行说明。
一、基本思路
群晖开关机按键是利用开工按下时产生的低电平脉冲达到开关机目的。远程控制ESP8266数字引脚模拟低电平即可开关机。同时采集开关按键上的状态指示灯反馈给手机当前群晖工作状态。另外用ds18b20传感器采集群晖机内温度显示在手机端。
二、硬件
1、Esp8266mini d1 学习板。2、d1 mini 电源模块。3、ds18b20测温模块。共计17元左右。

696dcd40733d5126519234cbf2fc888.jpg f066fc84b75dfb0385f3b07b668fe19.jpg ae5c84297545456538d5383722ef75d.jpg


三、硬件连接
Ds18b20开关板共3根线。经测量,黑线为地线,黄线为开关信号线,红色为led工作状态指示,黄线、红线工作电平为2.8伏左右。接线如图。D4反向接二极管主要是隔离作用,esp8266常态输出高电平为3.3v二极管不导通,与群晖主板隔离。模拟按下时二极管导通,相当于黄线接地。
a998957480360adcfe51cdcbabd8e7e.jpg 46763d9d76068ebd823fbee86f8c758.jpg a7cd956ff5934c7ef3d528720b21dfc.jpg 5de54fd90d9666eb956b6c8c4ff91da.jpg a8dc9ca29490769258d51c89db32273.jpg
四、软件开发环境
开发需用到Arduino1.85+点灯科技Blinker+esp8266库+ DallasTemperature库。相关知识可网络搜索。手机端安装好点灯blinker app。
五、相关程序
1、Esp8266程序:
#define BLINKER_WIFI
#include <Blinker.h>
//////////////////#include<OneWire.h>
#include <DallasTemperature.h>
char auth[] = "***********";  //设备密钥  


//重定义引脚
#define PIN_kg 2  //2脚接开关按键 D4
#define PIN_kgled 14 //0脚接开关机led D5
#define ONE_WIRE_BUS 4 //1-wire数据总线连接在D2
OneWire oneWire(ONE_WIRE_BUS); //声明
DallasTemperature sensors(&oneWire); //声明

// 新建组件对象
BlinkerButtonButton1("btn-kg");   //开关按键
BlinkerText Text_ip("tex-ip");     //显示ip地址
BlinkerNumberRSSIval("Rssi");    //显示信号强调
BlinkerNumberWD_Number("num-wd");    //显示温度
BlinkerButton REFRESH("Refresh");//刷新按钮
int rssi_read;
float tempC;
/////////////////////////////////////////////////////////////////////
void button1_callback(const String &state)  //开关按键回调函数
{
   BLINKER_LOG("get button state:",state);  //在APP端调试窗口输出按键按下后的状态
   if(state=="press")                       //普通按键按下后,键值为“press”
    {
     digitalWrite(PIN_kg,LOW);        //输出低电平   
     Button1.color("red");             //按键图标颜色为红色
     Button1.text("群晖开关按下");
     Button1.print("press");           //状态反馈至按键,键值保存为“press”
    }
    else if(state=="pressup")          //开关按键松开,键值为“pressup”  
   {     
     digitalWrite(PIN_kg,HIGH);      //输出高电平
     Button1.color("#fddb00");        //按键图标颜色为黄色
      Button1.text("群晖开关松开");
     Button1.print("pressup");             //状态反馈至按键,键值保存为“pressup”
    }
   Blinker.vibrate();                   //振动,默认值为200ms

}
//////////////////////////////////////////////////////
void refresh_callback(const String &state){    //刷新回调函数
heartbeat();
}

//WD_Number////////////////////////////
void WD_Number_callback(const String & state){    //刷新回调函数
  heartbeat();
}
////////////////////////////////////////////SSS
boolean ledzt;      //记录led第一次检测的状态
void kgled()        //根据led的亮灭闪检测两次,判断群晖工作状态
{ledzt= digitalRead(PIN_kgled);
    delay(500);   //脉冲宽度为400,测量500内信号
    if (digitalRead(PIN_kgled)==ledzt) //两次测量一样
      {
         if (ledzt) {Button1.color("blue");Button1.text("群晖运行中");  } //两次读取是高,兰色正常运行中
         else {Button1.color("gray");Button1.text("群晖已经关机");}      //两次读取是低,灰色关机中

       }
         else if (digitalRead(PIN_kgled)!=ledzt)                  //两次测量不一样
         {Button1.color("#fddb00"); Button1.text("群晖准备中"); } //两侧读取不一样,准备中显示黄色
  Button1.print("");                                             //更新开关键图标颜色,反馈工作状态      
}
///////////////////////////////////
void rssi_xs()   //信号强调显示
{
rssi_read = WiFi.RSSI();
RSSIval.print(rssi_read);
   if(rssi_read >= -60){
     RSSIval.icon("fas fa-signal");
     RSSIval.color("#008000");
    }
    else if(rssi_read < -60 && rssi_read >= -72){
     RSSIval.icon("fad fa-signal-4");
     RSSIval.color("#90EE90");
    }
   else if(rssi_read < -72 && rssi_read >= -80){
     RSSIval.icon("fad fa-signal-3");
     RSSIval.color("#FF8C00");
    }
   else if(rssi_read < -80 && rssi_read >= -85){
     RSSIval.icon("fad fa-signal-2");
     RSSIval.color("#FF7F50");
    }
   else if(rssi_read < -85 && rssi_read >= -100){
     RSSIval.icon("fad fa-signal-1");
     RSSIval.color("#F0000");
    }
   else if(rssi_read < -100){
     RSSIval.icon("fas fa-signal-slash");
     RSSIval.color("#696969");
    }
  }
///////////////////////////
int count=0;
bool WIFI_Status = true;
//////////////////////////////////////////////////////////
void smartConfig()//配网函数
{
WiFi.mode(WIFI_STA);//使用wifi的STA模式
  WiFi.beginSmartConfig();//等待手机端发出的名称与密码
  //死循环,等待获取到wifi名称和密码
while (1)
  {
   delay(1000);                                             
   if (WiFi.smartConfigDone())//获取到之后退出等待
   {   
     break;
    }
  }
}
//////////////////////////////////////////////////////////
void WIFI_Init()
{
    //当设备没有联网的情况下,执行下面的操作
   while(WiFi.status()!=WL_CONNECTED)
    {
       if(WIFI_Status)//WIFI_Status为真,尝试使用flash里面的信息去 连接路由器
       {
           delay(1000);                                       
           count++;
           if(count>=5)
           {
                WIFI_Status = false;
            }
       }
       else//使用flash中的信息去连接wifi失败,执行
       {
           smartConfig();  //smartConfig技术配网
       }
    }  
}
////////////////////////////////////////////////////////////////////////////
void heartbeat() {
kgled();                                            //获取工作状态=开or关or准备
Text_ip.print(WiFi.localIP().toString().c_str());  //反馈IP地址
rssi_xs(); //更新信号强度

  temp_zh();
}
/////////////////////////////////////////////////////////////////////////////////
void setup()
{
   Serial.begin(115200);
   BLINKER_DEBUG.stream(Serial);
  BLINKER_DEBUG.debugAll();  //打开全部调试信息
   pinMode(PIN_kg, OUTPUT);  //配置按键IO口为输出状态
   pinMode(PIN_kgled, INPUT);//开工按键led 输入状态
   digitalWrite(PIN_kg,HIGH); //拉高IO口,群晖按钮按下是低电平,这里初始化为高电平,相当于未按下按钮
Blinker.begin(auth,WiFi.SSID().c_str(),WiFi.psk().c_str());//运行blinker
   WIFI_Init();//初始化wifi
   Blinker.attachHeartbeat(heartbeat);          //将传感器获取的数据传给
   Button1.attach( button1_callback);
   REFRESH.attach(refresh_callback);
   sensors.begin(); //初始化总线
   sensors.setWaitForConversion(false); //设置为非阻塞模式
}
/////////////////////////////////////////////
void temp_zh()
{
   Serial.println("发起温度转换");
   sensors.requestTemperatures(); //发起新的温度转换
   tempC = sensors.getTempCByIndex(0); //获取索引号0的传感器摄氏温度数据
   if (tempC != DEVICE_DISCONNECTED_C)      //如果获取到的温度正常
    {
     Serial.print("\n当前温度是: ");
     Serial.print(tempC);
     Serial.println(" ℃");
     WD_Number.print(tempC);
    }

}
////////////////////////////////
void loop()
{
Blinker.run();     //运行Blinker
ESP.wdtFeed();     //喂狗
}

2、blinke界面配置文件
{¨config¨{¨headerColor¨¨transparent¨¨headerStyle¨¨dark¨¨background¨{¨img¨¨assets/img/bg/4.jpg¨}}¨dashboard¨|{¨type¨¨btn¨¨ico¨¨fadfa-power-off¨¨mode¨É¨t0¨¨群晖开关¨¨t1¨¨文本2¨¨bg¨É¨cols¨Í¨rows¨Í¨key¨¨btn-kg¨´x´Í´y´Ì¨speech¨|÷¨clr¨¨#595959¨¨lstyle¨Ë}{ß9¨tex¨ßE¨xxx.xxx.x.x¨ßG¨控制器IP地址¨¨size¨¤EßIÉßB´´ßJÍßKËßL¨tex-ip¨´x´É´y´ÌßN|÷ßQÌßO¨#076EEF¨}{ß9¨num¨ßE´´ßB¨fasfa-thermometer-three-quarters¨ßO¨#00A90C¨¨min¨É¨max¨¢1c¨uni¨¨℃¨ßIÊßJÍßKÍßL¨num-wd¨´x´É´y´ÐßN|÷ßQÍ}{ß9ßAßB¨far fa-sync¨ßDÉßE¨刷新¨ßGßHßIÉßJÍßKÍßL¨Refresh¨´x´Í´y´ÐßN|÷ßOßZßQË}{ß9ßXßE¨控制器信号强度¨ßB¨fadfa-signal¨ßO¨#389BEE¨ßaÉßbº0ßc¨dBm¨ßIÉßJÍßKËßL¨Rssi¨´x´É´y´ÎßN|÷ßQÊ}{ß9¨deb¨ßDÉßIÉßJÑßKÌßL¨debug¨´x´É´y´¤D}÷¨actions¨|÷¨triggers¨|÷}
201aeb54efe75ffbb551806abc80cf7.jpg
六、使用说明
手机端显示信息有该控制器的局域网地址,wifi信号强调,机内温度。另外开关按键兼工作状态指示,还有一个刷新按钮。
关机状态下,手机端开关按键颜色为灰色。按钮按下,群晖接收到按下信息显示红色,开机过程中群晖主机按键闪烁,手机端按键颜色为黄色。开机后群晖按键常亮,对应手机端按键为蓝色。关机时需要按键4秒钟以上,手机端按键变为黄色,最终关机后变为灰色。特别说明,因开关机按键闪烁时刷新程序中只做简单判断,有一定误差,本应黄色显示为蓝色或灰色。

发表于 2021-5-6 21:49 | 显示全部楼层
牛人哦 这都能做出来 我想做个点灯控灯的 用小米手机的米家 这手机这和APP这块搞好了但开发软件不知那个版本的IDE支持XP或WIN732位机 请高人指点下
 楼主| 发表于 2021-5-7 07:50 | 显示全部楼层
阿飞7812 发表于 2021-5-6 21:49
牛人哦 这都能做出来 我想做个点灯控灯的 用小米手机的米家 这手机这和APP这块搞好了但开发软件不知那个版 ...

blinker 可以,有米家库。我玩过。https://diandeng.tech/doc/xiaoai#blinker%E5%B0%8F%E7%88%B1%E5%90%8C%E5%AD%A6%E6%8E%A5%E5%8F%A3%E5%87%BD%E6%95%B0,网上例程很多
发表于 2021-6-3 00:06 | 显示全部楼层
厉害了,够学习一阵的了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-1 05:24 , Processed in 0.082468 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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