Arduino和ESP32 / ESP8266

被牢牢抓住,無(wú)法喘氣。這是我這幾天真實(shí)的感受。

咱從頭說(shuō)起,這一切都是從我成功的用Python調(diào)用電紙屏的驅(qū)動(dòng),隨心所欲顯示內(nèi)容開(kāi)始。。。

一塊電紙屏,一個(gè)驅(qū)動(dòng)板,一個(gè)Pi Zero,當(dāng)然,還有一個(gè)相框把他們組合在一起,對(duì)了還有一個(gè)超薄充電寶。這幾樣?xùn)|西非常和諧,直到我連續(xù)使用2天后,才發(fā)現(xiàn)原來(lái)2萬(wàn)毫安的充電寶也只能硬撐2天,不論我怎么精簡(jiǎn)服務(wù)讓Pi 0省電都達(dá)不到像Kindle一樣一個(gè)月不用充電。

那就別用Pi這樣的微電腦了唄。然后我發(fā)現(xiàn)了ESP32這個(gè)東西,電紙屏的廠商把它和自己的驅(qū)動(dòng)板焊接在一起。

起初,一切都蒙逼,比如:

廠商給的板子使用ESP32芯片,支持Arduino,焊接好排線了。這個(gè)東西需要Arduino UNO板子才可以用么?

答案是不用,它自己就都能干了,之所以焊接排線,是為了能和支持Arduino的板子插在一起,獲得更好的計(jì)算性能或者與其他外設(shè)聯(lián)合使用,比如:當(dāng)氣溫低了,電動(dòng)小車自動(dòng)開(kāi)到你面前,上面的電紙屏顯示出四個(gè)大字:你也冷吧?

這就需要:一個(gè)Arduino UNO板子充當(dāng)主板和主CPU,溫度傳感器負(fù)責(zé)觸發(fā)事件,板子電路驅(qū)動(dòng)小車馬達(dá),板子上的攝像頭觀察前方,以便確定在它面前的是你,而不是個(gè)桌子,停住后,Arduino UNO發(fā)指令給電紙屏驅(qū)動(dòng)板,寫(xiě)下四個(gè)大字。

ESP32沒(méi)有插SD卡的地方呢?Arduino寫(xiě)的代碼傳到ESP32上以后,斷電后是不是什么都沒(méi)了?

答案是不會(huì),可以想象成Arduino“燒錄”代碼在ESP32。

在Ubuntu上安裝Arduino復(fù)雜么?

不用找各種攻略了,什么apt-get啥的,1.8.9版本的IDE直接下載一個(gè)Linux64代碼,解壓./install,比windows還簡(jiǎn)單。

怎么把板子驅(qū)動(dòng)裝在Arduino IDE里面。

電紙屏廠商給的方法特別費(fèi)勁,又是自己拷貝,又是解壓縮,又是運(yùn)行命令的。其實(shí)呢,在“首選項(xiàng)”->“附加開(kāi)發(fā)板管理器網(wǎng)址”填上:https://dl.espressif.com/dl/package_esp32_index.json,然后到”工具“->“開(kāi)發(fā)板管理”,找ESP32,點(diǎn)安裝,就全有了,這多好!

我的Port是灰色的!

WIndows上插上板子以后,自動(dòng)給com7口,爽!咋Ubuntu上死活沒(méi)有呢?查了文檔,有人說(shuō):必須sudo著運(yùn)行Arduino IDE,有人說(shuō)查看自己的USB設(shè)備看看是哪個(gè),有人說(shuō)自己把USB設(shè)備映射com端口,讓我一度覺(jué)得Linux就得DIY,不可能像Windows一樣那么爽。

結(jié)果我錯(cuò)了,因?yàn)槲襏SB鼠標(biāo)插來(lái)插去的,把USB端口都占用了,重啟一下系統(tǒng),重啟一下就好了。再說(shuō)一遍,USB映射Com這事,Ubuntu也是自動(dòng)的,別折騰了,把你那自從去年就沒(méi)重啟過(guò)的Ubuntu重啟一下吧,又起不壞?

