Gravity: WiFi IoT Moudle

1 产品介绍

WiFi IoT Module是一款支持多种编程平台,多种物联网平台的WiFi模块。它支持micro:bit、Arduino、STM32等多种开发板,MakeCode、Mind+、Arduino IDE等多种编程环境;支持Easy IoT、IFTTT、ThingSpeak、ONENET、SIOT、BeeBotte等多种流行的物联网平台。

WiFi IoT Module采用极其易用的Gravity接口,支持UART和I2C通信协议。不论是课堂IoT教学,还是家电的物联网改装,选用WiFi IoT Module都是非常好的方案。

2 产品布局图

3 产品参数

4 引脚说明

标号 名称 功能描述
1 D/R 数据线(I2C)/接收端(UART)
2 C/T 时钟线(I2C)/发送端(UART)
3 GND 电源负极
4 VCC 电源正极(3.3~5.0V)

5 信号灯说明

指示灯颜色 指示状态
红色 断开连接
蓝色 正在连接
绿色 正常工作
紫色 MQTT断开连接

6 基于Mind+编程

6.1硬件准备

WiFi IoT模块兼容OBLOQ物联网模块,连接方式上有UART和I2C模式,板载开关拨到UART则完全兼容OBLOQ模块,拨到I2C模式,则接线采用I2C方式,程序初始化使用I2C初始化即可。推荐使用I2C模式,不会与其他UART设备冲突。

6.2软件操作

1、下载及安装软件1.7.0及以上版本。下载地址:https://mindplus.cc 详细教程:安装教程
2、切换到“上传模式”。 详细教程:Mind+基础wiki教程-上传模式编程流程
3、“扩展”中选择“主控板”中的“Arduino Uno”或“micro:bit”。通信模块中加载OBLOQ物联网模块后返回。 详细教程:Mind+基础wiki教程-加载扩展库流程
4、进行编程,可直接参考OBLOQ的教程,使用I2C模式接线及初始化积木即可。OBLOQ物联网教程
5、菜单“连接设备”,“上传到设备”。

6.3 模块功能说明

模块 功能说明
错误消息事件
功能说明:这个模块是用来获取调试信息与错误码。
注:调试信息和错误码可以使用直接拖拽的方式,放在字符串变量中。
接收消息事件
功能说明:当收到MQTT平台发送的消息后执行该模块,本模块是事件触发方式,
在触发事件的同时,会接受到一个变量名为Obloq消息的字符串类型数据。
可选Topic:Topic_0、Topic_1、Topic_2、Topic_3、Topic_4。
MQTT参数配置-I2C
功能说明:配置你的WiFi参数,只需要配置一次,放在主程序下面。
WiFi-名称:填写WiFi名称。。
WiFi-密码:填写WiFi密码。
IoT_id:填写物联网平台的用户ID名。
IoT_pwd:填写物联网平台的用户密码。
Topic_0:填写MQTT平台上Topic栏生成的编码。
服务器:可选用服务器EasyIoT_CN、EasyIoT_EN、SIOT。
IP地址:EasyIoT_CN与EasyIoT_EN无需修改,SIOT需正确填写IP地址。
注:本模块是I2C的WiFi配置。
MQTT参数配置-UART
功能说明:配置你的WiFi参数,只需要配置一次,放在主程序下面。
配置方法与I2C的配置方法一样。使用UART的配置方法时,需要选择接口方式。
注:建议选用软串口,硬串口可能会出现与其他UART设备冲突
发送消息模块
功能说明:发送一个消息到IoT平台指定的Topic订阅号。
可选Topic:Topic_0、Topic_1、Topic_2、Topic_3、Topic_4。
MQTT参数配置-I2C
功能说明:配置你的WiFi参数,只需要配置一次,放在主程序下面。
WiFi-名称:填写WiFi名称。。
WiFi-密码:填写WiFi密码。
IP地址:填写正确的IP地址。
端口号:服务器有很多端口,每个端口对应一个应用程序,只有正确的输入端口号才能访问该服务器。
注:常用端口号:8080(http)、21(FTP)。
MQTT参数配置-UART
功能说明:配置你的WiFi参数,只需要配置一次,放在主程序下面。
配置方法与I2C的配置方法一样。使用UART的配置方法时,需要选择接口方式。

6.4

1.项目介绍

2.准备工作

  1. 进入Easy IoT中文官网https://iot.dfrobot.com.cn/ ,注册并登录。

  2. 点击眼睛图标查看已生成的ID和密钥,并填入MQTT配置模块内的对应位置。服务器选择Easy IoT_CN 。

  3. 查找到你本地的WiFi名和密码,填写到WiFi配置模块内。

  4. 这个项目中,使用WiFi IoT的串口功能进行数据传输。防止与其他设备造成冲突,这里的接口方式建议选择软串口。

3.程序截图

注意:硬件连接中,绿色线连接的是P13引脚,蓝色先连接的是P14引脚。因此,程序模块中,需要选择对应的引脚。

4.效果展示

7 基于MakeCode编程

本章节已经默认你会使用MakeCode编程平台。故主要介绍WiFi IoT Module本身的功能和编程方法,所以MakeCode基础使用部分不做赘述。

7.1平台链接地址及程序库

7.2模块功能说明

7.3 数据上传

1.项目介绍

这个项目,实现一个最简单的数据上传。按下micro:bit主控上的按键A,WiFi IoT Module通过UART通信给Easy IoT发送一个数据,数据为“Hi DFRobot”。

2.准备工作

  1. 进入Easy IoT中文官网https://iot.dfrobot.com.cn/ ,注册并登录。
  2. 点击眼睛图标查看已生成的ID和密钥,并填入MQTT配置模块内的对应位置。服务器选择Easy IoT_CN 。
  3. 查找到你本地的WiFi名和密码,填写到WiFi配置模块内。

