被牢牢抓住抵卫,無(wú)法喘氣狮荔。這是我這幾天真實(shí)的感受。
咱從頭說(shuō)起介粘,這一切都是從我成功的用Python調(diào)用電紙屏的驅(qū)動(dòng)殖氏,隨心所欲顯示內(nè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)開到你面前,上面的電紙屏顯示出四個(gè)大字:你也冷吧萝勤?
這就需要:一個(gè)Arduino UNO板子充當(dāng)主板和主CPU露筒,溫度傳感器負(fù)責(zé)觸發(fā)事件,板子電路驅(qū)動(dòng)小車馬達(dá)敌卓,板子上的攝像頭觀察前方慎式,以便確定在它面前的是你,而不是個(gè)桌子假哎,停住后瞬捕,Arduino UNO發(fā)指令給電紙屏驅(qū)動(dòng)板鞍历,寫下四個(gè)大字舵抹。
ESP32沒(méi)有插SD卡的地方呢?Arduino寫的代碼傳到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)”->“附加開發(fā)板管理器網(wǎng)址”填上:https://dl.espressif.com/dl/package_esp32_index.json侈贷,然后到”工具“->“開發(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è)坑,下面開始正式寫代碼汽摹。
電紙屏廠商有一個(gè)例子:
說(shuō)明寫的好:配好了以后李丰,燒錄。板子上電后逼泣,會(huì)自己?jiǎn)?dòng)HTTP服務(wù)趴泌,你打開瀏覽器,上傳圖片圾旨,立刻完美呈現(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揭斧、咋開啟ESP32藍(lán)牙莱革;
2、咋寫一個(gè)Android App讹开;
3盅视、咋保存WIFI信息,保存在個(gè)什么地方旦万;
開啟ESP32藍(lán)牙
下載BlufiForXXX闹击,裝上這個(gè)App,然后纸型,燒錄這個(gè)ESP32_BLE_UART_Demo.ino拇砰,你就能連接藍(lán)牙梅忌,并且傳遞數(shù)據(jù)了狰腌。
寫一個(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開啟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)這段代碼是也是自己寫的:WiFi.begin(ssid, password); 自己寫藍(lán)牙連接、傳數(shù)據(jù)徽龟、保存襟齿,在需要的時(shí)候疼阔,我把ssid和password讀出來(lái)填上就行了兔乞“樱可用了smartconfig以后,填都沒(méi)地方填极颓!
還好朱盐,一個(gè)老頭子寫了完整的代碼(起碼頭像看著是個(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)自己醒。代碼是這樣的:
從網(wǎng)上抓取圖片以后保存在內(nèi)存中
最后纠亚,告訴你一個(gè)最牛逼的:
有時(shí)候ESP32板子插插拔拔的,Arduino這個(gè)IDE每開一個(gè)工程就新開一套窗口筋夏,很容易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è)老頭子愣寫了小200行代碼吶。
話說(shuō)回來(lái)获三,人家寫這幾十行代碼旁蔼,內(nèi)小車真追著你走啊锨苏,你還跑不過(guò)它;你這架構(gòu)師弄的東西是像宇宙般的復(fù)雜棺聊,但不是還在你這霍金一樣的腦子里么伞租?別人誰(shuí)看的見呢?人看見最多的就是你歪著個(gè)腦袋限佩,面帶微笑葵诈。偶爾關(guān)心你的,可能會(huì)上去輕輕擦去你嘴角流出的口水犀暑。
另外驯击,你看這怎么樣?