日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > > wenzi嵌入式軟件
[導(dǎo)讀]前不久筆者在電子芯吧客看到了關(guān)于 TinkerNode NB-IOT 物聯(lián)網(wǎng)的試用申請(qǐng),由于之前自己接觸 NB-IOT 模塊,當(dāng)時(shí)用的是 BC26,看到這塊開發(fā)板也帶著 NB IOT 的字樣,就抱著試一試的心態(tài)申請(qǐng)一下,沒想到申請(qǐng)到了,還是非常的意外,于是也就有了這篇評(píng)測(cè)~

前言

前不久筆者在電子芯吧客看到了關(guān)于 TinkerNode NB-IOT 物聯(lián)網(wǎng)的試用申請(qǐng),由于之前自己接觸 NB-IOT 模塊,當(dāng)時(shí)用的是 BC26,看到這塊開發(fā)板也帶著 NB IOT 的字樣,就抱著試一試的心態(tài)申請(qǐng)一下,沒想到申請(qǐng)到了,還是非常的意外,于是也就有了這篇評(píng)測(cè)~

開發(fā)板概況

打開快遞后,映入眼簾的是一個(gè)黑色的包裝盒子,如下所示:

image-20201129150709211

我們打開盒子可以看到有如下幾件東西:

image-20201130112407791

通過包裝就可以看到這個(gè)板子支持WiFi、BT(藍(lán)牙)、NB-IOT(窄帶物聯(lián)網(wǎng)通信)、GNSS(全球?qū)Ш叫l(wèi)星系統(tǒng)),光是這四個(gè)就足以看出這塊板子的強(qiáng)大,接下來看啊可能板子的實(shí)際圖片,如下所示:

可以看到元器件排布的很緊密,整塊板子很小,給人看起來就很精致的感覺,除了正面有元器件以外,背面也有元器件,如下圖所示:

同樣整個(gè)背面的元器件排布的也很緊湊,有 SIM 卡插槽,也有引出的 IO 口,設(shè)計(jì)的非常的精致,下面是正面和背面元器件的概況圖:

image-20201130112437904

要使得模塊能夠正常工作,需要連接上天線和 SIM 卡,連接示意圖如下所示:

組裝圖

到此,基本就對(duì)板子的一個(gè)大體概況有了一個(gè)基本的認(rèn)識(shí),那接下來要把當(dāng)前這個(gè)板子用起來,自然就需要當(dāng)前板子的相關(guān)資料,目前有的資料有視頻資料和文檔資料,下面給出兩處資料的鏈接:

文檔資料:http://wiki.dfrobot.com.cn/SKU_DFR0530_TinkerNode_NB-IoT%E7%89%A9%E8%81%94%E7%BD%91%E5%BC%80%E5%8F%91%E6%9D%BF_V1_0

視頻資料:https://mc.dfrobot.com.cn/thread-304116-1-1.html

有了資料了那就可以進(jìn)行實(shí)操了,接下來看我們?nèi)绾我徊揭徊綄⑦@塊板子玩起來。

開發(fā)工具的安裝

再進(jìn)行安裝 IDE 之前,需要安裝一個(gè)驅(qū)動(dòng),驅(qū)動(dòng)安裝包在教程中可以找到,下面是安裝的示意圖:

image-20201130220213503

當(dāng)前的開發(fā)板所選擇的 IDE 是 Arduino ,這里給出下載地址:https://www.arduino.cc/en/software,下面是該軟件的界面:

image-20201130214413048

首先,要能夠驅(qū)動(dòng)當(dāng)前的板子,那么就需要添加開發(fā)板驅(qū)動(dòng)的 URL,添加步驟文件 -> 首選項(xiàng),然后就打開了如下所示的界面:

image-20201130214925832

然后將下述所示的網(wǎng)址復(fù)制到框內(nèi):http://download.dfrobot.top/TinkerNode-NB-IoT/package_TinkerNode-NB-IoT_index.json

添加了網(wǎng)址之后,就需要更新板子信息,按照如下步驟進(jìn)行更新:工具 -> 開發(fā)板 -> 開發(fā)板管理器,更新完成后的界面如下圖所示:

image-20201130215442187

然后再搜索框搜索 TinkerNode,選擇 TinkerNode ,選擇版本后進(jìn)行安裝。

image-20201130215833262

到此為止,準(zhǔn)備工作就做完了,下面進(jìn)入代碼實(shí)驗(yàn)階段。

代碼實(shí)驗(yàn)

點(diǎn)個(gè)燈

作為嵌入式開發(fā)者來說,在拿到一塊板子的時(shí)候,第一件想到的事就是點(diǎn)個(gè)燈吧,流水燈,呼吸燈,等等等等,這塊板子也一樣,我們可以看到板子有一顆小燈是留給開發(fā)者操作的,如下圖所示:

