欧美午夜欧美,台湾成人av,久久av一区,最近看过的日韩成人

電子開發(fā)網(wǎng)

電子開發(fā)網(wǎng)電子設(shè)計 | 電子開發(fā)網(wǎng)Rss 2.0 會員中心 會員注冊
搜索: 您現(xiàn)在的位置: 電子開發(fā)網(wǎng) >> 基礎(chǔ)入門 >> Arduino開發(fā)學(xué)習(xí) >> 正文

遠(yuǎn)程控制通訊--基于Arduino + ESP8266控制LED燈

作者:佚名    文章來源:來源網(wǎng)絡(luò)    點擊數(shù):    更新時間:2021/10/17

Arduino是許多智能硬件愛好者的首選,使用簡單快捷,而ESP8266模塊也是當(dāng)前最為熱門的WIFI模塊。本項目完成了Arduino使用EDP協(xié)議通過ESP8266 WIFI模塊接入OneNET服務(wù)器,并通過在接入設(shè)備中創(chuàng)建的應(yīng)用來實現(xiàn)遠(yuǎn)程控制LED燈。

【1】硬件連接:

準(zhǔn)備元件:

Arduino UNO

ESP8266 WIFI模塊

USB轉(zhuǎn)TTL連接線

硬件連線:

Arduino UNO USB轉(zhuǎn)TTL

D2-----------------RX

D3-----------------TX

GND---------------GND

Arduino UNO ESP8266

RX-----------------TX

TX-----------------RX

GND---------------GND

其中USB轉(zhuǎn)TTL連接電腦用于調(diào)試打印輸出,然后Arduino的串口連接ESP8266的串口。

實物連接如下如圖所示:

【2】ESP8266配置和EDP上傳數(shù)據(jù)介紹:

選用ESP8266串口WIFI模塊,通過AT指令控制WIFI模塊接入互聯(lián)網(wǎng),依次完成與接入互聯(lián)網(wǎng)、與OneNet服務(wù)器建立TCP連接、傳輸數(shù)據(jù)等操作。

1)配置WIFI模塊;

模塊配置接入OneNet,依次發(fā)送如下幾個命令到WIFI模塊:

AT+CWMODE=3

AT+RST

AT+CIFSR

AT+CWJAP=“your ssid”,“password”

2)和OneNet服務(wù)器建立TCP連接,依次發(fā)送命令:

AT+CIPSTART=“TCP”,“183.230.40.39”,876 //和服務(wù)器建立TCP連接

AT+CIPMODE=1 //進(jìn)入透明傳輸模式

AT+CIPSEND //開始傳輸

命令執(zhí)行結(jié)果如下圖所示:

【3】創(chuàng)建設(shè)備和應(yīng)用:

添加產(chǎn)品并創(chuàng)建接入設(shè)備,詳細(xì)創(chuàng)建步驟請查看:http://open.iot.10086.cn/doc/art243.html#66。其中數(shù)據(jù)傳輸協(xié)議選擇EDP。

在設(shè)備中添加應(yīng)用,創(chuàng)建一個開關(guān)控件,在右側(cè)的屬性中選擇對應(yīng)設(shè)備的switch0數(shù)據(jù)流 ·注意到屬性中有開關(guān)開值和開關(guān)關(guān)值兩個屬性,分別默認(rèn)為1,0,這里不做修改(因為代碼中1為開,非1則為關(guān)) ·修改EDP命令內(nèi)容為switch0:{v}(與代碼對應(yīng),代碼中會將冒號前的部分作為上傳的數(shù)據(jù)流ID,而將冒號之后的部分作為上傳是數(shù)據(jù)值) 這里的{v}是通配符當(dāng)下發(fā)命令的時候,他將會被開關(guān)的開/關(guān)值取代,稍后我們將看到命令的內(nèi)容。

編輯完成后點擊保存應(yīng)用。

【4】軟件代碼:

其中Arduino開發(fā)板的D13作為被控制的LED燈,在程序中添加設(shè)備ID和APIKey。