3.程序链接
https://makecode.microbit.org/_232WuxYKu5ds

4.程序截图

注意:在程序中正确填写自己的Easy IoT ID和密钥。

5.结果展示

这里使用UART通信方式,所以需要将WiFi IoT Module上的控制开关,拨到UART那侧,否则模块将初始化失败,无法进行数据发送。

程序烧录成功后,WiFi IoT Module指示灯有一个连接过程:红色—蓝色—绿色。按下micro:bit上的按键A,WiFi IoT就发送一条“Hi DFRobot”数据到Easy IoT平台。在如下图位置点击“查看详情”进入数据页面查看收到的数据。

注意:运行时需要使用USB线给IO扩展板供电。

7.4 数据上传-I2C

1.项目介绍

这个项目使用WiFi IoT的I2C通信实现数据上传。按下micro:bit主控上的按键A,WiFi IoT Module就通过I2C给Easy IoT平台发送一个数据,数据为“Hi DFRobot”。

2.准备工作

3.程序链接
https://makecode.microbit.org/_KvD8MmJMdLyD

4.程序截图

5.结果展示

这里使用的是I2C发送数据的方式,所以需要将WiFi IoT Module上的控制开关,拨到I2C那侧,否则模块将初始化失败,无法进行数据发送。

按下micro:bit上的按键A,WiFi IoT就发送一条“Hi DFRobot”的数据到Easy IoT平台。

从项目1、项目2可以看出,无论是使用UART通信还是使用I2C通信,最后实现的功能都是一样的。但使用I2C通信不会占用串口,而且使用方法更为简单,因此在后面的MakeCode教程中都使用I2C通信。

7.5 温度及亮度远程监测

1.项目介绍

使用micro:bit板载的温度传感器和光线传感器,通过micro:bit 、WiFi IoT与Easy IoT云服务器进行数据互通,实现基于物联网的温度及亮度远程监测。

2.准备工作

3.程序链接
https://makecode.microbit.org/_Pow1b0MKRVsm

4.程序截图

5.结果展示
在物联网平台通过WiFi IoT给micro:bit发送数据,micro:bit接收到的数据为“L”时,micro:bit显示当前亮度并上传到物联网平台;当micro:bit接收到的数据为“T”时,micro:bit显示当前温度并上传到物联网平台。刷新页面就可以查看上传的消息。

7.6 邮件发送系统

1.项目介绍

使用WiFi IoT Module连接IFTTT平台,当按下A键后,通过IFTTT发送一封记录了当前温度和光线值的电子邮件。这样就可以通过邮件的方式将当前的温度及光线值实时地发送给你关心的人。

2.准备工作

  1. 打开IFTTT官网https://ifttt.com/ 点击sign in登录。

  2. 登录成功后,进入下面界面。

  3. 点击Create进入后就可以看到如下界面。

  4. 然后点击if this进行This配置,在输入框中搜索webhooks。

  1. 点击进去第一次会出现如下界面,点击“Receive a web request”。

  2. 填写Event Name就完成this的创建(可自定义事件名称)。

  3. 创建完成后会自动返回,然后在点击That进行That设置,搜索“Email”并点击。

  4. 进入后点击Connect,然后在Email address内填写自己的电子邮箱地址,点击send PIN发送一个PIN码到自己的电子邮箱。

  5. 在自己的邮箱内查看PIN码邮件,并填入PIN码,然后点击Connect。

  6. 进入邮箱设置步骤,点击send me an email。

  7. 进入如下界面,就是选择给你邮件里的内容了,这里直接选择默认。然后点击Create action 即可创建完成。

  8. 点击Create action后进入如下界面。

  9. 查看密钥:点击右上角的头像,然后点击My services 进入自己的服务列表。

  10. 进入My services后,点击webhooks进入刚才创建的事件。

  11. 进入webhooks后,点击“Documentation”就能查看到密钥了,如图所示。

3.程序链接
https://makecode.microbit.org/_6r9WkE7Lrfi9

4.程序截图

注意:使用时请将程序中的WiFi配置以及IFTTT中的ID和密钥修改为自己,才能正常使用。

5.结果展示
当按下micro: bit主板上的A键时,系统就会自动将当前检测到的温度值和光线值通过WiFi IoT Module上传到IFTTT,并转发到你设置的邮箱里。如图:

7.7 发送推特系统

1.项目介绍

本项目演示了通过按A键往推特上发送一条固定的文字信息。你可根据本项目延伸更多其它应用场景。如发送当前的水质,空气质量等数据。

2.准备工作

  1. 在App Store里搜索IFTTT并下载。然后登录你的IFTTT账号。

  1. 点击Create,弹出如下界面,点击Start。

  1. 在下面的界面点击This进行This设置。

  1. 搜索webhooks并点击搜索结果。

  1. 点击Receive a web request 进入 create your own设置,输入你自己的Event name 。然后点击Create trigger 。

  1. 点击Create trigger后,自动回到以下页面,然后点击That进入That设置。

  1. 点击了That后,进入搜索页面,在输入框中搜索twitter并点击进入twitter设置。进入后有四个选项分别是:Post a tweet(发布推文),Post a tweet with image(发布带图片的推文),Update profile picture(更新个人资料),Update bio(更新bio),在这里我们选择Post a tweet(发布推文)。

  1. 在如下的界面点击Add,在弹出的窗口填写你的推特账号和密码,添加twitter账号。

  1. 添加完账号后,进入如下界面,点击Create action,点击Finish完成设置。

3.程序链接
https://makecode.microbit.org/_8bpXa41DfTU7

4.程序截图

5.结果展示
按下microbit主板A键,发送一条内容为“Hi DFRobot 2020”的推文到你自己的推特账号。