image-20201203135253298

那么如何點(diǎn)亮這顆小燈呢,我們打開 Arduino 的一個(gè)示例程序,打開方式如下所示:

打開之后的代碼如下所示:

void?setup()?{
??//?initialize?digital?pin?LED_BUILTIN?as?an?output.
??pinMode(LED_BUILTIN,?OUTPUT);
}

//?the?loop?function?runs?over?and?over?again?forever
void?loop()?{
??digitalWrite(LED_BUILTIN,?HIGH);???//?turn?the?LED?on?(HIGH?is?the?voltage?level)
??delay(1000);???????????????????????//?wait?for?a?second
??digitalWrite(LED_BUILTIN,?LOW);????//?turn?the?LED?off?by?making?the?voltage?LOW
??delay(1000);???????????????????????//?wait?for?a?second
}

如果是接觸過 Arduino 的朋友,那么在看到上述這樣的代碼比較熟悉,但是如果之前沒有接觸過 Arduino 的朋友在看到這樣的代碼之后,就會(huì)有點(diǎn)懵了,main函數(shù)呢?在整個(gè)文件中看不到?main函數(shù)的存在,其實(shí),這是 Arduino 為了降低開發(fā)的門檻,省略掉了一些比較底層的東西,使得更多愛好者能夠上手 Arduino 編程。但實(shí)際上,main函數(shù)是存在的,我們使用搜索工具在軟件的安裝目錄搜索?main函數(shù),可以得到如下的結(jié)果:

image-20201203135932968

文件的代碼內(nèi)容如下所示:

#include?

//?Declared?weak?in?Arduino.h?to?allow?user?redefinitions.
int?atexit(void?(*?/*func*/?)())?{?return?0;?}

//?Weak?empty?variant?initialization?function.
//?May?be?redefined?by?variant?files.
void?initVariant()?__attribute__((weak));
void?initVariant()?{?}

void?setupUSB()?__attribute__((weak));
void?setupUSB()?{?}

int?main(void)
{
????init();

????initVariant();

#if?defined(USBCON)
????USBDevice.attach();
#endif

????setup();

????for?(;;)?{
????????loop();
????????if?(serialEventRun)?serialEventRun();
????}

????return?0;
}

這個(gè)時(shí)候再來看?setup?和?loop函數(shù),就比較清晰明了了,這也就是為什么要把初始化的內(nèi)容放到?setup里面去,為什么要把執(zhí)行的操作放到?loop里面去。緊接著,我們?cè)趤砜袋c(diǎn)燈的代碼,我們?cè)谑褂脝纹瑱C(jī)的時(shí)候,如果要操做一個(gè) IO 口,那么就需要知道這個(gè) IO 口的端口以及引腳,但是我們?cè)诳催@段代碼的時(shí)候,只看到了一個(gè)LED_BUILTIN,并沒有端口號(hào)和引腳號(hào)什么的,那是如何做到的呢?其實(shí)這也是 Arduino 為了降低門檻做的操作,它將這些引腳的定義都寫到了庫里面,各個(gè)開發(fā)板的引腳定義都對(duì)應(yīng)各個(gè)開發(fā)板的pins_arduino.h文件,下面是在軟件的安裝目錄找到的?pins_arduino.h文件。

image-20201203141046508

下面是文件里的內(nèi)容:

image-20201203141533116

可以看到LED_BUILTIN的定義在不同的開發(fā)板引腳序號(hào)也是不相同的,知道了這些底層一些的東西之后,我們回過頭來再來看點(diǎn)燈的代碼,大體意思就是設(shè)置 IO 口的輸出模式,然后設(shè)置 IO 的電平,最終達(dá)到閃爍的效果,將代碼按照下述順序編譯并上傳之后,就可以在板子上看到小燈閃爍的現(xiàn)象了。

image-20201203141857800

到此,點(diǎn)燈操作到此結(jié)束。

連個(gè)網(wǎng)

設(shè)備向云端傳輸數(shù)據(jù)

在點(diǎn)了個(gè)燈之后,這是任何一款嵌入式開發(fā)板都具有的基本功能,那作為一款物聯(lián)網(wǎng)開發(fā)板來說,它的特點(diǎn)自然是能夠聯(lián)網(wǎng)并傳輸數(shù)據(jù)了,接下來展示的就是開發(fā)板聯(lián)網(wǎng)之后向云端發(fā)送數(shù)據(jù)的示例。首先,我們的云端采用的是?Easy IOT:

image-20201203142224122

點(diǎn)擊工作間,進(jìn)到如下所示的一個(gè)界面:

