文章目录

1、AliyunIoTSDK简介2、相关库安装3、阿里云创建产品,订阅发布4、对开源的Arduino ESP8266源代码修改5、使用阿里云点亮一个LED灯6、设备向阿里云上传温度数据7、项目源码8、ESP32连接阿里云(1)核心代码——WiFi连接(2)参考例程

1、AliyunIoTSDK简介

AliyunIoTSDK是arduino的一个库,可以在arduino的应用商店中搜索到这个库,当时版本不一定是最新的,而且下载的地址在国外,下载会比较久,有时还不能下载成功,我之前就在下载他的库的时候花费了大量的时间。 我这里提供基于AliyunIoTSDK库的开源项目地址: https://github.com/xinyu198736/arduino-aliyun-iot-sdk 如果网站无法打开,可以使用我已经下载好的项目包: 链接:https://share.weiyun.com/urYMY5tN 密码:yr6d78

2、相关库安装

Arduino有非常多的已经写好库,我们使用Arduino开发ESP8266的时间只需了解库的使用即可,学过面向对象的语言如java、Python应该能很好的理解。其实,Arduino是基于C++语言开发的。

Arduino需要下载安装ArduinoJson, Crypto, PubSubClient, ESP8266库,这些库文件可以在ArduinoIDE上下载,这里不在展开。

我AliyunIoTSDK使用的是离线的安装方式,可以直接将下载好的项目负责到Arduino的项目文件保存地址。 根据开源项目的安装教程,安装PubSubClient成功后,有一个地方需要修改。 文件的地址同样在Arduino的项目文件夹下

3、阿里云创建产品,订阅发布

需要连接阿里云,首先应该在阿里云物联网平台上创建产品

像上图所示,我们在阿里云物联网平台上创建了一个产品,在产品里定义了一个led开关的功能,接下来我们只需发布上线,设备就可以连接上物联网平台了。

4、对开源的Arduino ESP8266源代码修改

阿里云平台搭建好后,只需将文章开头的AliyunIoTSDK库开源项目的代码复制过来进行一个简单的修改,项目的有详细的使用说明。 这里连接WiFi的时候,我选择的是手机的热点。

之前遇到有人问过我,“明明WiFi的名称和密码都正确,但是ESP8266无法连接WiFi。是什么原因呢?” 这时需要检查一下手机热点信息设置是否正确,WiFi名称需要以中文命名,手机热点AP频段选择2.4GHZ,设备标识默认、隐藏热点关闭。 我把我手机的热点信息附上。 如果是使用路由器无法连接的话,也重新检查一下路由器的设置,多到网上找找教程,我还没有使用路由器连接过WiFi,不管跟手机热点的设置是一样的。

当ESP8266成功连接上WiFi后,我们在阿里云物联网平台上重新刷新一下,便会发现平台提示连接成功。

5、使用阿里云点亮一个LED灯

使用阿里云物联网平台点灯需要在ESP8266绑定一个属性回调,名称要与设备功能一致。 还需要初始化LED,我之前走过一个坑,绑定LED后,没有初始化LED导致一直没有实现这个功能找了很久的bug,这里也将这个问题记录下。 善于运用串口调试可以快速并定位找到这种bug,作为开发者,快速解决bug的能力也是很重要的。我当时解决这个bug的时候就是使用串口调速,我将会把源代码在下面附上。 绑定属性回调后,需要根据需求编写回调的函数,其实,只要将开源项目的电源属性修改的回调函数修改一下即可,我修改后如下:

// 电源属性修改的回调函数

void powerCallback(JsonVariant p)

{

int PowerSwitch = p["LEDSwitch"];

if (PowerSwitch == 1)

{

//开灯

Serial.println("LED_ON");

digitalWrite(LED_BUILTIN, LOW);

}

if (PowerSwitch == 0)

{

//关灯

Serial.println("LED_OFF");

digitalWrite(LED_BUILTIN, HIGH);

}

}

下面,我们使用阿里云开始点灯

6、设备向阿里云上传温度数据

我们要上传数据到阿里云,首先阿里云上的设备先要定义好温度这个功能,然后我们修改如下函数即可。 将修改好的程序下载到开发板上,我们就可以在阿里云查看设备上传的数据了。

7、项目源码

// 引入 wifi 模块,并实例化,不同的芯片这里的依赖可能不同

#include

static WiFiClient espClient;

// 引入阿里云 IoT SDK

#include

// 设置产品和设备的信息,从阿里云设备信息里查看

#define PRODUCT_KEY "xxxxxxxxxx"

#define DEVICE_NAME "xxxxxxx"

#define DEVICE_SECRET "xxxxxxx"

#define REGION_ID "cn-shanghai"

// 设置 wifi 信息

#define WIFI_SSID "xxxxxxx"

#define WIFI_PASSWD "xxxxxxx"

// 温度

float f_temperature = 25.1;

void setup()

{

Serial.begin(9600);

// 初始化 wifi

wifiInit(WIFI_SSID, WIFI_PASSWD);

// 初始化 iot,需传入 wifi 的 client,和设备产品信息

AliyunIoTSDK::begin(espClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET, REGION_ID);

// initialize digital pin LED_BUILTIN as an output.

pinMode(LED_BUILTIN, OUTPUT);

// 绑定一个设备属性回调,当远程修改此属性,会触发 powerCallback

// AliyunIoTSDK::bindData("设备功能标识符", powerCallback);

AliyunIoTSDK::bindData("LEDSwitch", powerCallback);

}