7.8 坐姿监测仪

1.项目介绍

学习的过程中,将超声波放于书桌前,按下micro:bit上的按键A,将超声波检测到的实时距离发送到SIOT平台。当然也可以在SIOT平台发送“see”指令,查看超声波当前检测到的距离。你还可以结合蜂鸣器使用,当超声波检测到的距离小于20cm时,蜂鸣器进行提示。

2.准备工作

3.程序链接

https://makecode.microbit.org/_00D65weeqAfT

4.程序截图

5.结果展示

按下micro:bit上的按键A,发送五次超声波检测到的实时数据到SIOT平台。

SIOT平台通过发送“see”指令,也可以查看当前超声波检测到的距离。

7.9 环境噪音分析

1.项目介绍

本项目通过读取声音传感器的数据变化,上传到ThingSpeak,并生成曲线图。从而分析当前环境中的噪音情况,并且可以根据曲线图分析出在哪一个时间段的噪音最为严重。

2.准备工作

https://github.com/DFRobot/pxt-DFRobot_WiFi_IoT_I2C

  1. 打开ThingSpeak官网:https://thingspeak.com/ 点击右上角头像进入登录注册界面。

  1. 第一次使用在如下界面注册,填写正确的邮箱地址并验证邮箱后注册成功即可。

  1. 注册登录完成后出现以下界面:

  1. 如果没有看到,也可以点击Channels会出现下拉框,在点击My Channels也可以找到上面的界面,点击New Channel。

  1. 前面步骤完成后,就可以看到下面的界面。

  1. 在这里面我们需要将Name填写上,在Description上填写频道说明,勾选上field数量,在MakeCode库中field和频道中的field相同,使用几个field就勾选相应个数即可,例程中只将噪音模拟值传入频道中,所以这里只勾选一个即可,field的名称也可以自定义,我这里将field名称修改为noise,将这些处理完就可以保存频道,下面是我创建的频道。

  1. 保存后频道就创建完成,创建好的频道就如下图,在里就能看到传输上来的参数。

  1. 如果还想传更多数据,需要点击Channel Settings,点击后入下图,将Field后面的“方框”勾选上,保存即可,删除频道和清除频道数据也在里面。

  1. 添加频道后效果。

  1. 点击API Keys就可以查看对应频道的密钥,红框中是我们需要填写的密钥。

3.程序链接
https://makecode.microbit.org/_MA3LC6cYwRoH

4.程序截图

5.结果展示
在ThingSpeak平台中的Private View中查看上传的数据,模拟声音传感器读取的值实时上传,并且数据以折线图的方式显示出来。

7.10 酒精浓度检测仪

1.项目介绍

我们设想一下,在交警查酒驾的过程中使用酒精浓度检测仪,检测仪将检测到的数据实时的上传到BeeBotte平台。交警们只需要通过平台上的数据就可以大致判断当前车辆中是否有人饮酒,对检测到的酒精浓度值超过800(假设酒精浓度值超过800属于酒驾)的车辆再进行逐一排查。这样不仅可以节省时间,还可以减轻交警们的工作量。

2.准备工作

  1. 打开BeeBotte官网:https://beebotte.com/login ,注册并登录自己的账号。

  2. 登录成功后进入下面界面,点击“Create New”创建一个新的频道。

  1. 根据提示填写对应的频道名称、频道资源。

  1. 填写完整之后,点击“Create channel”就可以生成一个属于自己BeeBotte的频道了。

  1. 进入创建好的频道查看BeeBotte的配置密钥。

3.程序链接
https://makecode.microbit.org/_8PbTJAFPL2CH

4.程序截图

5.结果展示
在BeeBotte对应的频道就可以查看酒精传感器检测的数据。

BeeBotte还可以将接收到的数据整理成折线图、表格等。

8 基于Arduino IDE编程

这个章节中我们需要使用Arduino IDE 进行编程, 点击链接下载:https://www.arduino.cc/en/Main/Software ,下载完成后安装!

8.1 环境亮度分析-UART

1.项目介绍

通过WiFi IoT Module的UART通信将光线传感器检测到的数据上传到ThingSpeak平台,并生成曲线图,根据平台上的曲线图分析出一天中光线最强的时间点与光线最弱的时间点。

2.准备工作

3.程序样例

    #include "DFRobot_WiFi_IoT_Module.h"
    #include <SoftwareSerial.h>

    //UART模式
    //使用软串口 RX:10,TX:11
    SoftwareSerial    mySerial(10, 11);
    DFRobot_WiFi_IoT_Module_UART IoT (&mySerial);

    //配置WiFi
    const char *WIFI_SSID             = "hitest";   //WiFi名称
    const char *WIFI_PASSWORD         = "12345678";  //WiFi密码

    //配置Thingspeak
    const char *ThingSpeak_ADDRESS    = "api.thingspeak.com";   //ThingSpeak地址,这里不做更改
    const char *THINGSPEAK_KEY        = "4I1G5SXC5PGU3HA4";  //填写IFTTT上创建的事件密钥

    //给ThingSpeak发送消息
    const char *THINGSPEAK_VALUE_1    = "Value1";
    const char *THINGSPEAK_VALUE_2    = "Value2";
    const char *THINGSPEAK_VALUE_3    = "Value3";

    /*******************************************************
    Function:     getAmbient
    Description:  获取光线传感器的值
    Params:
    Return:       当前光线值
    ******************************************************/
    int getAmbient()
    {
      int val;
      val = analogRead(0);
      return val;
    }

    void setup() {
      //使用软串口9600作为通信端口
      mySerial.begin(9600);

      //使用串口115200作为打印端口
      Serial.begin(115200);

      //初始化通信端口
      while(IoT.begin() != 0){  
        Serial.println("init ERROR!!!!");
        delay(100);
      }
      Serial.println("init Success");

      //连接WiFi
      while(IoT.connectWifi(WIFI_SSID, WIFI_PASSWORD) != 0){  
        Serial.print(".");
        delay(100);
      }
      Serial.println("Wifi Connect Success");

      while(IoT.HTTPBegin(ThingSpeak_ADDRESS) != 0){
        Serial.println("Parameter is empty!");
        delay(100);
      }
      Serial.println("HTTP Configuration Success");

      while(IoT.thingSpeakBegin(THINGSPEAK_KEY) != 0){
        Serial.print("Parameter is empty!");
        delay(100);
      }
      Serial.println("ThingSpeak Configuration Success");
    }

    void loop() {
      String data =(String)getAmbient();         
    //每隔1s发送一次记录了当前环境光的数据到ThingSpeak平台
      IoT.thingSpeakSendMessage(data.c_str());  
      delay(1000);
    }

