arduino Uno+arduino D1 實現 阿里雲物聯網控制+IIC匯流排通訊點燈

csdn35772148發表於2020-12-20

連線圖

①由於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視覺化開發

第一步:
在這裡插入圖片描述
第二步:
在這裡插入圖片描述
第三步:
在這裡插入圖片描述
在這裡插入圖片描述
第四步:
在這裡插入圖片描述
第五步:在這裡插入圖片描述
在這裡插入圖片描述
第六步:儲存、釋出、進入網頁
在這裡插入圖片描述
在這裡插入圖片描述

相關文章