简介

本文是此次物联网项目的终结篇。本文将演示如何整合之前的文章中的模块和代码,来简单的完成一个物联网项目。最终的实现效果是:利用Iphone手机上的MQTTool App,来获取DHT11的温湿度数据,以及控制继电器的开合。

在阅读本文前,你可能需要阅读下面的文章:

注备工作

  1. 将DHT11库安装到Arduino的开发环境中
  2. 将Obloq库安装到Arduino的开发环境中
  3. 已经搭建好MQTT服务器,且能完成MQTT通信
  4. 按照前面文章中的电路图连接好所有的模块 ,引脚可以根据需要调整
  5. 手机上安装MQTT客户端软件,例如IOS平台的MQTTool

代码

 需要修改下面的server、port等相关参数,以适配自己实际的使用环境。然后下载到Arduino板中。

#include <stdint.h>
#include <Obloq.h>
#include <SoftwareSerial.h>
#include <dht11.h>

#define RELAY_PIN 8              //驱动继电器模块的引脚
#define DHT11_PIN 9              //驱动DHT11传感器的引脚
unsigned long prev_time=0;       //上一次发布温湿度的时间
uint8_t temperature ,humidity ;  //保存温度和湿度


const String server = "www.lulipro.com";          //MQTT服务器的IP或者主机名
const String port= "1883";                      //MQTT服务器的端口
const String iotId = "user1";                 //MQTT服务器的用户名
const String iotPwd = "abcd1234";                 //MQTT服务器的密码
const String topic_led = "home/led_ctrl";                  //订阅的主题
const String topic_dht11 = "home/temp_hum";                 //订阅的主题


const String wifiSSID = "TP-LINK12345";         //obloq模块连接的WIFI名,改成你用的WIFI名,最好不要有中文
const String wifiPwd = "aaaabbbb";              //obloq模块连接的WIFI密码,改成你用的WIFI密码

SoftwareSerial obloqModuleSerial(10,11);      // 创建一个软串口,用于和obloq模块进行通信:10是其RX(接Obloq的TX) ,  11是其TX(接Obloq的RX)

Obloq olq(&obloqModuleSerial,wifiSSID,wifiPwd,server,port,iotId,iotPwd);  //如果你需要使用自己的MQTT服务器的话,就使用这个构造函数,并指定MQTT服务器的IP和通信端口。



//已监听设备的消息回调函数,可以在这个函数里面对接收的消息做判断和相应处理,需要用setMsgHandle()来设置这个回调函数
void msgHandle(const String& topic,const String& message)
{
    if(topic==topic_led)
    {
        if(message == "off")    //如果收到了关于topic1主题的"off"消息,则关闭继电器
        {
          digitalWrite(RELAY_PIN,LOW);
        }
        else if(message == "on") //如果收到了关于topic1主题的"on"消息,则打开继电器
        {
            digitalWrite(RELAY_PIN,HIGH);
        }
    }
}

void setup(void)
{

    obloqModuleSerial.begin(9600);   //obloq模块的串口通信波特率是9600,所以要把软串口的波特率也设置为9600

    olq.setMsgHandle(msgHandle);//注册消息回掉函数

    olq.subscribe(topic_led);    //订阅主题

    DHT11_init(DHT11_PIN);
    pinMode(RELAY_PIN,OUTPUT);
    digitalWrite(RELAY_PIN,LOW);

}

void loop(void)
{
  olq.update();  //轮询
  if(millis() - prev_time > 2000)   //每隔2s发布一次温湿度数据
  {

    if(DHT11_read(&temperature,&humidity))
    {
        olq.publish(topic_dht11,String(temperature)+"&"+String(humidity));  //格式 :温度&湿度
        prev_time=millis();
    }
  }

}
03-26 06:42