4.结果展示

将模拟环境光线传感器读取到的值实时上传到ThingSpeak,并且数据以折线图的方式显示出来。

8.2 环境噪音分析-I2C

1.项目介绍

读取声音传感器的数据变化,上传到ThingSpeak,并生成曲线图。从而分析当前环境中的噪音情况,并且可以根据曲线图分析出在哪一个时间段的噪音最为严重。

2.准备工作

3.程序样例

    #include "DFRobot_WiFi_IoT_Module.h"
    #include <SoftwareSerial.h>

    //I2C模式
    DFRobot_WiFi_IoT_Module_I2C IoT;

    //配置WiFi账号和密码
    const char *WIFI_SSID             = "hitest";
    const char *WIFI_PASSWORD         = "12345678";

    //配置Thingspeak
    const char *ThingSpeak_ADDRESS    = "api.thingspeak.com";   //ThingSpeak地址,这里不做更改
    const char *THINGSPEAK_KEY        = "RXARKPLSDMR3G8MA";  //填写IFTTT上创建的事件密钥

    //给ThingSpeak发送消息
    const char *THINGSPEAK_VALUE_1    = "Value1";
    const char *THINGSPEAK_VALUE_2    = "Value2";
    const char *THINGSPEAK_VALUE_3    = "Value3";

    /*******************************************************
    Function:     getNoise
    Description:  获取声音传感器的值
    Params:
    Return:       当前声音值
    ******************************************************/
    int getNoise()
    {
      int val;
      val = analogRead(0);
      return val;
    }

    void setup() {  
      //使用串口115200作为打印端口
      Serial.begin(115200);

      //初始化通信端口
      while(IoT.begin() != 0){  
        Serial.println("init ERROR!!!!");
        delay(100);
      }
      Serial.println("init Success");

      //连接WiFi
      while(IoT.connectWifi(WIFI_SSID, WIFI_PASSWORD) != 0){  
        Serial.print(".");
        delay(100);
      }
      Serial.println("Wifi Connect Success");

      while(IoT.HTTPBegin(ThingSpeak_ADDRESS) != 0){
        Serial.println("Parameter is empty!");
        delay(100);
      }
      Serial.println("HTTP Configuration Success");

      while(IoT.thingSpeakBegin(THINGSPEAK_KEY) != 0){
        Serial.print("Parameter is empty!");
        delay(100);
      }
      Serial.println("ThingSpeak Configuration Success");
    }

    void loop() {
      String data =(String)getNoise();         
    //每隔1s发送一次记录了当前声音值的数据到ThingSpeak平台
      IoT.thingSpeakSendMessage(data.c_str());   
      delay(1000);
    }

4.结果展示

在ThingSpeak平台中的Private View中查看上传的数据,模拟声音传感器读取的值实时上传,并且数据以折线图的方式显示出来。

8.3 温度发送系统

1.项目介绍 2.准备工作

3.程序样例

    #include "DFRobot_WiFi_IoT_Module.h"
    #include <SoftwareSerial.h>

    int button = 7;

    //UART模式
    //使用软串口 D/R: 10, C/T: 11
    SoftwareSerial    mySerial(10, 11);
    DFRobot_WiFi_IoT_Module_UART IoT(&mySerial);


    //配置WiFi名字和密码
    const char *WIFI_SSID           = "hitest";
    const char *WIFI_PASSWORD       = "12345678";
    //配置 IFTTT
    const char *IFTTT_ADDRESS       = "maker.ifttt.com";
    const char *IFTTT_ENVENT        = "Temperature";
    const char *IFTTT_KEY           = "cdvP-sL1L9m3eld_T0xR3r";
    //IFTTT发送消息
    const char *IFTTT_VALUE_1       = "Value1";
    const char *IFTTT_VALUE_2       = "Value2";
    const char *IFTTT_VALUE_3       = "Value3";

    /********************************************************************************************
    Function    : getTemp
    Description : 获取LM35检测到的温度
    Params      : 
    Return      : 转换后的温度值
    ********************************************************************************************/
    float getTemp()
    {
      uint16_t val;
      float dat;
      val = analogRead(A0);
      dat = (float)val * (5/10.24);
      return dat;
    }

    void setup() {
      //使用软串口9600作为通信串口
      mySerial.begin(9600);
      //使用串口115200作为打印端口
      Serial.begin(115200);
      //初始化通信端口
      while(IoT.begin() != 0){  
        Serial.println("init ERROR!!!!");
        delay(100);
      }
      Serial.println("init Success");
      //连接WiFi
      while(IoT.connectWifi(WIFI_SSID, WIFI_PASSWORD) != 0){  
        Serial.print(".");
        delay(100);
      }
      Serial.println("Wifi Connect Success");
      //初始化HTTP
      while(IoT.HTTPBegin(IFTTT_ADDRESS) != 0){
        Serial.println("Parameter is empty!");
        delay(100);
      }
      Serial.println("HTTP Configuration Succeeded");
      //初始化IFTTT
      while(IoT.IFTTTBegin(IFTTT_ENVENT, IFTTT_KEY) != 0){
        Serial.println("Parameter is empty!");
        delay(100);
      }
      Serial.println("IFTTT Configuration Succeeded");

      pinMode(button,INPUT);
    }

    void loop() {
      String data =(String)getTemp(); 
    //按下button,发送一封记录了当前温度的邮件
      if(digitalRead(7) == 1)
      {
        IoT.IFTTTSendMessage("reminder","The current temperature is",data.c_str());
        Serial.println("send message success!");
      }
    }

