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可視化開發
第一步:

第二步:

第三步:


第四步:

第五步:

第六步:保存、發布、進入網頁


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/238130.html
標籤:其他
