作者:dexin

資料來源:www.dfrobot.com.cn

戳出一枚演示動(dòng)圖:

在這個(gè)擁共享單車的時(shí)代,當(dāng)你興致沖沖地騎著小車車去一個(gè)比較陌生地方時(shí),你有沒有這種煩躁:時(shí)不時(shí)掏出手機(jī)看看要怎么往目的地騎?或者是帶著耳機(jī)聽著語音導(dǎo)航,卻發(fā)現(xiàn)后面有一輛大巴正在瘋狂地朝你按喇叭。居然還有買了手機(jī)支架,卻忘了帶!帶著朋友轉(zhuǎn)圈,結(jié)果……迷路了。是的沒錯(cuò),這些事兒我都干過了。

終于我決定讓手機(jī)導(dǎo)航安心呆在我的小書包里?。ㄒ?yàn)槲抑幌肟捶较颍。┯靡粋€(gè)低功耗的導(dǎo)航小神器——iBikeTo代替手機(jī)為我指路,肯定不管去哪心里都能踏實(shí)~

那么問題來了,咋!弄!??!

想要獲取導(dǎo)航信息,那就先要學(xué)會(huì)自己寫AP!Android寫程序式有神器滴——AndroidStudio。據(jù)說這是google的親兒子,因此兼容性那是杠杠滴。那么第二個(gè)問題來了,導(dǎo)航信息點(diǎn)怎么獲啊~果斷選擇靠譜的高德地圖SDK。至于為什么我沒有選用百度地圖。。因?yàn)槲铱床欢麄兊拈_發(fā)者文檔?。ㄓ心敲匆唤z絲尷尬。。。配置了兩三天環(huán)境,整個(gè)人都不好了。。)下面是APP的功能分割。因?yàn)檫@個(gè)APP只有我一個(gè)人,所以我也就去掉了美工什么的。功能分割為:

基本定位(地圖顯示+坐標(biāo)顯示+坐標(biāo)的讀出)

興趣點(diǎn)選?。ㄓ脩艚换?坐標(biāo)獲取)

導(dǎo)航規(guī)劃(坐標(biāo)輸入+路徑規(guī)劃+動(dòng)作捕獲+動(dòng)作傳出)

WIFI通信(熱點(diǎn)開啟+Socket建立+信息流輸入輸出)

基本定位(地圖顯示+坐標(biāo)顯示+坐標(biāo)的讀出)

興趣點(diǎn)選?。ㄓ脩艚换?坐標(biāo)獲?。?/p>

導(dǎo)航規(guī)劃(坐標(biāo)輸入+路徑規(guī)劃+動(dòng)作捕獲+動(dòng)作傳出)

WIFI通信(熱點(diǎn)開啟+Socket建立+信息流輸入輸出)

當(dāng)然,一些細(xì)節(jié)程序如子線程建立,就作為基礎(chǔ)功能在調(diào)試中應(yīng)用即可。

接下來就是逐步調(diào)試了。

打開AS(AndroidStudio的簡(jiǎn)稱,安裝教程網(wǎng)上超多我這里就不多言了),新建一個(gè)項(xiàng)目,然后到在高德官網(wǎng)上下載相應(yīng)的jar包和so庫。首先完成定位功能的調(diào)試。

這里,很重要!!你需要在注冊(cè)了高德地圖開發(fā)者以后,在高德開放平臺(tái)注冊(cè)應(yīng)用獲得一個(gè)key,整個(gè)過程并不復(fù)雜,SHA1值的獲取查詢說明即可~高德開發(fā)者文檔、高德應(yīng)用管理申請(qǐng)key。

記下自己的key哦,接下來,才是見證奇跡的時(shí)刻~!

在AndroidManifest.xml中,在application前添加:

