|
本帖最后由 culapple 于 2018-12-1 01:49 编辑
最近呢,有个很小的项目 需要反馈现场电源工作状态,着急开发,没时间做方案。我又是个懒人,手头有块前几个星期买的wifiduino板子,就想到用MQTT方案做个了!说干就干,撸起袖子撸啊~
1开篇:硬件
项目很简单,手头有个5V继电器。高电平触发,我把它反过来用了。
就有把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了,还别说我之前搞家里路由器梅林固件里发现过一个好东西,能把家里谁上线下线路由器状态返回的小插件。回家翻开家里路由管理页面 ,看了下,
就这个了!
不是开源,它叫在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();
}
|
|