好了,過(guò)了前面的幾個(gè)坑,下面開(kāi)始正式寫(xiě)代碼。


電紙屏廠商有一個(gè)例子:

例子

說(shuō)明寫(xiě)的好:配好了以后,燒錄。板子上電后,會(huì)自己?jiǎn)?dòng)HTTP服務(wù),你打開(kāi)瀏覽器,上傳圖片,立刻完美呈現(xiàn)。

是不是特完美?是不是特美好?總覺(jué)得哪兒不對(duì)。

我想了一天,終于明白了問(wèn)題出在哪兒:如果我把這個(gè)東西作為禮物送給內(nèi)誰(shuí),那我就得知道他家WIFI密碼(當(dāng)然我是可以知道的),但是他不能改,改了我還得重新燒錄。這不是有點(diǎn)兒被動(dòng)了?

讓使用者自己可以配置WIFI。這是必須有的。

最初想到的方案沒(méi)有啥新意,和很多智能家居設(shè)備一樣,您必須先安裝一個(gè)APP,在App中通過(guò)藍(lán)牙連接設(shè)備,然后把WIFI信息傳過(guò)去。暫且叫他方案一。

方案一接著帶來(lái)三個(gè)問(wèn)題:

1、咋開(kāi)啟ESP32藍(lán)牙;

2、咋寫(xiě)一個(gè)Android App;

3、咋保存WIFI信息,保存在個(gè)什么地方;

開(kāi)啟ESP32藍(lán)牙

下載BlufiForXXX,裝上這個(gè)App,然后,燒錄這個(gè)ESP32_BLE_UART_Demo.ino,你就能連接藍(lán)牙,并且傳遞數(shù)據(jù)了。

寫(xiě)一個(gè)安卓App這個(gè)不是個(gè)事,這里不是有源碼么?改一個(gè)就得了

把WIFI信息保存在一個(gè)什么地方,然后下次啟動(dòng)的時(shí)候讀一下。

這個(gè)例子就知道怎么保存了

這下三個(gè)問(wèn)題都解決了,剩下的就是把他們連在一起啦。

可但是!無(wú)意中找到了另一個(gè)方法,據(jù)說(shuō)是TI先研究出來(lái)的,叫:smartconfig,啥玩意呢?

首先,你的手機(jī)還是需要一個(gè)App,這個(gè)App負(fù)責(zé)把你家WIFI信息加密后廣播出去,ESP32開(kāi)啟smartconfig模式以后,就會(huì)滿大街找這個(gè)廣播,找到后解密,自己配自己。這樣一來(lái),就不再需要什么啟動(dòng)藍(lán)牙、用藍(lán)牙傳聯(lián)網(wǎng)信息等等了,如此一來(lái),ESP32就可以換成ESP8266了,這兩個(gè)東西的最大區(qū)別就是ESP32帶藍(lán)牙模塊,當(dāng)然也貴點(diǎn)兒。

代碼很簡(jiǎn)單:

是不是特別美好?是不是特別神奇?把這段放在setup()里面,板子上電就執(zhí)行,多好!

主席說(shuō)過(guò),要想直到驢子的滋味,必須自己先嘗嘗。試了一下才知道這樣很坑,因?yàn)槊看伟遄由想姷臅r(shí)候,都會(huì)smartconfig一下,那豈不是每次只要電量一用光,就得重新配一下網(wǎng)?

于是還是回到那個(gè)老問(wèn)題,聯(lián)網(wǎng)信息怎么保存?而且用smartconfig還帶來(lái)了個(gè)附加問(wèn)題:聯(lián)網(wǎng)這段代碼是也是自己寫(xiě)的:WiFi.begin(ssid, password); 自己寫(xiě)藍(lán)牙連接、傳數(shù)據(jù)、保存,在需要的時(shí)候,我把ssid和password讀出來(lái)填上就行了。可用了smartconfig以后,填都沒(méi)地方填!

