从零开始学物联网:远程控制家里筒灯的开和关(三)

804 阅读4分钟

本学习过程由易到难,分为下面几篇文章:

前两篇文章中,为了便于入门者理解和学习,讲解了如何点亮esp8266开发板中的内置灯。

大家肯定会觉得不过瘾,不够实用,毕竟如果不是学习目的的话,没有人会去做这样的案例。

因此,本课程就专门来讲解如何开发一个真正远程点亮家里灯的项目(这里不再赘述如何安装编译器和驱动的问题,有需要了解的同学,可以看上面的文章)。

先看看最终的效果视频:

声明:本文用到的筒灯电压是家用电压220V,大家如果需要实践,请谨慎;未成年人请在家长陪同下实践;本文作者不对产生的安全事故负责。

一、硬件准备

名称数量说明
esp8266-12F开发板1接入WIFI,传输数据,远程控制
1路5V继电器1开关控制
接线端子2方便接线
筒灯1这里用的是松下的桶灯
充电宝1这里的作用是给esp8266开发板供电
杜邦线3连接esp8266开发板和继电器

image.png

image.png

image.png

image.png

二、接线

实际的接线如下图所示:

c778ce6aca8fdb8c828bd806d9240b3.jpg

即:esp8266的正负极接入继电器的正负极,esp8266的D0端口接入继电器的信号端口;继电器的两端接入筒灯的正极或者负极线(继电器不分正负极)。

三、代码

把下面的代码拷贝到你的arduino编辑器中,修改里面的wifi名称wifi密码Bmob后端云用户名密码,然后就可以上传到你的esp8266开发板中了。

/*
* 网址:https://www.bmobapp.com
* wechat:18102215493
*/

// 加载WIFI头文件
#include <ESP8266WiFi.h>
// 加载MQTT库文件
#include <PubSubClient.h>

// 你的WIFI名称,需要修改
const char* WIFI_SSID = "kelike";
// 你的WIFI密码,需要修改
const char* WIFI_PASSWORD = "kelike888";
// Bmob云的物联网地址
const char* MQTT_SERVER = "broker.codenow.cn";
// Bmob云的物联网端口
const int MQTT_PORT = 1883;
// 灯光引脚
const int LED = 16;
// 用户名,到Bmob云->创建的应用->IOT->连接信息 中获取 用户名
#define APPID  "663ae40d824882e7"
// 密码,到Bmob云->创建的应用->IOT->连接信息 中获取 密码
#define APPPASSWORD "19a66167a0eadaca"
// 你自己定义的设备类型,方便记忆就好,这里的LINE表示灯光的意思
#define TYPE  "LINE"

WiFiClient espClient;
PubSubClient client(espClient);

// 打开灯泡
void turnOnLed() {
  Serial.println("打开灯光");
  digitalWrite(LED, LOW);
}
// 关闭灯泡
void turnOffLed() {
  Serial.println("关闭灯光");
  digitalWrite(LED, HIGH);
}

// 配置esp8266的WIFI账号和密码
void setup_wifi() {
  delay(10);
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(WIFI_SSID);
  // 设置WIFI的账号和密码
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  // 检测WIFI是否联通
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi已连接");
}

// MQTT服务的回调
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print(topic);
  Serial.print(" 主题收到消息");
  String message = "";
  for (int i = 0; i < length; i++) {
    message += (char)payload[i];
  }
  Serial.print(message);
  Serial.println();

  if (message == "on") {
    //如果接收到on字符串,调用开灯方法
    turnOnLed();//开灯函数

  } else if (message == "off") {
    //如果接收到off字符串,调用关灯方法
    turnOffLed();
  }
  message = "";
}

void reconnect() {
  while (!client.connected()) {
    Serial.print("正在尝试MQTT连接...");

    String client_id = "esp8266client";
    client_id += String(WiFi.macAddress());
    if (client.connect(client_id.c_str(), APPID, APPPASSWORD)) {
      Serial.println("正常连接");

      //这是你的主题名称
      String topic = "devices/" + String(TYPE) + "/" + client_id;
      client.subscribe(topic.c_str());
    } else {
      Serial.print("连接异常,rc=");
      Serial.print(client.state());
      Serial.println(" 5秒后重试");
      // 5秒重试
      delay(5000);
    }
  }
}

void setup() {
  pinMode(LED, OUTPUT);
  // 设置波特率
  Serial.begin(115200);
  // 配置WIFI并连接上网
  setup_wifi();
  // 连接MQTT服务
  client.setServer(MQTT_SERVER, MQTT_PORT);
  // 设置MQTT消息回掉
  client.setCallback(callback);
  digitalWrite(LED, HIGH);
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
}

可能会有人疑问,为什么我会把信号线的数字标记为16,这里给一个参考图,大家一看就明白了:

8266.png

四、测试

一切准备就绪,我们给筒灯通上220V的家用电源,再用之前的方法,在小程序或者Bmob后端云的中控后台中开或者关的时候,就会听到继电器发出的声音,筒灯随之开或者关。

为了方便测试,我这里把筒灯的电源端绑住手机充电头,插到插座上,如下图所示:

aa1bbebe43bdc7ae2941605ef496591.jpg