/*
采用外接電源單獨(dú)供電,2 3口作為軟串口接PC機(jī)作為調(diào)試端
1 0為串口,連接WIFI模塊
*/
#include
#include "edp.c"
#define KEY "XpAhYrqhsZbk9eVqESnMJznDb3A=" //APIkey
#define ID "4051313" //設(shè)備ID
//#define PUSH_ID "680788"
#define PUSH_ID NULL
// 串口
#define _baudrate 115200
#define _rxpin 3
#define _txpin 2
#define WIFI_UART Serial
#define DBG_UART dbgSerial //調(diào)試打印串口
SoftwareSerial dbgSerial( _rxpin, _txpin ); // 軟串口,調(diào)試打印
edp_pkt *pkt;
/*
* doCmdOk
* 發(fā)送命令至模塊,從回復(fù)中獲取期待的關(guān)鍵字
* keyword: 所期待的關(guān)鍵字
* 成功找到關(guān)鍵字返回true,否則返回false
*/
bool doCmdOk(String data, char *keyword)
{
bool result = false;
if (data != "") //對于tcp連接命令,直接等待第二次回復(fù)
{
WIFI_UART.println(data); //發(fā)送AT指令
DBG_UART.print("SEND: ");
DBG_UART.println(data);
}
if (data == "AT") //檢查模塊存在
delay(2000);
else
while (!WIFI_UART.available()); // 等待模塊回復(fù)
delay(200);
if (WIFI_UART.find(keyword)) //返回值判斷
{
DBG_UART.println("do cmd OK");
result = true;
}
else
{
DBG_UART.println("do cmd ERROR");
result = false;
}
while (WIFI_UART.available()) WIFI_UART.read(); //清空串口接收緩存
delay(500); //指令時間間隔
return result;
}
void setup()
{
char buf[100] = {0};
int tmp;
pinMode(13, OUTPUT); //WIFI模塊指示燈
pinMode(8, OUTPUT); //用于連接EDP控制的發(fā)光二極管
WIFI_UART.begin( _baudrate );
DBG_UART.begin( _baudrate );
WIFI_UART.setTimeout(3000); //設(shè)置find超時時間
delay(3000);
DBG_UART.println("hello world!");
delay(2000);
while (!doCmdOk("AT", "OK"));
digitalWrite(13, HIGH); // 使Led亮
while (!doCmdOk("AT+CWMODE=3", "OK")); //工作模式
while (!doCmdOk("AT+CWJAP="PDCN","1234567890"", "OK"));
while (!doCmdOk("AT+CIPSTART="TCP","183.230.40.39",876", "CONNECT"));
while (!doCmdOk("AT+CIPMODE=1", "OK")); //透傳模式
while (!doCmdOk("AT+CIPSEND", ">")); //開始發(fā)送
}
void loop()
{
static int edp_connect = 0;
bool trigger = false;
edp_pkt rcv_pkt;
unsigned char pkt_type;
int i, tmp;
char num[10];
/* EDP 連接 */
if (!edp_connect)
{
while (WIFI_UART.available()) WIFI_UART.read(); //清空串口接收緩存
packetSend(packetConnect(ID, KEY)); //發(fā)送EPD連接包
while (!WIFI_UART.available()); //等待EDP連接應(yīng)答
if ((tmp = WIFI_UART.readBytes(rcv_pkt.data, sizeof(rcv_pkt.data))) > 0 )
{
rcvDebug(rcv_pkt.data, tmp);
if (rcv_pkt.data[0] == 0x20 && rcv_pkt.data[2] == 0x00 && rcv_pkt.data[3] == 0x00)
{
edp_connect = 1;
DBG_UART.println("EDP connected.");
}
else
DBG_UART.println("EDP connect error.");
}
packetClear(&rcv_pkt);
}
while (WIFI_UART.available())
{
readEdpPkt(&rcv_pkt);
if (isEdpPkt(&rcv_pkt))
{
pkt_type = rcv_pkt.data[0];
switch (pkt_type)
{
case CMDREQ:
char edp_command[50];
char edp_cmd_id[40];
long id_len, cmd_len, rm_len;
char datastr[20];
char val[10];
memset(edp_command, 0, sizeof(edp_command));
memset(edp_cmd_id, 0, sizeof(edp_cmd_id));
edpCommandReqParse(&rcv_pkt, edp_cmd_id, edp_command, &rm_len, &id_len, &cmd_len);
DBG_UART.print("rm_len: ");
DBG_UART.println(rm_len, DEC);
delay(10);
DBG_UART.print("id_len: ");
DBG_UART.println(id_len, DEC);
delay(10);
DBG_UART.print("cmd_len: ");
DBG_UART.println(cmd_len, DEC);
delay(10);
DBG_UART.print("id: ");
DBG_UART.println(edp_cmd_id);
delay(10);
DBG_UART.print("cmd: ");
DBG_UART.println(edp_command);
//數(shù)據(jù)處理與應(yīng)用中EDP命令內(nèi)容對應(yīng)
//本例中格式為 datastream:[1/0]
sscanf(edp_command, "%[^:]:%s", datastr, val);
if (atoi(val) == 1)
digitalWrite(13, HIGH); // 使Led亮
else
digitalWrite(13, LOW); // 使Led滅
packetSend(packetDataSaveTrans(NULL, datastr, val)); //將新數(shù)據(jù)值上傳至數(shù)據(jù)流
break;
default:
DBG_UART.print("unknown type: ");
DBG_UART.println(pkt_type, HEX);
break;
}
}
//delay(4);
}
if (rcv_pkt.len > 0)
packetClear(&rcv_pkt);
delay(150);
}
/*
* readEdpPkt
* 從串口緩存中讀數(shù)據(jù)到接收緩存
*/
bool readEdpPkt(edp_pkt *p)
{
int tmp;
if ((tmp = WIFI_UART.readBytes(p->data + p->len, sizeof(p->data))) > 0 )
{
rcvDebug(p->data + p->len, tmp);
p->len += tmp;
}
return true;
}
/*
* packetSend
* 將待發(fā)數(shù)據(jù)發(fā)送至串口,并釋放到動態(tài)分配的內(nèi)存
*/
void packetSend(edp_pkt* pkt)
{
if (pkt != NULL)
{
WIFI_UART.write(pkt->data, pkt->len); //串口發(fā)送
WIFI_UART.flush();
free(pkt); //回收內(nèi)存
}
}
void rcvDebug(unsigned char *rcv, int len)
{
int i;
DBG_UART.print("rcv len: ");
DBG_UART.println(len, DEC);
for (i = 0; i < len; i++)
{
DBG_UART.print(rcv[i], HEX);
DBG_UART.print(" ");
}
DBG_UART.println("");
}