<!-- 用于進(jìn)行網(wǎng)絡(luò)定位 -->[/p] <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<!-- 用于訪問GPS定位 -->

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<!-- 獲取運(yùn)營商信息,用于支持提供運(yùn)營商信息相關(guān)的接口 -->

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<!-- 用于訪問wifi網(wǎng)絡(luò)信息,wifi信息會(huì)用于進(jìn)行網(wǎng)絡(luò)定位 -->

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

<!-- 這個(gè)權(quán)限用于獲取wifi的獲取權(quán)限,wifi信息會(huì)用來進(jìn)行網(wǎng)絡(luò)定位 -->

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

<!-- 用于訪問網(wǎng)絡(luò),網(wǎng)絡(luò)定位需要上網(wǎng) -->

<uses-permission android:name="android.permission.INTERNET" />

<!-- 用于讀取手機(jī)當(dāng)前的狀態(tài) -->

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

<!-- 寫入擴(kuò)展存儲(chǔ),向擴(kuò)展卡寫入數(shù)據(jù),用于寫入緩存定位數(shù)據(jù) -->

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<!-- 用于申請(qǐng)調(diào)用A-GPS模塊 -->

<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />

<!-- 用于申請(qǐng)獲取藍(lán)牙信息進(jìn)行室內(nèi)定位 -->

<uses-permission android:name="android.permission.BLUETOOTH" />

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

<uses-permission android:name="android.permission.INTERNET" />

<!--用于進(jìn)行網(wǎng)絡(luò)定位-->

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>

<!--用于訪問GPS定位-->

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>

<!--獲取運(yùn)營商信息,用于支持提供運(yùn)營商信息相關(guān)的接口-->

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>

<!--用于訪問wifi網(wǎng)絡(luò)信息,wifi信息會(huì)用于進(jìn)行網(wǎng)絡(luò)定位-->

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>

<!--這個(gè)權(quán)限用于獲取wifi的獲取權(quán)限,wifi信息會(huì)用來進(jìn)行網(wǎng)絡(luò)定位-->

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>

<!--用于訪問網(wǎng)絡(luò),網(wǎng)絡(luò)定位需要上網(wǎng)-->

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

<!--用于讀取手機(jī)當(dāng)前的狀態(tài)-->

<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>

<!--寫入擴(kuò)展存儲(chǔ),向擴(kuò)展卡寫入數(shù)據(jù),用于寫入緩存定位數(shù)據(jù)-->

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

<!--用于申請(qǐng)調(diào)用A-GPS模塊-->

<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>

<!--用于申請(qǐng)獲取藍(lán)牙信息進(jìn)行室內(nèi)定位-->

<uses-permission android:name="android.permission.BLUETOOTH"></uses-permission>

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>

}

這是所有需要使用到的權(quán)限信息。一次填寫終身受用哈哈哈~

接下來在android:theme下加兩句

<meta-data[/p] android:name="com.amap.api.v2.apikey"

android:value=屬于你的高德地圖key" />

把你緊握著的key放進(jìn)去就好啦~剩下的初始化過程和普通Android程序完全相同。完成初始化以后:恭喜你!程序你已經(jīng)寫好一半啦~

因?yàn)楦叩碌貓D對(duì)于定位和導(dǎo)航都有自己的demo,只需要下載下來調(diào)試相關(guān)函數(shù)即可。我就不再多做說明(因?yàn)槲覀兊闹鹘鞘荅SP-32?。。┐蠹铱梢灾苯釉谖椅哪┙o出的demo里進(jìn)行自定義的修改。我這里主要交代一下我自定義的內(nèi)容:

一、圖標(biāo)更換子線程:

這個(gè)子線程主要用于顯示W(wǎng)IFI熱點(diǎn)的開關(guān)狀態(tài),當(dāng)使用iBikeTo時(shí),手機(jī)會(huì)默認(rèn)開啟一個(gè)名為iBikeTo的熱點(diǎn)。iBikeTo根據(jù)預(yù)先設(shè)定好的密碼連接與此熱點(diǎn),并且和手機(jī)socket通信,完成事件的響應(yīng)和信息的顯示。