4.结果展示 按下button,IFTTT发送一封记录了当前温度的邮件到对应的邮箱。

8.4 LED远程控制

1.项目介绍

LED远程控制相当于一个懒人操作神器,有时候我们忘记关点房间外的灯,又不愿意起床的时候。我们可以通过SIOT平台发送“1”指令,打开LED灯;发送“2”指令,关闭LED灯。

2.准备工作

3.程序样例

    #include "DFRobot_WiFi_IoT_Module.h"
    #include <SoftwareSerial.h>

    int led = 7;

    //I2C模式
    DFRobot_WiFi_IoT_Module_I2C IOT;

    //配置WiFi名字和密码
    const char *WIFI_SSID          = "hitest";
    const char *WIFI_PASSWORD      = "12345678";
    //Configure SIot
    const char *SIOT_SERVER        = "192.168.1.93";
    const char *SIOT_PORT          = "1883";              
    const char *SIOT_ID            = "siot";              
    const char *SIOT_PWD           = "dfrobot";           
    const char *SUBSCRIBE_TOPIC    = "DFRobot/Seifer";         
    const char *PUBLISH_TOPIC      = "DFRobot/Seifer";

    const char *SIOT_SEND_MESSAGE  = "Send_Message";      

    String receiveMessage = "0";
    //设置回调函数
    void callback(const char*topic,const char*message){
      Serial.println("Receive [ " + (String)topic + "]," + "Message : " + (String)message);
      receiveMessage = (String)message;
    }

    void setup(void){
      pinMode(led, OUTPUT);

      //使用串口115200作为通信端口
      Serial.begin(115200);
      //初始化通信串口
      while(IOT.begin() != 0){  
        Serial.println("init ERROR!!!!");
        delay(100);
      }
      Serial.println("init Success");
      //连接WiFi
      while(IOT.connectWifi(WIFI_SSID, WIFI_PASSWORD) != 0){  
        Serial.print(".");
        delay(500);
      }
      Serial.println("Wifi Connect Success");
      //初始化MQTT并且连接平台
      while(IOT.MQTTBegin(SIOT_SERVER, SIOT_PORT, SIOT_ID, SIOT_PWD) != 0){
        Serial.print(".");
        delay(500);
      }
      Serial.println("SIOT Connect Success");

      IOT.setCallBack(callback);
      //订阅设备号
      while(IOT.subscribe(SUBSCRIBE_TOPIC) != 0){
        Serial.print("."); 
        delay(500);
      }
      Serial.println("Subscribe Topic Success");
    }

    void loop(void){
      IOT.loop();
    //接收到的数据为“1”时,点亮LED
      if(strcmp(receiveMessage.c_str(),"1") == 0){
        digitalWrite(led, HIGH);
        receiveMessage="0";
       }
    //接收到的数据为“2”时,关闭LED
      if(strcmp(receiveMessage.c_str(),"2") == 0){
        digitalWrite(led, LOW);
        receiveMessage="0";
       }
    }

4.结果展示

接收到指令“1”,LED灯亮起;接收到指令“2”,LED灯关闭。

8.5 智能浇花系统

1.项目介绍 喜欢养花草的朋友都知道,80%的花草生长问题都是由于不按时浇水和浇水过度导致的。我们假设适合多肉生长的最佳土壤湿度为:100—300,当土壤湿度<=100时,植物会说:“主人,我渴了,请给我水喝”;当土壤湿度>=300时,植物会说:“主人,我饱了,不要喝水了”,我们就可以根据植物的需求进行浇水。如果可以远程控制浇水,这样即使外出学习、工作也不用担心家里的植物没人照看了。

2.准备工作

