arduino Uno+arduino D1 实现 阿里云物联网控制+IIC总线通信点灯

   日期:2020-12-21     浏览:114    评论:0    
核心提示:arduino Uno+arduino D1 实现 阿里云物联网控制+IIC总线通信点灯连线图代码主机代码(arduino D1):从机代码1(arduino Uno):从机代码2(Uno 只修改了从机地址参数,方便复制):阿里云物联网控制阿里云物联网平台创建产品、设备阿里云物联网使用在线调试进行测试IoT Studio 阿里云web可视化开发连线图①由于arduino D1在Fritzinig中没找到,用一个arduino代替一下((ˉ▽ˉ;)…强行改名字)②三块板子的SCL连在一起,SDA连在一起

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可视化开发

第一步:

第二步:

第三步:


第四步:

第五步:

第六步:保存、发布、进入网页

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服