二、熱點(diǎn)開啟函數(shù):

根據(jù)你的要求更換熱點(diǎn)的密碼和名稱就可以啦,但是還需要在ESP-32的軟件中修改相關(guān)參數(shù)吼!還是一樣的道理,由于熱點(diǎn)開啟時(shí)個(gè)耗時(shí)的活兒~所以不能放在onCreat中哦,我還是選擇了用子線程做這件事。

三、地圖選點(diǎn)、單點(diǎn)生存

因?yàn)椴幌胱屪詈笤诘貓D上選太多不相關(guān)的點(diǎn)、所以在這里我應(yīng)用hasMarkerOnMap來作為狀態(tài)清理。也就是說,如果在地圖上已經(jīng)有選點(diǎn)的情況下再去點(diǎn)擊POI關(guān)鍵點(diǎn),APP會(huì)優(yōu)先關(guān)閉上一次的marker,清理屏幕~

四、iBikeTo IP地址輸入

iBikeTo在局域網(wǎng)中的IP地址顯示在面板上,由使用者填入APP中,讓手機(jī)找到iBikeTo硬件,(這的確有些不合理,正在想辦法改進(jìn)?。?/p>

大部分的系統(tǒng)中,會(huì)給子網(wǎng)分配192.168開始的IP地址,因此如果一般情況下,輸入后幾位就可以了,但是對(duì)于特殊情況,只需要把IP全長輸入進(jìn)去,由于有s.length()>6的分支,會(huì)讓程序?qū)⑤斎氲腎P全部讀入,提高啦環(huán)境滴兼容性~

五、Socket建立

知道啦ibikeTo的網(wǎng)絡(luò)位置,手機(jī)就可以建立socket連接傳輸數(shù)據(jù)了。只需要在路口等轉(zhuǎn)折處發(fā)送相關(guān)的字符給ESP-32就可以了!

比如說:

由于只是簡(jiǎn)單demo所以我只顯示直走、和左右轉(zhuǎn)彎的狀態(tài)(哈哈哈 幸虧沒有路試不然簡(jiǎn)直會(huì)是災(zāi)難的啊~)

然后,就是給我APP畫一個(gè)漂亮得圖標(biāo)了!然而缺少美工得本寶寶只能可憐巴巴滴去easyicon下載,我強(qiáng)烈安利你們一發(fā)easyicon,真的是很不錯(cuò)得網(wǎng)站,很用心~

基本上,到這里,Android端可以說已經(jīng)布置完畢了,由于我手里只剩一臺(tái)4.3的Android舊機(jī),所以所有的調(diào)試也都是基于4.3的(在這里為舊機(jī)抱怨一下,好幾年不,翻出來就是被我調(diào)試得一頓閃退,也是辛苦了 不過!略略略~雖然你是我得戰(zhàn)斗機(jī)~)Android端測(cè)試軟件ibikeToibikeTo_Android_demo(文件過大 請(qǐng)查看“閱讀原文”下載)

所以!我又可以回歸Arduino的懷抱了!