還好,一個(gè)老頭子寫(xiě)了完整的代碼(起碼頭像看著是個(gè)老頭子),邏輯是這樣的:如果網(wǎng)不通,就啟動(dòng)smartconfig,然后把WIFI信息保存起來(lái)下次用;下次的時(shí)候直接一上電,獲取保存的WIFI信息,網(wǎng)通了,那就不啟動(dòng)smartconfig了。

邏輯清晰合理吧?代碼在這兒。

到此,完美的解決了“藍(lán)牙配網(wǎng)”這事!你能想到么?我找到了更好的方法,叫AP配網(wǎng),原理是這樣的:

如果上電后沒(méi)連上網(wǎng),就啟動(dòng)一個(gè)AP,ESP32自己當(dāng)Wifi熱點(diǎn),你用手機(jī)、電腦連接這個(gè)以后,訪問(wèn)一個(gè)地址,一般是192.168.4.1,然后把你家WIFI信息填上去提交。

這不是更完美!這不是更完美!用戶連App都不用裝,而且連藍(lán)牙都不用有,ESP8266就搞定!

代碼在這里,想著到在“工具”->“庫(kù)管理器”找一個(gè)叫IotWebConf的東西,你也可以看看他的例子代碼。

然后,AP配網(wǎng)這事就這么神奇的完成了。這個(gè)庫(kù)還有一個(gè)牛逼之處,在WIFI設(shè)好以后,每次上電仍然有10秒鐘的間隙可以連這個(gè)熱點(diǎn),只要有人連上,不論WIFI以前是否設(shè)好,都會(huì)再次進(jìn)入設(shè)置頁(yè)面等著,什么時(shí)候退出熱點(diǎn),什么時(shí)候再次聯(lián)網(wǎng)。

再說(shuō)幾個(gè)坑:

省電

要想省電就睡眠唄,一共有三種喚醒模式:外部觸發(fā)、觸摸觸發(fā)、時(shí)間觸發(fā)。

外部觸發(fā):你要短接兩個(gè)針腳,一般來(lái)說(shuō),弄個(gè)按鈕接上,按一下就醒了;

觸摸觸發(fā)原理一樣,只不過(guò)不是按鈕,是觸摸屏,屏幕插上以后,摸一下屏幕就醒了;

這兩種我都用不上,我能用的是時(shí)間觸發(fā),就是睡覺(jué)前說(shuō)好了,你睡多久?到點(diǎn)自己醒。代碼是這樣的:

就兩句,簡(jiǎn)單不

從網(wǎng)上抓取圖片以后保存在內(nèi)存中

參考這個(gè)

最后,告訴你一個(gè)最牛逼的:

有時(shí)候ESP32板子插插拔拔的,Arduino這個(gè)IDE每開(kāi)一個(gè)工程就新開(kāi)一套窗口,很容易Port就被占用了,你想燒錄時(shí)候發(fā)現(xiàn),連不上!死活連不上!

這時(shí)候,你就需要:fuser /dev/ttyUSB0,看看到底有沒(méi)有人占著你這個(gè)USB(當(dāng)然你有可能是USB1,USB2什么的),都試試唄。如果發(fā)現(xiàn)有SB占這你這個(gè)USB,但是死活找不到那SB了,就把這個(gè)端口kill了完事。

你覺(jué)得這東西有意思么?

這兩天折騰下來(lái)我覺(jué)得硬件編碼挺好玩的,它不屬于那種需要架構(gòu)師歪著腦袋想復(fù)雜的結(jié)構(gòu)和邏輯,而是一個(gè)一個(gè)小代碼,100行就算巨型程序了,像那個(gè)老頭子愣寫(xiě)了小200行代碼吶。

話說(shuō)回來(lái),人家寫(xiě)這幾十行代碼,內(nèi)小車真追著你走啊,你還跑不過(guò)它;你這架構(gòu)師弄的東西是像宇宙般的復(fù)雜,但不是還在你這霍金一樣的腦子里么?別人誰(shuí)看的見(jiàn)呢?人看見(jiàn)最多的就是你歪著個(gè)腦袋,面帶微笑。偶爾關(guān)心你的,可能會(huì)上去輕輕擦去你嘴角流出的口水。

另外,你看這怎么樣?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容