image-20201203142316579

上述圖片所示的,我們需要記錄如下三個(gè)信息,才能讓我們的板子連接至云端。

  • user:Nkoy_LAMR

  • password:HkTslY0Mgz

  • Topic:Gm9l_Y0Gg

下面是上傳數(shù)據(jù)的代碼:

#include?
#include?
#include?"DFRobot_Iot.h"

/*?配置WiFi名和密碼?*/
const?char?*?WIFI_SSID?=?"TP-LINK_C104";
const?char?*?WIFI_PASSWORD?=?"ee104109";

/*配置設(shè)備認(rèn)證信息*/
String?Iot_id?=?"Nkoy_LAMR";
String?Client_ID?=?"12345";
String?Iot_pwd?=?"HkTslY0Mgz";

/*?配置?IOT?云平臺(tái)的IP地址和端口號(hào)?*/
String?EasyIot_SERVER?=?"182.254.130.180";
uint16_t?PORT?=?1883;

/*?配置要推送或者訂閱的?topic?*/
const?char?*?pubTopic?=?"Gm9l_Y0Gg";

DFRobot_Iot?myEasyIoT;
WiFiClient?espClient;
PubSubClient?client(espClient);

void?connectWiFi()
{
??WiFi.disconnect();
??delay(100);
??Serial.print("Connecting?to");
??Serial.println(WIFI_SSID);
??WiFi.begin(WIFI_SSID,?WIFI_PASSWORD);
??while?(WiFi.status()?!=?WL_CONNECTED)?{
????delay(500);
????Serial.print(".");
??}
??Serial.println();
??Serial.println("WiFi?connected");
??Serial.print("IP?Adderss:?");
??Serial.println(WiFi.localIP());?
}

/*連接到IoT云服務(wù)器*/
void?ConnectCloud()?{
??while?(!client.connected())?{
????Serial.print("Attempting?MQTT?connection...");
????if?(client.connect(myEasyIoT._clientId,?myEasyIoT._username,?myEasyIoT._password))?{
??????Serial.println("Connect?Server?OK");
????}?else?{
??????Serial.print("failed,?rc=");
??????Serial.print(client.state());
??????Serial.println("?Try?again?in?5?seconds");
??????delay(5000);
????}
??}
}

void?setup()?{
??//?put?your?setup?code?here,?to?run?once:
???/*初始化串口,波特率115200*/
??Serial.begin(115200);

??/*連接WIFI*/
??connectWiFi();

??/*配置需要連接的IoT云服務(wù)器(Easy-IoT)*/
??myEasyIoT.init(EasyIot_SERVER,?Iot_id,?Client_ID,?Iot_pwd);
??client.setServer(myEasyIoT._mqttServer,?PORT);

??/*連接到Easy-IoT*/
??ConnectCloud();

}

void?loop()?{
??//?put?your?main?code?here,?to?run?repeatedly:
??/*IoT云服務(wù)器斷線重連*/
??if?(!client.connected())?{
????ConnectCloud();
??}
??client.loop();

??/*每隔一段時(shí)間向Easy-IoT*/
??Serial.println("Sending?message?to?cloud...");
??client.publish(pubTopic,?"Hello");
??Serial.println("Message?is?sent.");
??delay(10000);
}

上述的代碼也很好理解,就是每隔一段時(shí)間向云端發(fā)送?Hello,我們打開云端可以看到云端也確實(shí)接受到了設(shè)備給它發(fā)送的數(shù)據(jù),如下所示:

image-20201203142757003

到這,設(shè)備端向云端發(fā)送數(shù)據(jù)的操作就完成了,那么云端是如何向設(shè)備端發(fā)送數(shù)據(jù)的呢?那來看接下來的敘述。

云端向設(shè)備端發(fā)送數(shù)據(jù)

云端向設(shè)備端發(fā)送數(shù)據(jù),同樣的,先貼出代碼:

#include?
#include?
#include?"DFRobot_Iot.h"

/*配置WIFI名和密碼*/
const?char?*?WIFI_SSID?=?"TP-LINK_C104";
const?char?*?WIFI_PASSWORD?=?"ee104109";

/*配置設(shè)備的認(rèn)證信息*/
String?Iot_id?=?"Nkoy_LAMR";
String?Client_ID?=?"12345";
String?Iot_pwd?=?"HkTslY0Mgz";

/*配置IoT云平臺(tái)的IP地址和端口號(hào)*/
String?EasyIot_SERVER?=?"182.254.130.180";
uint16_t?PORT?=?1883;

/*配置要推送(Publish)或訂閱(Subscribe)的topic*/
const?char?*?subTopic?=?"Gm9l_Y0Gg";