看到者青春的小界面我一楞,才想起來因?yàn)橐{(diào)試3D打印機(jī),所以把1.8給卸了。。。

項(xiàng)目里我自己寫了兩個(gè)動(dòng)畫(link和showMode)(不能算庫,庫的寫法我將ibikeTo 一代demo會(huì)說,別找。。我是先發(fā)的二代demo教程),在視頻里應(yīng)該已經(jīng)看到過了。

為了讓LED Matrix可以顯示出來自己的IP地址,我寫了個(gè)IP的解算,解算原理很簡(jiǎn)單,關(guān)于IP地址,不懂的百度哦~~

int ip_get;

int IP_int[4];

ip_get = (int) WiFi.localIP();

for (int i = 0; i < 4; i++)

IP_int = ip_get >> (8 * i);

IP_int[2] -= IP_int[3] * 256;

IP_int[1] = IP_int[1] - IP_int[2] * 256 - IP_int[3] * 256 * 256;

IP_int[0] = IP_int[0] - IP_int[1] * 256 - IP_int[2] * 256 * 256 - IP_int[3] * 256 * 256 * 256;

if (IP_int[3] < 0)

IP_int[3] += 256;

String int_IP_Address = (String)IP_int[0] + "." + (String)IP_int[1] + "." + (String)IP_int[2] + "." + (String)IP_int[3];[/p][p=30, 2, left] for (int looper = 0; looper < int_IP_Address.length(); looper++)

waitPlot[looper] = int_IP_Address[looper];

ht1632c.clearScreen();

server.begin();[/p][p=30, 2, left] ht1632c.print(waitPlot, 40);

接下來就是開放端口給上位機(jī),然后就是接收上位機(jī)Android發(fā)來的字符串即可,代碼如下:

WiFiClient ipclient = server.available();

if (ipclient) {

String currentLine = "";

Serial.println("client connected");

while (ipclient.connected()) {

if (ipclient.available()) {

char c = ipclient.read();

if (c == ';') {

if (currentLine.length() == 0)

break;

else {

currentLine = "";

}

}

else {

currentLine += c;

}

Serial.println(currentLine);

最后是,執(zhí)行結(jié)果的顯示~交互界面我采用三種箭頭的躍動(dòng)顯示指明方向~這個(gè)動(dòng)畫的制作原理,是利用了我之前的一片帖子里的Python代碼。復(fù)雜動(dòng)畫采用逐幀解算再調(diào)試時(shí)間間隔,簡(jiǎn)單的動(dòng)畫采用了直接偏移的方法。具體的解算代碼見:FireBeetle開箱測(cè)評(píng)——借助DF驅(qū)動(dòng)庫實(shí)現(xiàn)我的LEDMatrix玩法大家可能會(huì)好奇一代的功能,其實(shí)是用來再騎行過程中相互指路的小神器,畢竟本寶寶是一個(gè)不甘寂寞的人 一個(gè)人騎車多沒意思~

在手機(jī)端定位選擇目的地,然后連接iBikeTo就可以發(fā)車?yán)?!合理的?yīng)用LED Matrix和WiFi功能打造你個(gè)性化的出行神器吧?。˙LE正在研究,完成后就可以實(shí)現(xiàn)一代二代demo的正式合并啦。)其實(shí),我還在給怎么給iBikeTo設(shè)計(jì)一個(gè)好看些外殼,畢竟。。3D打印機(jī)都買好了~再不搞點(diǎn)事情,真的就要變成寂寞宅啦~哈哈哈!

最后的最后,附贈(zèng)上我的ESP-32代碼!microPython是個(gè)特別強(qiáng)的開發(fā)工具!我還有加油加油!為脫離寂寞宅、爭(zhēng)做技術(shù)牛而fighting~當(dāng)然!要感謝DFRobot給我這次寶貴的機(jī)會(huì),用美美的板子充分實(shí)現(xiàn)了自己的小夢(mèng)想??!

FireBeetle,你值得擁有~~~

*歡迎轉(zhuǎn)發(fā)朋友圈。如需轉(zhuǎn)載,請(qǐng)注明出處和原作者。

| 懂植物情感的機(jī)器喵 |

1.《共享單車導(dǎo)航神器:iBikeTo讓騎行“零停頓”》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無關(guān),侵刪請(qǐng)聯(lián)系頁腳下方聯(lián)系方式。

2.《共享單車導(dǎo)航神器:iBikeTo讓騎行“零停頓”》僅供讀者參考,本網(wǎng)站未對(duì)該內(nèi)容進(jìn)行證實(shí),對(duì)其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。

3.文章轉(zhuǎn)載時(shí)請(qǐng)保留本站內(nèi)容來源地址,http://f99ss.com/fangchan/8138.html