3.程序样例

 #include "DFRobot_WiFi_IoT_Module.h"
    #include <SoftwareSerial.h>
    int Relay = 3;
    //I2C mode
    DFRobot_WiFi_IoT_Module_I2C IoT;

    //I2C 模式
    DFRobot_WiFi_IoT_Module_I2C IoT;

    //你可以根据自己的情况改变这些
    const char *WIFI_SSID           = "hitest";         //WiFi账号
    const char *WIFI_PASSWORD       = "12345678";           //WiFi密码

    //Easy IOT 英文配置
    //const char *EASY_IOT_SERVER        = "iot.dfrobot.com";

    //EASY IoT 中文配置
    const char *EASY_IOT_SERVER     = "iot.dfrobot.com.cn";    //IoT主机地址,这里不用更改
    const char *EASY_IOT_PORT       = "1883";                  //IoT连接端口,这里不用更改
    const char *EASY_IOT_ID         = "smofVJDMR";             //Iot_id,创建设备时记录的账号
    const char *EASY_IOT_PWD        = "ymoBVJvMgz";            //Iot_pwd,创建设备时记录的密码
    const char *SUBSCRIBE_TOPIC     = "9qnYVJDMR";             //订阅一个设备,设备号为“9qnYVJDMR”
    const char *PUBLISH_TOPIC       = "9qnYVJDMR";             //向这个设备发送数据,设备号为“9qnYVJDMR”
    const char *EASY_IOT_SEND_MESSAGE    = "Send_Message";

    /********************************************************************************************
    Function    : callback
    Description : 打印订阅的物联网设备号和消息
    Params      : topic订阅的设备号;message订阅设备号的消息
    Return      : 
    ********************************************************************************************/
    String data = "0";
    void callback(const char*topic,const char*message)
    {
     Serial.println("Receive [ " + (String)topic + "]," + "Message : " + (String)message);
     data = (String)message;
    }

    /********************************************************************************************
    Function    : getSoilHumidity
    Description : 获取土壤的湿度值
    Params      : 
    Return      : 当前土壤湿度值
    ********************************************************************************************/
    float getSoilHumidity()
    {
      uint16_t val;
      val = analogRead(A0);
      return val;
    }

    void setup(void){ 
      Serial.begin(115200);
      //初始化通信端口
      while(IoT.begin() != 0){  
        Serial.println("init ERROR!!!!");
        delay(100);
      }
      Serial.println("init Success");
      //连接WiFi
      while(IoT.connectWifi(WIFI_SSID, WIFI_PASSWORD) != 0){  
        Serial.print(".");
        delay(100);
      }
      Serial.println("Wifi Connect SUccess");
      //初始化MQTT并连接到平台
      while(IoT.MQTTBegin(EASY_IOT_SERVER, EASY_IOT_PORT, EASY_IOT_ID, EASY_IOT_PWD) != 0){
        Serial.print(".");
        delay(100);
      }
      Serial.println("MQTT Connect Success");
      //调用回调函数
      IoT.setCallBack(callback); 
      //订阅设备SUBSCRIBE_TOPIC
      while(IoT.subscribe(SUBSCRIBE_TOPIC) != 0){
        Serial.print(".");
        delay(100);
      }
      Serial.println("Subscribe Topic Success");

      pinMode(13, OUTPUT);         //Set Pin13 as output
      digitalWrite(13, HIGH);     //Set Pin13 High
      pinMode(Relay, OUTPUT);     //Set Pin3 as output
    }

    static long timestamp = millis();
    void loop(void){

    IoT.loop();
      //接收到Easy IoT下发的指令“1”,设置继电器为高电平
      if(strcmp(data.c_str(),"1") == 0){ 
        digitalWrite(Relay, HIGH);
        data = "0";

      }
    IoT.loop();
      //接收到Easy IoT下发的指令“1”,设置继电器为低电平
      if(strcmp(data.c_str(),"2") == 0){
         digitalWrite(Relay, LOW); 
        data = "0";
      }
      if(millis()-timestamp>5000){
        timestamp = millis();
        int Hum = getSoilHumidity();
      //当土壤湿度值Hum<=100,向East IoT发送当前的土壤湿度值
        if(Hum <= 100){
          IoT.publish(PUBLISH_TOPIC, (String)Hum);
        }
      //当土壤湿度值Hum>=300,向East IoT发送当前的土壤湿度值
        if(Hum >= 300){
          IoT.publish(PUBLISH_TOPIC, (String)Hum); 
        }
      } 
    }

4.结果展示

上传检测到的土壤湿度,Easy IoT平台接收到的消息如下:

在Easy IoT平台根据植物的生长请求进行合理的浇水,发送指令“1”,进行浇水(通过控制继电器的开关来控制水泵开关);发送指令“2”,停止浇水。

8.6 商场人流量统计系统

1.项目介绍

商场的人流量很大,我们如何对商场的人流量做出一个较为准确的统计呢?在商场门口安装一个超声波用来检测是否有人通过,实现人流量自动统计的效果。然后将这个时间段进入商场的人数发送到BeeBotte平台。

2.准备工作

3.程序样例

#include "DFRobot_WiFi_IoT_Module.h"
#include <SoftwareSerial.h>

//I2C 模式
DFRobot_WiFi_IoT_Module_I2C IOT;

#define time(x) (x*1000)

//配置WiFi
const char *WIFI_SSID              = "hitest";
const char *WIFI_PASSWORD          = "12345678";
//配置Beebotte 
const char *BEEBOTTE_ADDRESS       = "api.beebotte.com";
const char *BEEBOTTE_TOKEN         = "token_PjXx9xPsygzy5GMU";
const char *BEEBOTTE_CHANNEL       = "Data";
const char *BEEBOTTE_RESOURCE      = "Data";

const char *BEEBOTTE_SEND_MESSAGE  = "Send_Message";

int TrgPin = A0;
int EcoPin = A1;
int dist;

static long timestamp = millis();
int count;

void setup(void){
  //使用115200作为打印串口
  Serial.begin(115200);
  //初始化端口
  while(IOT.begin() != 0){  
    Serial.println("init ERROR!!!!");
    delay(100);
  }
  Serial.println("init Success");
  //连接WiFi
  while(IOT.connectWifi(WIFI_SSID, WIFI_PASSWORD) != 0){  
    Serial.print(".");
    delay(100);
  }
  Serial.println("Wifi Connect Success");
  //HTPP初始化
  while(IOT.HTTPBegin(BEEBOTTE_ADDRESS) != 0){
    Serial.println("Parameter is empty!");
    delay(100);
  }
  Serial.println("HTTP Configuration Succeeded");
  // beebotte 初始化
  while(IOT.beebotteBegin(BEEBOTTE_TOKEN) != 0){
    Serial.print("Parameter is empty!");
    delay(100);
  }
  Serial.println("Beebotte Configuration Succeeded");

  //设置TrgPin为输出状态
  pinMode(TrgPin, OUTPUT);
  // 设置EcoPin为输入状态
  pinMode(EcoPin, INPUT);
}

