admin管理员组

文章数量:1619290

前面几篇文章有讲原理的,有做模拟实验的,还有搭建arduino编程环境的。

本篇文章正式对arduino d1 wifi模块进行编程。

一、所需条件

硬件是arduino D1 wifi模块(WeMos D1)

开发环境是arduino 1.8.11。

本文源代码下载连接

https://download.csdn/download/youngwah292/12127854

 

二、代码分析

代码如下:

#include <ESP8266WiFi.h>

static WiFiClient espClient;
#include <ArduinoJson.h>

#include <AliyunIoTSDK.h>
AliyunIoTSDK iot;

#define PRODUCT_KEY "a1RFyDPN7YK"
#define DEVICE_NAME "light1"
#define DEVICE_SECRET "Ivx0qO3lPaxtASisRCStxfez0w6JlVsc"
#define REGION_ID "cn-shanghai"

#define WIFI_SSID "TP-LINK_325B"
#define WIFI_PASSWD "zsb000587"


void wifiInit(const char *ssid, const char *passphrase)
{
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, passphrase);
    WiFi.setAutoConnect (true);
    WiFi.setAutoReconnect (true);
    while (WiFi.status() != WL_CONNECTED)
    {
        delay(1000);
        Serial.println("WiFi not Connect");
    }
    Serial.println("Connected to AP");
}

void setup()
{
    pinMode(LED_BUILTIN, OUTPUT);    
  
    Serial.begin(115200);

    wifiInit(WIFI_SSID, WIFI_PASSWD);

    AliyunIoTSDK::begin(espClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET, REGION_ID);
   
    // 绑定属性回调
    AliyunIoTSDK::bindData("LightSwitch", powerCallback);
}

unsigned long lastMsMain = 0;
void loop()
{
    AliyunIoTSDK::loop();
    if (millis() - lastMsMain >= 5000)
    {
        lastMsMain = millis();
    }
}


void powerCallback(JsonVariant p)
{
    int PowerSwitch = p["LightSwitch"];
    if (PowerSwitch == 1)
    {
        Serial.println("Switch=1  from huasheng");
        digitalWrite(LED_BUILTIN, LOW);   // Turn the LED on (Note that LOW is the voltage level
 
    }
    else
    {
        Serial.println("Switch=0  from huasheng");
        digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH
    }
}

下面对代码进行分析,首先包含了几个头文件,在上一篇文章就已经讲过了。包含了一个头文件,就相当于得到了一种库的支持,有了这种支持,就可以实现一句代码顶替一大堆操作的目的。然后将物联网设备“身份证”信息:PRODUCT_KEY,DEVICE_NAME,DEVICE_SECRET和REGION_ID填写进来。如果忘记具体参数了,可以回阿里云控制台查看。

当然还有必不可少的WIFI路由器的SSID和密码。没有这个,就无法连接互联网,连不了网,就更谈不上通信了。

#include <ESP8266WiFi.h>

static WiFiClient espClient;
#include <ArduinoJson.h>

#include <AliyunIoTSDK.h>
AliyunIoTSDK iot;

#define PRODUCT_KEY "a1XXXXXK"
#define DEVICE_NAME "light1"
#define DEVICE_SECRET "IvxXXXXXXXXXXXXXXXXXXXXXXXXXXXlVsc"
#define REGION_ID "cn-shanghai"

#define WIFI_SSID "TP-LINK_XXXXX"
#define WIFI_PASSWD "XXXXXXXXXXX"

接着是wifi初始化,调用的是esp8266wifi库的函数,实现wifi连接。

void wifiInit(const char *ssid, const char *passphrase)
{
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, passphrase);
    WiFi.setAutoConnect (true);
    WiFi.setAutoReconnect (true);
    while (WiFi.status() != WL_CONNECTED)
    {
        delay(1000);
        Serial.println("WiFi not Connect");
    }
    Serial.println("Connected to AP");
}

接着是阿里云参数和指示灯的初始化。D1模块上的LED初始化为输出,串口波特率115200,调用wifi初始化函数,这里才真正连接网络,然后调用AliyunIoTSDK库内的pubulic函数之一:begin函数,这个函数功能是使用规定格式的参数进行计算之后连接阿里云物联网平台,计算过程是库函数进行的,前面的文章进行过分析,再次不再赘述,我们只要知道这句话代表了自动执行一系列复杂的计算过程,使设备“身份证”可以跟阿里云物联网平台进行加密通信即可。

然后是绑定回调函数。可以按照C语言程序的“用户代码”来理解。就是绑定了之后,阿里云发什么指令过来,我们就对它进行相应的操作来回应。

void setup()
{
    pinMode(LED_BUILTIN, OUTPUT);     // Initialize the LED_BUILTIN pin as an output
  
    Serial.begin(115200);

    wifiInit(WIFI_SSID, WIFI_PASSWD);

    AliyunIoTSDK::begin(espClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET, REGION_ID);
   
    // 绑定属性回调
    AliyunIoTSDK::bindData("LightSwitch", powerCallback);
}

下面来看“用户代码”。这个代码就是响应阿里云传过来的LightSwitch开关变量,如果是1,就让LED引脚置低,根据电路,该引脚置低,LED点亮。如果是0,就让LED引脚置高,LED熄灭。

void powerCallback(JsonVariant p)
{
    int PowerSwitch = p["LightSwitch"];
    if (PowerSwitch == 1)
    {
        Serial.println("Switch=1  from huasheng");
        digitalWrite(LED_BUILTIN, LOW);   // Turn the LED on (Note that LOW is the voltage level
 
    }
    else
    {
        Serial.println("Switch=0  from huasheng");
         digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH
    }
}

最后是主循环loop,它调用了AliyunIoTSDK库中的Loop函数,这个loop函数是有几个动作的。

void loop()
{
    AliyunIoTSDK::loop();
    if (millis() - lastMsMain >= 5000)
    {
        lastMsMain = millis();
    }
}

下面是AliyunIoTSDK::loop()源代码,可以看到,这个函数主要是对当前mqtt连接状态的检查,如果掉线的话,会自动重新连接上。这个机制非常必要,毕竟物联网设备无人值守,必须给它添加这个功能。

void AliyunIoTSDK::loop()
{
    client->loop();
    if (millis() - lastMs >= CHECK_INTERVAL)
    {
        lastMs = millis();
        mqttCheckConnect();
        messageBufferCheck();
    }
}

三、代码正确却无法连接阿里云的解决方法

以上代码编写完毕编译是没问题的,但是不能成功连接阿里云物联网平台,通过arduino自带的串口助理可以看到串口信息中是连接错误。

从许多文章上查找到许多文章,最后是修改了一个库文件解决的。如下图文件目录下的PubSubClient.h文件。

修改两个参数。

修改的原因未知,大家可以探讨。但是不改就连接不上。

四、下载运行效果

下载到D1模块

提示已经在线

阿里云也在线了

使用阿里云发布消息

界面是

发布消息成功

串口显示这个消息

要想控制LED,可以使用阿里云控制台在线调试功能,发布0或者1消息。

看串口信息,的确是收到了相应的消息。

那么电路板呢?LED的确是跟着发布的消息做出来响应,收到1就点亮,收到0就熄灭。证明回调函数起作用了。

这就成功完成了预期的设计。

实现这一步,只是证明了硬件和程序没问题了,阿里云物联网平台也设置成功了,但是我们总不能使用电脑登陆阿里云网站来对设备进行控制吧,我们最好使用智能手机对其进行控制。

下一篇文章将对手机APP设计进行介绍。

 

讨论交流

本文标签: 模块阿里板载平台wifi