DFRobot_Iot?myEasyIoT;
WiFiClient?espClient;
PubSubClient?client(espClient);

/*連接WiFi*/
void?connectWiFi()?{
??WiFi.disconnect();
??delay(100);
??Serial.print("Connecting?to?");
??Serial.println(WIFI_SSID);
??WiFi.begin(WIFI_SSID,?WIFI_PASSWORD);
??while?(WiFi.status()?!=?WL_CONNECTED)?{
????delay(500);
????Serial.print(".");
??}
??Serial.println();
??Serial.println("WiFi?connected");
??Serial.print("IP?Adderss:?");
??Serial.println(WiFi.localIP());
}

/*連接到IoT云服務(wù)器*/
void?ConnectCloud()?{
??while?(!client.connected())?{
????Serial.print("Attempting?MQTT?connection...");
????if?(client.connect(myEasyIoT._clientId,?myEasyIoT._username,?myEasyIoT._password))?{
??????Serial.println("Connect?Server?OK");
????}?else?{
??????Serial.print("failed,?rc=");
??????Serial.print(client.state());
??????Serial.println("?Try?again?in?5?seconds");
??????delay(5000);
????}
??}
}

/*回調(diào)函數(shù)。當(dāng)從訂閱的topic收到消息時(shí),該函數(shù)被調(diào)用。*/
void?callback(char?*?topic,?uint8_t?*?payload,?unsigned?int?len)?{

??/*顯示收到的topic名稱和消息內(nèi)容*/
??Serial.print("Recevice?[Topic:");
??Serial.print(topic);
??Serial.print("]?");
??for?(int?i?=?0;?i?????Serial.print((char)payload[i]);
??}
??Serial.println();
}

void?setup()?{
??/*初始化串口,波特率115200*/
??Serial.begin(115200);

??/*連接WIFI*/
??connectWiFi();

??/*配置需要連接的IoT云服務(wù)器(Easy-IoT)*/
??myEasyIoT.init(EasyIot_SERVER,?Iot_id,?Client_ID,?Iot_pwd);
??client.setServer(myEasyIoT._mqttServer,?PORT);

??/*配置回調(diào)函數(shù)*/
??client.setCallback(callback);

??/*連接到Easy-IoT*/
??ConnectCloud();

??/*訂閱(Subscribe)指定topic*/
??client.subscribe(subTopic);
??Serial.print("Topic:");
??Serial.print(subTopic);
??Serial.println("?subscribed!");
}

void?loop()?{
??/*IoT云服務(wù)器斷線重連*/
??if?(!client.connected())?{
????ConnectCloud();
??}
??client.loop();
}

代碼閱讀起來邏輯很清晰,就不再這里贅述了,我們通過運(yùn)算向設(shè)備端發(fā)送123456,發(fā)送窗口如下如圖所示:

image-20201203143757546

發(fā)送了之后,我們將接受到的數(shù)據(jù)用串口打印出來,可以看到如下所示的消息:

image-20201203143837357

說明數(shù)據(jù)發(fā)送是沒有問題的。到此,就基本完成了,但是實(shí)際上這整個(gè)過程對(duì)于一個(gè)嵌入式開發(fā)者是存在很多疑問的,就拿設(shè)備端向云端發(fā)送數(shù)據(jù)這一段來講,下面的這三個(gè)頭文件在哪里,當(dāng)前所使用的 IDE 并不能夠直接打開這三個(gè)頭文件,應(yīng)該如何查看?

#include?
#include?
#include?"DFRobot_Iot.h"

要查看頭文件的原因也很簡(jiǎn)單,如果不能查看頭文件,那么也就不知道如何調(diào)用 API 接口,連接 WiFi 的接口,連接云端的接口,這些都是未知的,這要如何寫呢?所以,查看頭文件是很有必要的,接下來,就介紹如何打開我們所包含的頭文件,首先,我們得知道路徑,按照如下方式打開圖示的選項(xiàng)。

image-20201203144437951

打開這兩個(gè)之后,我們?cè)诰幾g的時(shí)候,就可以看到相關(guān)信息,如下圖所示:

image-20201203144820304

我們按照這個(gè)信息進(jìn)行查找一下,并用 VSCODE 打開,打開界面如下圖所示:

image-20201203145412545

可以找到.h文件以及對(duì)應(yīng)的 .cpp 文件,也就知道了對(duì)應(yīng)的實(shí)現(xiàn),對(duì)應(yīng)的也就知道了相應(yīng)的接口。

結(jié)論

上述就是一個(gè)基本的介紹了,當(dāng)然這個(gè)板子的功能那么強(qiáng)大,還有很多待探索的功能,此次的開箱評(píng)測(cè)就到這里啦~


免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