//超声波测距
int getDist(void)
{
  digitalWrite(TrgPin, LOW);
  delayMicroseconds(8);
  digitalWrite(TrgPin, HIGH);
  // 维持10毫秒高电平用来产生一个脉冲
  delayMicroseconds(10);
  digitalWrite(TrgPin, LOW);
  // 读取脉冲的宽度并换算成距离
  dist = pulseIn(EcoPin, HIGH) / 58;
  return dist;
}

void loop(void){
  if(getDist()<10){
    while(1){
      Serial.print("dist:");
      Serial.println(getDist());
      if(getDist()>30){
        count++;
        Serial.println(count);
        delay(100);
        break;  
      }
    }  
  }
  //每隔10s发送一次统计到的人数,time(10)
  if(millis()-timestamp > time(10)){
    String data = (String)count;
    IOT.beebotteSendMessage(BEEBOTTE_CHANNEL, BEEBOTTE_RESOURCE,data.c_str());
    Serial.println(data.c_str());
    timestamp = millis();
    count = 0;
  }
}

4.结果展示

人数统计完成之后,就可以在平台上查看对应时间段的人数。

8.7 智能农场

1.项目介绍

农场真实的温度、湿度、土壤湿度都以数据的方式上传到OneNET平台,农场主只需要在电脑前就能快速了解到农场的实时情况。当然你还可以根据本项目进行延伸,使用超声波液位传感器来检测到水池中的蓄水量,当蓄水量低于1m的时候,利用水泵进行抽水;当土壤湿度不够的时候进行浇水,温度太高时自动降温。

2.准备工作

  1. 进入oneNET官网:https://open.iot.10086.cn/devdoc/ 注册并登录,登录成功后进入下面界面。

  2. 在“产品服务”中,点击MQTT物联网套件。

  3. 点击“立即使用”。

  4. 在左侧“全部产品”中,选择“多协议接入”。

  5. 选择添加产品。

  6. 根据提示,尽可能完善产品信息。

  7. 填写完产品信息之后,点击确认。

  8. 产品添加成功后,选择“立即添加设备”。

  9. 点击“添加设备

  10. 填写完设备信息,点击“添加”。

  11. 添加设备成功后,会为添加的设备生成一个新的设备ID。
    设备ID:643596958

  12. 点击产品概况查看产品详细信息,可以查看产品ID及Master-APIkey。
    产品ID:381158
    Master-APIkey:3dnZyPHRpfVQD71XhTpk0xnRQCs=

3.程序样例

因为DHT11温湿度传感器用到了库文件,所以在编译和上传样例程序前,需要通过链接下载样例程序和库文件,并安装到Arduino IDE下的libraries对应文件夹下。

#include "DFRobot_WiFi_IoT_Module.h"
#include <SoftwareSerial.h>

//I2C模式
DFRobot_WiFi_IoT_Module_I2C IoT;

#include <dht11.h>
dht11 DHT;
#define DHT11_PIN 4

//配置WiFi
const char *WIFI_SSID         = "hitest";
const char *WIFI_PASSWORD     = "12345678";
//配置OneNET
const char *ONENET_SERVER     = "183.230.40.39";
const char *ONENET_PORT       = "6002";              
const char *ONENET_PRO_ID     = "381158";     //产品ID 
const char *ONNNET_DEV_ID     = "643596958";  //设备ID
const char *ONENET_PWD        = "3dnZyPHRpfVQD71XhTpk0xnRQCs=";   //Master-APIkey             
const char *PUBLISH_TOPIC     = "$dp";  
const char *SUBSCRIBE_TOPIC   = "$dp";

const char *HUM_STREAM_NAME  = "humidity";
const char *TEMP_STREAM_NAME  = "temperature";
const char *SOILHUM_STREAM_NAME  = "soil humidity";
const char *DEPTH_STREAM_NAME  = "depth";
const char *SEND_MESSAGE      = "dddd" ;

void setup(void){
  //使用115200作为打印串口
  Serial.begin(115200);
  //端口初始化
  while(IoT.begin() != 0){  
    Serial.println("init ERROR!!!!");
    delay(100);
  }
  Serial.println("init Success");
  //连接WiFi
  while(IoT.connectWifi(WIFI_SSID, WIFI_PASSWORD) != 0){  
    Serial.print(".");
    delay(500);
  }
  Serial.println("Wifi Connect Success");
  //初始化MQTT并连接
  while(IoT.MQTTBegin(ONENET_SERVER, ONENET_PORT, ONENET_PRO_ID, ONENET_PWD ,ONNNET_DEV_ID) != 0){
    Serial.print(".");
    delay(500);
  }
  Serial.println("SIOT Connect SUCCESS");

  while(IoT.subscribe(SUBSCRIBE_TOPIC) != 0){
    Serial.print(".");
    delay(100);
  }
  Serial.println("Subscribe Topic Success");
}

/*
//水位检测
SoftwareSerial mySerial(11,10); // RX, TX
unsigned char dat[4]={};
int depth;
int sum;
int getDepth(){
  do{
     for(int i=0;i<4;i++)
     {
       dat[i]=mySerial.read();
     }
  }while(mySerial.read()==0xff);

  mySerial.flush();

  if(dat[0]==0xff)
    {
      sum=(dat[0]+dat[1]+dat[2])&0x00FF;
      if(sum==dat[3])
      {
           depth=dat[1]*256+dat[2];   
      }
      else
      { 
        depth=0;
      }
     }
     delay(500);
     return depth;
}
*/

//土壤湿度检测
float getSoilHumidity()
{
  uint16_t val;
  val = analogRead(A0);
  return val;
}

//拼接数据流和数据
String splicingData(String streamname, String data){
  String str = "";
  String str2 = "";
  str2 += "{\"";
  str2 += streamname;
  str2 +="\":";
  str2 += data;
  str2 += "}";

  str += (char)0x03;
  str += (char)(str2.length()>>8);
  str += (char)str2.length();
  str += str2;
  return str;
}

