Wifiduino(esp8266)+blinker+微信消息推送-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6203|回复: 2

[分享] Wifiduino(esp8266)+blinker+微信消息推送

[复制链接]
发表于 2018-12-1 00:38 | 显示全部楼层 |阅读模式
本帖最后由 culapple 于 2018-12-1 01:49 编辑

最近呢,有个很小的项目 需要反馈现场电源工作状态,着急开发,没时间做方案。我又是个懒人,手头有块前几个星期买的wifiduino板子,就想到用MQTT方案做个了!说干就干,撸起袖子撸啊~
1开篇:硬件
项目很简单,手头有个5V继电器。高电平触发,我把它反过来用了。
TIM图片20181130232307.png
就有把220V电源用5V充电头,VCC和IN并起来 直接驱动继电器,断电了就释放,原来的输出端,我公共端接D5 常闭接GND 常开接3.3V
这样220V有电的时候 D5就是高电平,断电了D5就是低电平。(目前发现D5低电平设备没法重启)
我通过检测D5的引脚电平就知道现场有没有电了。
2过程:软件
开发呢,很简单,检测D5的状态就行
重点来了,如何把消息发给我呢?
我要的断电就立刻给我发条消息,
根据开发文档blinker文档-特有功能-通知功能
Blinker.notify(),Blinker.sms(),Blinker.push(),Blinker.wechat(),后两个还没开发好我来讲讲各个优缺点。
notify必须app后台运行,不太现实,但是已经测试ok可以运行
sms短信,可行,已经在使用,缺点:短信一天就10条,普通用户只能给自己发,付费用户可以自定义10个人
push没开发,没法用
wechat 没开发好,没法用
最后只用sms可用了,勉强上线,在短信的基础上加了个按钮检测,短信来了我登录app上线确认下就可以百分百确认现场没电了
可我不满足啊,每天只有10条短信,我要是多个机位肯定不够用啊!我就自己倒腾起wechat了,还别说我之前搞家里路由器梅林固件里发现过一个好东西,能把家里谁上线下线路由器状态返回的小插件。回家翻开家里路由管理页面 ,看了下, TIM图片20181130234304.png 就这个了!

不是开源,它叫在Server酱。我就借用了他的平台 用起来很简单
开通并使用上它,只需要一分钟:
  • 登入:用GitHub账号登入网站,就能获得一个SCKEY(在「发送消息」页面)
  • 绑定:点击「微信推送」,扫码关注同时即可完成绑定
  • 发消息:往 http://sc.ftqq.com/SCKEY.send 发GET请求,就可以在微信里收到消息啦
根据要求我用github登录,微信绑定,或者sckey,就可以通过发送一条post/get请求把消息推送到微信了~



3.代码的编写




[mw_shl_code=arduino,true]#define BLINKER_PRINT Serial
#define BLINKER_MQTT
#include <Blinker.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

char auth[] = "Your MQTT Secret Key";
char ssid[] = "Your WiFi network SSID or name";
char pswd[] = "Your WiFi network WPA password or WEP key";
String key = "Your server Secret Key";//sever酱获取的key

const int PowerPin = 5;
int Power = 0;
int LPower = 0;


BlinkerButton Button1("btn-abc");




// 按下按键即会执行该函数
void button1_callback(const String & state) {
    BLINKER_LOG("get button state: ", state);
//检测5口电源状态
     Power = digitalRead(PowerPin);
    if ( Power == 1 )
    {
      BLINKER_LOG("220V电源在线。" );
      Blinker.print("220V电源在线。" );
      digitalWrite(LED_BUILTIN, LOW);
      wechat("220V电源已上线。","我已经活过来了");//发送微信通知消息
     }
     
      else{
      BLINKER_LOG("220V电源离线" );
      Blinker.print("220V电源离线" );
      digitalWrite(LED_BUILTIN, HIGH);
     wechat("220V电源已离线!!!","我要挂了");
     
           }
}

//自定义微信推送  wechat(消息名字,消息内容){};// 注意:同样的消息内容1分钟内只能发送一次
void wechat(String title,String message)
{
HTTPClient http;
   //发送post请求,把消息发出去
http.begin("http://sc.ftqq.com/"+key+".send?text="+title+"&desp="+message);

   BLINKER_LOG("[HTTP] GET...");//等待服务器反馈
   Blinker.print("[HTTP] GET...");
   int httpCode = http.GET();
    if (httpCode > 0)
    {
      // HTTP header has been send and Server response header has been handled
   

      // file found at server
      if (httpCode == HTTP_CODE_OK) {

        // get lenght of document (is -1 when Server sends no Content-Length header)
        int len = http.getSize();

        // create buffer for read
        uint8_t buff[128] = { 0 };

        // get tcp stream
        WiFiClient * stream = http.getStreamPtr();

        // read all data from server
        while (http.connected() && (len > 0 || len == -1)) {
          // get available data size
          size_t size = stream->available();

              if (size)
              {
                // read up to 128 byte
                int c = stream->readBytes(buff, ((size > sizeof(buff)) ? sizeof(buff) : size));
                // write it to Serial
                BLINKER_PRINT.write(buff, c);
               
                   if (len > 0)
                      {
                       len -= c;
                       }
              }
           delay(1);
          }
            BLINKER_LOG("[HTTP] connection closed or file end.");
            Blinker.print("[HTTP] connection closed or file end.");
            }
        }
    else {
            Blinker.print("[HTTP] GET... failed, error: ", http.errorToString(httpCode).c_str());
            BLINKER_LOG("[HTTP] GET... failed, error: ", http.errorToString(httpCode).c_str());
            }

    http.end();
//结束
  }

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

    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, LOW);
    pinMode(PowerPin, INPUT);   
    Blinker.begin(auth, ssid, pswd);
    Button1.attach(button1_callback);
}

void loop()
{
    Blinker.run();
//实时检测电源状态
    Power = digitalRead(PowerPin);
      
    if (Power != LPower)
    {
      if(Power == HIGH)
      {
     //Blinker.sms("220V电源上线。 !!! ");
        BLINKER_LOG("220V电源在线。" );
      Blinker.print("220V电源在线。");
      wechat("220V电源已上线。","我已经活过来了");//发送微信通知消息
      }
      else
      {
      
      // Blinker.sms("220V电源已离线!!! ");
        BLINKER_LOG("220V电源离线。" );
        Blinker.print("220V电源离线。");
      wechat("220V电源已离线!!!","我要挂了");

      }
      LPower = Power;
     }

//无关紧要的代码
  if (Blinker.available())
       {
        BLINKER_LOG("Blinker.readString(): ", Blinker.readString());
        uint32_t BlinkerTime = millis();
        Blinker.vibrate();        
        Blinker.print("millis", BlinkerTime);
        
       }

      
}[/mw_shl_code]

4总结:
其实整个代码说简单点3行代码解决微信消息问题 server酱获取key
就是esp8266联网,
然后加个#include <ESP8266HTTPClient.h>库
加个String key = "dsakjhdiasgdkjashdlash";//sever酱获取的key
然后3行代码搞定

void wechat(String title,String message)
{
HTTPClient http;
http.begin("http://sc.ftqq.com/"+key+“.send?text="+title+"&desp="+message);  //发送post请求把消息发出去就可以了 除非调试,后面是事不用管
http.end();
}






发表于 2020-2-26 22:46 来自手机 | 显示全部楼层
看起来好牛逼啊,不会代码的我情以何堪啊。
发表于 2020-2-27 18:18 | 显示全部楼层
这个好,可以用微信接送状态消息,学习学习
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-28 05:39 , Processed in 0.103233 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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