使用arduino D1 wifi模块(WeMos D1)连接阿里云物联网平台并成功实现APP点亮板载LED(八)---对d1模块编程

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

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

一、所需条件

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

开发环境是arduino 1.8.11。

本文源代码下载连接

https://download.csdn.net/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设计进行介绍。

 

讨论交流

  • 12
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
arduino是一种电子积木,适合入门硬件开发。arduino编程简单,IDE功能强大,支持的开发板和功能库文件丰富,还有全球无数的贡献者不停地完善整个软硬件生态,所以吸引了许多国家无数的开发群体。arduino能开发物联网吗?答案是“相当能”。本课程就以arduino体系中支持的一款价格便宜、开发简便的开发板---wemos d1为硬件平台,带您一步步入门物联网开发。物联网开发肯定需要一个云平台,本课程推荐您用阿里云物联网平台,它运行可靠,功能丰富,开发简便,非常适合物联网知识的学习。有许多同学愿意使用“一键式”“无代码式”的开发平台,在此本课程并不推荐,因为学习的知识越多,对大家应对未来挑战的能力越有帮助。从入门角度而言,以arduino编程方式,链接高大上的阿里云物联网平台,就成为了一种有易学、有趣、专业的组合。通过本课程的学习,您将学习到arduino的基本操作、硬件资源介绍、阿里云物联网平台使用基础、mqtt通信基础、阿里云物联网平台库文件介绍、一个物联网小灯实例、以及IoT Studio的基本知识。学完本课程之后,您将学会使用ESP8266开发简单的物联网硬件。  而开发方式是非常简单的arduino方式,这种方式相比esp-idf等命令行方式要易学不少,但是对物联网学习的深刻程度比esp-idf一点不次。     本视频使用到的零件与淘宝上大致价格:   wemos d1开发板,大约20元或者esp8266小黑板  大约20元 
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TMS320VC5257H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值