【5】功能測試:

設(shè)備上電后,可以看到電腦串口打印輸出的內(nèi)容,首先連接OneNET服務(wù)器:

連接成功后,可以看到設(shè)備在線狀態(tài):

點擊設(shè)備應(yīng)用中的開關(guān)按鈕,發(fā)送開關(guān)命令給設(shè)備:

設(shè)備接收命令后進(jìn)行解析,并在串口打印輸出:

當(dāng)解析到數(shù)據(jù)流switch0的值為1時設(shè)備開燈,Arduino 開發(fā)板的D13被點亮,相反為0時燈滅。

Tags:Arduino,遠(yuǎn)程控制通訊  
責(zé)任編輯:admin
請文明參與討論,禁止漫罵攻擊,不要惡意評論、違禁詞語。 昵稱:
1分 2分 3分 4分 5分

還可以輸入 200 個字
[ 查看全部 ] 網(wǎng)友評論
關(guān)于我們 - 聯(lián)系我們 - 廣告服務(wù) - 友情鏈接 - 網(wǎng)站地圖 - 版權(quán)聲明 - 在線幫助 - 文章列表
返回頂部
刷新頁面
下到頁底
晶體管查詢
主站蜘蛛池模板: 天门市| 安国市| 万载县| 松溪县| 溧阳市| 婺源县| 安福县| 壶关县| 南康市| 台安县| 松阳县| 昌平区| 武平县| 普兰店市| 临颍县| 白银市| 灵武市| 丹棱县| 祥云县| 樟树市| 荔波县| 岳普湖县| 广州市| 德兴市| 临安市| 宜阳县| 金坛市| 茂名市| 依安县| 沂水县| 临泽县| 牙克石市| 安西县| 吉木乃县| 沙田区| 武安市| 嘉定区| 织金县| 吴忠市| 全椒县| 台北市|