arduino Uno+arduino D1 实现 阿里云物联网控制+IIC总线通信点灯
- 连线图
- 代码
-
- 主机代码(arduino D1):
- 从机代码1(arduino Uno):
- 从机代码2(Uno 只修改了从机地址参数,方便复制):
- 阿里云物联网控制
-
- 阿里云物联网平台创建产品、设备
- 阿里云物联网使用在线调试进行测试
- IoT Studio 阿里云web可视化开发
连线图
①由于arduino D1在Fritzinig中没找到,用一个arduino代替一下((ˉ▽ˉ;)…强行改名字)
②三块板子的SCL连在一起,SDA连在一起。
代码
主机代码(arduino D1):
#include <ESP8266WiFi.h>//安装esp8266arduino开发环境
#include <Wire.h> //声明I2C库文件
#include <AliyunIoTSDK.h>//引入阿里云 IoT SDK
//需要安装crypto库、PubSubClient库
static WiFiClient espClient;
//设置产品和设备的信息,从阿里云设备信息里查看
//物联网平台→实例概览→公共实例→设备管理→设备→查看→DeviceSecre(右边的查看)
#define PRODUCT_KEY "*********"//替换自己的PRODUCT_KEY
#define DEVICE_NAME "*********"//替换自己的DEVICE_NAME
#define DEVICE_SECRET "*********"//替换自己的DEVICE_SECRET
#define REGION_ID "cn-shanghai"//默认cn-shanghai
//设置连接WiFi信息
#define WIFI_SSID "*********"//自己的WIFI名称(热点同样)
#define WIFI_PASSWD "*********"//自己的WIFI密码
//-------------------------------------------------------------------------
unsigned long lastMsMain = 0;
char a; //从机LED1状态,用于发送到云平台
char b; //从机LED2状态,用于发送到云平台
//-------------------------------------------------------------------------
void setup()
{
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
//连接到wifi
wifiInit(WIFI_SSID, WIFI_PASSWD);
//初始化 iot,需传入 wifi 的 client,和设备产品信息
AliyunIoTSDK::begin(espClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET, REGION_ID);
//绑定一个设备属性回调,当远程修改此属性,会触发LED函数
AliyunIoTSDK::bindData("LED", LED);//主机的板载LED
AliyunIoTSDK::bindData("LED1", LED1);//从机1的板载LED
AliyunIoTSDK::bindData("LED2", LED2);//从机2的板载LED
Wire.begin(); // 加入 i2c 总线,作为主机
}
//-------------------------------------------------------------------------
void loop()
{
AliyunIoTSDK::loop();//必要函数
if (millis() - lastMsMain >= 2000)//每2秒发送一次
{
lastMsMain = millis();
//发送LED状态到云平台(高电平:1;低电平:0)
AliyunIoTSDK::send("LEDPIN", digitalRead(LED_BUILTIN));
AliyunIoTSDK::send("LEDPIN1", a);
AliyunIoTSDK::send("LEDPIN2", b);
}
}
//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");
}
//主机板载灯控制函数(阿里云端修改LED属性时触发)-------------------------------------------------------
void LED(JsonVariant L)//固定格式,修改参数L
{
int LED = L["LED"];//参数传入(LED)
if (LED == 0)
{
digitalWrite(LED_BUILTIN, HIGH);
}
else
{
digitalWrite(LED_BUILTIN, LOW);
}
Serial.printf("收到的LED是:"); Serial.println(LED);
}
//从机1 IIC通信发送板载灯控制信号函数(阿里云端修改LED1属性时触发)--------------------------
void LED1(JsonVariant L)//固定格式,修改参数L
{
int LED = L["LED1"];//参数传入(LED1)
Wire.beginTransmission(4); // 发送数据到设备号为4的从机
Wire.write("light is "); // 发送字符串"light is "
Wire.write(LED); // 发送变量LED的值
Wire.endTransmission(); // 结束数据发送
Wire.requestFrom(4, 1); //通知4号从机上传1个字节(从机板载灯的状态)
while(Wire.available()>0) // 当主机接收到从机数据时触发
{
a=Wire.read(); //将板载灯状态赋值给a,用于传输回阿里云,修改状态指示
}
Serial.printf("收到的LED1是:"); Serial.println(a);
}
//从机2 IIC通信发送板载灯控制信号函数(阿里云端修改LED2属性时触发)--------------------------
void LED2(JsonVariant L)//固定格式,修改参数L
{
int LED = L["LED2"];//参数传入(LED2)
Wire.beginTransmission(5); // 发送数据到设备号为5的从机
Wire.write("light is "); // 发送字符串"light is "
Wire.write(LED); // 发送变量LED的值
Wire.endTransmission(); // 结束数据发送
Wire.requestFrom(5, 1); //通知5号从机上传1个字节(从机板载灯的状态)
while(Wire.available()>0) // 当主机接收到从机数据时触发
{
b=Wire.read(); //将板载灯状态赋值给b,用于传输回阿里云,修改状态指示
}
Serial.printf("收到的LED2是:"); Serial.println(b );
}
//如果要增加控制从机数量,继续增加函数数量即可
从机代码1(arduino Uno):
#include <Wire.h> //声明I2C库文件
int x; //变量x值决定本从机的LED是否点亮
//初始化————————————————————————————————————
void setup()
{
Wire.begin(4); // 加入 i2c 总线,设置从机地址为 #4
Wire.onReceive(receiveEvent); // 注册接收到主机字符的事件
Wire.onRequest(requestEvent); // 注册主机通知从机上传数据的事件
Serial.begin(9600); // 设置串口波特率
pinMode(LED_BUILTIN,OUTPUT); // 设置本从机板载灯为输出
}
//主程序————————————————————————————————————
void loop()
{
delay(100); //延时
}
//收到主机字符事件————————————————————————————————
void receiveEvent(int howMany) //当从机接收到主机字符,执行该事件
{
while( Wire.available()>1) // 循环执行,直到数据包只剩下最后一个字符
{
char c = Wire.read(); // 作为字符接收字节
Serial.print(c); // 把接收到的字符打印到串口监视器中
}
x = Wire.read(); //接收主机发送的数据包中的最后一个字节(板载灯控制字节)
Serial.println("");
Serial.println(x); //把控制字节打印到串口监视器中
if(x==1) //对控制字节进行判断,点亮or熄灭LED。
{
digitalWrite(LED_BUILTIN,HIGH);
}
else
{
digitalWrite(LED_BUILTIN,LOW);
}
}
//当主机通知从机上传数据,执行该事件,上传板载灯状态————————————————
void requestEvent()
{
Wire.write( x); // 响应主机的通知,向主机发送一个字节数据
}
从机代码2(Uno 只修改了从机地址参数,方便复制):
#include <Wire.h> //声明I2C库文件
int x; //变量x值决定本从机的LED是否点亮
//初始化————————————————————————————————————
void setup()
{
Wire.begin(5); // 加入 i2c 总线,设置从机地址为 #5
Wire.onReceive(receiveEvent); // 注册接收到主机字符的事件
Wire.onRequest(requestEvent); // 注册主机通知从机上传数据的事件
Serial.begin(9600); // 设置串口波特率
pinMode(LED_BUILTIN,OUTPUT); // 设置本从机板载灯为输出
}
//主程序————————————————————————————————————
void loop()
{
delay(100); //延时
}
//收到主机字符事件————————————————————————————————
void receiveEvent(int howMany) //当从机接收到主机字符,执行该事件
{
while( Wire.available()>1) // 循环执行,直到数据包只剩下最后一个字符
{
char c = Wire.read(); // 作为字符接收字节
Serial.print(c); // 把接收到的字符打印到串口监视器中
}
x = Wire.read(); //接收主机发送的数据包中的最后一个字节(板载灯控制字节)
Serial.println("");
Serial.println(x); //把控制字节打印到串口监视器中
if(x==1) //对控制字节进行判断,点亮or熄灭LED。
{
digitalWrite(LED_BUILTIN,HIGH);
}
else
{
digitalWrite(LED_BUILTIN,LOW);
}
}
//当主机通知从机上传数据,执行该事件,上传板载灯状态————————————————
void requestEvent()
{
Wire.write( x); // 响应主机的通知,向主机发送一个字节数据
}
阿里云物联网控制
阿里云物联网平台创建产品、设备
第一步:进入公共实例(免费嘛( ̄▽ ̄)")
第二步:创建产品
第三步:创建自定义品类产品
第四步:编辑功能草稿
第五步:添加自定义功能(添加完后记得左下角的“发布上线”)
第六步:创建设备
设备创建完成后,如果你的Arduino D1已经连上网了,而且保证代码中的这几项没有填错,设备将显示在线状态。
//设置产品和设备的信息,从阿里云设备信息里查看
//物联网平台→实例概览→公共实例→设备管理→设备→查看→DeviceSecre(右边的查看)
#define PRODUCT_KEY "*********"//替换自己的PRODUCT_KEY
#define DEVICE_NAME "*********"//替换自己的DEVICE_NAME
#define DEVICE_SECRET "*********"//替换自己的DEVICE_SECRET
#define REGION_ID "cn-shanghai"//默认cn-shanghai
//设置连接WiFi信息
#define WIFI_SSID "*********"//自己的WIFI名称(热点同样)
#define WIFI_PASSWD "*********"//自己的WIFI密码
阿里云物联网使用在线调试进行测试
如果以上操作未出现错误,到这里应该能看到三个板载灯按照你设置的参数实现亮灭。
IoT Studio 阿里云web可视化开发
第一步:
第二步:
第三步:
第四步:
第五步:
第六步:保存、发布、进入网页