void loop(void){
  DHT.read(DHT11_PIN);
  //上传空气湿度值
  if(IoT.publish(PUBLISH_TOPIC,(uint8_t *)splicingData(HUM_STREAM_NAME, (String)DHT.humidity).c_str(),splicingData(HUM_STREAM_NAME, (String)DHT.humidity).length()) == 0){
    Serial.println("Data sending Success");
  }else{
    Serial.println("Data sending timeout");
  }

  //上传空气温度值
  if(IoT.publish(PUBLISH_TOPIC,(uint8_t *)splicingData(TEMP_STREAM_NAME, (String)DHT.temperature).c_str(),splicingData(TEMP_STREAM_NAME, (String)DHT.temperature).length()) == 0){
    Serial.println("Data sending Success");
  }else{
    Serial.println("Data sending timeout");
  }

  //上传土壤湿度值
  float SoilHum = getSoilHumidity();
  if(IoT.publish(PUBLISH_TOPIC,(uint8_t*)splicingData(SOILHUM_STREAM_NAME, (String)SoilHum).c_str(),splicingData(SOILHUM_STREAM_NAME, (String)SoilHum).length()) == 0){
    Serial.println("Data sending Success");
  }else{
    Serial.println("Data sending timeout");
  }

/*
  //上传水池水位深度
  int depth = getDepth();
  if(IoT.publish(PUBLISH_TOPIC,(uint8_t *)splicingData(DEPTH_STREAM_NAME, (String)depth).c_str(),splicingData(DEPTH_STREAM_NAME, (String)depth).length()) == 0){
    Serial.println("Data sending Success");
  }else{
    Serial.println("Data sending timeout");
  }
  delay(1000);
  */
}

4.结果展示

在设备列表中,点击“数据流”,进入数据流展示,就可以在面板中查看对应传感器检测到的数据。

OneNET平台将接收到的数据以折线图的方式进行保存,点击对应的数据流,可以查看数据折线图。

9 WiFi IoT Module 适用于STM32

当然WiFi IoT Module还可以搭配STM32开发板一起使用,所实现的功能也是一样的。这里不做过多的介绍,感兴趣的用户可根据程序样例试一下。

应用于STM32的WiFi IoT Module库地址:https://github.com/DFRobot/DFRobot_WIFI_I0T_Module_STM32

程序样例:

#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "DFRobot_wifi_iot.h"

//wifi 
#define WIFISSID     "hitest"  //WiFi名称
#define WIFIPWS      "12345678" //wifi密码

//MQTT
//#define MQTT
#ifdef MQTT
#define SERVER        "iot.dfrobot.com.cn"  //服务器地址
#define PORT          "1883"                //端口号
#define DEVICENAME    "rHpr0RcWR"           //用户名称
#define DEVICESECRET  "9NtrAg5ZRz"          //用户登录密码
#define TOPIC         "OSpwrHHMg"           //订阅频道
#endif

//IFTTT
#define IFTTT
#ifdef IFTTT
#define IFTTTKEY      "dtpfTlU3Wqa8y0HRh77xXE"
#define IFTTTEVENT    "BBB"
#endif

//ThingSpeak
//#define THINGSPEAK
#ifdef THINGSPEAK
#define THINGSPEAKKEY "U01NPZTC2G9WTDNY"
#endif

int main()
{
    u8 i=0;  
    SysTick_Init(72);
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  
    LED_Init();
    //USB打印串口 ,串口对应引脚:RX对应PA10、TX对应引脚PA9
    USART1_Init(9600);
    //IOT通信串口 ,串口对应引脚:RX对应PB11、TX对应引脚PB10
    USART3_Init(9600);
    //连接wifi
    connectWifi(WIFISSID,WIFIPWS);

    //访问EASYIOT
    #ifdef MQTT
    mqtt(SERVER,PORT,DEVICENAME,DEVICESECRET,TOPIC);
    #endif

    #ifdef IFTTT
    configIFTTT(IFTTTEVENT,IFTTTKEY);
    #endif

    #ifdef THINGSPEAK
    configThingSpeak(THINGSPEAKKEY);
    #endif
    while(1){

        #ifdef MQTT
        //使用MQTT时发送数
        publish(TOPIC,"HI TANG");
        #endif
        #ifdef IFTTT
        //访问IFTTT 向IFTTT注册事件发送信息
        IFTTTSendMasage("100","78","78");
        #endif
        #ifdef THINGSPEAK
        //访问thingSpeak  向thingSpeak发送信息
        thingSpeakSendMasage("5000", "100");
        #endif
        i+=10;
        if(i%20==0)
        {
            i=0;
            led1=!led1;
        }

        delay_ms(100);
        loop();
    }
}

常见问题

*Q *. 指示灯一直显示蓝色?

A: 表示正在连接wifi,需要一定时间,如果超过一分钟依然显示蓝灯,则可能为wifi账号密码设置错误,请检查程序

*Q *. 指示灯一直显示紫色?

A: 表示wifi连接成功但是mqtt异常断开,尝试检查所在wifi是否断网,也有可能easyiot服务器问题,等待一会儿再连接或联系论坛管理员。如果使用的是siot,则检查模块与siot服务器所在的电脑是否在一个wifi下,同时用另外一台手机访问siot网页,如果不能访问则说明被防火墙拦截了,需要关闭防火墙,允许siot通过网络,点击查看: siot常见问题

*Q *. 指示灯一直显示红色?

A: 表示wifi没有开始连接,尝试检查开关和线是否错了,例如uart模式模式tx和rx需要交叉接线,然后检查程序是否有执行初始化操作。

更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。

更多