void loop()

{

AliyunIoTSDK::loop();

//每隔1秒发送一次数据

delay(1000);

// 发送一个数据到云平台,AliyunIoTSDK::send("设备标识符", 要发送的数据);

AliyunIoTSDK::send("temperature", f_temperature);

}

// 初始化 wifi 连接

void wifiInit(const char *ssid, const char *passphrase)

{

WiFi.mode(WIFI_STA);

WiFi.begin(ssid, passphrase);

while (WiFi.status() != WL_CONNECTED)

{

delay(1000);

Serial.println("WiFi not Connect");

}

Serial.println("Connected to AP");

}

// 电源属性修改的回调函数

void powerCallback(JsonVariant p)

{

int PowerSwitch = p["LEDSwitch"];

if (PowerSwitch == 1)

{

//开灯

Serial.println("LED_ON");

digitalWrite(LED_BUILTIN, LOW);

}

if (PowerSwitch == 0)

{

//关灯

Serial.println("LED_OFF");

digitalWrite(LED_BUILTIN, HIGH);

}

}

8、ESP32连接阿里云

ESP32是ESP8266的升级版本,拥有更加更加丰富的功能,更加多的IO接口,主频也随之增加。性能的增强的同时,价格也在增加,ESP32比ESP8266贵那么几十块钱。 我在做毕业设计的时候,遇到一个坑:使用ESP8266做主控,使用Arduino语言编程,代码量一旦大起来就会造成效率低下,而且运行时会出现比较多的bug,所以我果断放弃了ESP8266选择ESP32。现在回想起来,也许ESP8266只是一个WiFi模块,需要搭载一个MCU做IT指令收发即可,用来当一个独立的MCU还是有些过载了。

(1)核心代码——WiFi连接

AliyunIoTSDK因为是ESP8266的例程,所以在连接WiFi上需要使用ESP32的方式连接WiFi,其它则没有太大的变动。

#include

#include

static WiFiClient espClient;

const char* ssid = "xxxx"; // Change this to your WiFi SSID

const char* password = "xxxxxxx"; // Change this to your WiFi password

(2)参考例程

由于时间比较紧迫,我把我毕业设计的部分代码修改后做连接的参考例程:

/*

需要发送的json数据

{"A":25.5,"B":26.3,"C":11.2,"D":0.9,"E":11.1,"F":0.8,"G":11.1}

*/

#include

#include

static WiFiClient espClient;

const char* ssid = "xxxxxxxxx"; // Change this to your WiFi SSID

const char* password = "xxxxxxxxxxxx"; // Change this to your WiFi password

// 引入阿里云 IoT SDK

#include

//设置产品和设备的信息,从阿里云设备信息里查看

//阿里云LED设备信息

#define PRODUCT_KEY "xxxxxxxxx"

#define DEVICE_NAME "xxxxxxxxx"

#define DEVICE_SECRET "xxxxxxxxxxx"

#define REGION_ID "cn-shanghai"

//引入json库

#include

//定义数据变量

float temperature;

float humidity;

float solar_V;

float solar_A;

float batteryInt_V;

float batteryInt_A;

float light;

void setup() {

//初始化串口0,设置波特率

Serial.begin(9600);

//连接网络

WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED);

// 初始化 iot,需传入 wifi 的 client,和设备产品信息

AliyunIoTSDK::begin(espClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET, REGION_ID);

//这段代码测试WiFi连接情况使用

// while (WiFi.status() != WL_CONNECTED) {

// delay(500);

// printf(".");

// }

// printf("\n");

// Serial.print("Ip: ");

// Serial.println(WiFi.localIP().toString());

// Serial.print("mac: ");

// Serial.println(WiFi.macAddress());

}

void loop() {

// 检测串口缓冲区中是否有数据装入

if (Serial.available()){

StaticJsonDocument<200> doc; // 创建一个JSON文档对象

char buffer[200]; // 创建一个缓冲区来存储串口数据

int length = Serial.readBytes(buffer, 200); // 读取串口数据并将其存储到缓冲区中

buffer[length] = '\0'; // 添加字符串结束符

deserializeJson(doc, buffer); // 解析JSON数据

//获取json数据

temperature = doc["A"];

humidity = doc["B"];

solar_V = doc["C"];

solar_A = doc["D"];

batteryInt_V = doc["E"];

batteryInt_A = doc["F"];

light = doc["G"];

//测试用,请勿删除

// Serial.print("温度:");

// Serial.println(temperature);

// Serial.print("湿度:");

// Serial.println(humidity);

// Serial.print("太阳能电池板电压:");

// Serial.println(solar_V);

// Serial.print("太阳能电池板电流:");

// Serial.println(solar_A);

// Serial.print("电池电压:");

// Serial.println(batteryInt_V);

// Serial.print("电池电流:");

// Serial.println(batteryInt_A);

// Serial.print("光照值:");

// Serial.println(light);

AliyunIoTSDK::send("temperature",temperature);

AliyunIoTSDK::send("humidity",humidity);

AliyunIoTSDK::send("solar_V",solar_V);

AliyunIoTSDK::send("solar_A",solar_A);

AliyunIoTSDK::send("batteryInt_V",batteryInt_V);

AliyunIoTSDK::send("batteryInt_A",batteryInt_A);

AliyunIoTSDK::send("light",light);

}

}

好文链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: