【ESP8266】在ESP8266上使用JavaScript語言開發

前言

博主不知在哪聽說ESP8266支持很多種語言開發的消息,其中包括原生的C語言、Python(MircoPython)、NodeMCU的Lua、JavaScript等等。MircoPython,前面有一篇入門教程了,這一篇則是嘗試在ESP8266上使用JavaScript開發。

開發環境

  • Windows 10 x64
  • NodeMCU(4MB Flash)
  • Espruino 1v92

關于Espruino

Espruino的Logo

Espruino的Logo,咖啡杯代表JavaScript,杯底的引腳代表開源硬件。

Espruino是一種運行在微控制器上的交互式Javascript解釋器,借助這一利器,你可以輕松快速地對微控制器進行編程。

燒寫固件

與使用MircoPython一樣,在ESP8266上使用JavaScript也需要燒寫相關固件。

相關固件可以到這里下載,選擇頁面上的「Download Espruino」即可。

目前最新版本1v92固件下載地址:http://www.espruino.com/files/espruino_1v92.zip

解壓縮后到主目錄下找到「espruino_1v92_esp8266_4mb_combined_4096.bin」,燒寫到0x0地址即可。

之后打開串口工具調到波特率115200,重啟ESP8266,看到打印下面的信息即打印成功。

_____                 _ 
|   __|___ ___ ___ _ _|_|___ ___ 
|   __|_ -| . |  _| | | |   | . |
|_____|___|  _|_| |___|_|_|_|___|
          |_| http://espruino.com
 1v92 Copyright 2016 G.Williams

Espruino is Open Source. Our work is supported
only by sales of official boards and donations:
http://espruino.com/Donate
Flash map 4MB:512/512, manuf 0xe0 chip 0x4016

>

安裝Web IDE

由于使用串口工具開發不太方便,接下來可以安裝相關的IDE。

首先到Github下載Espruino Web IDE壓縮包。(如果不會Github下載,后面也有網盤下載)

EspruinoWebIDE:https://github.com/espruino/EspruinoWebIDE
EspruinoTools:https://github.com/espruino/EspruinoTools

分別將上述兩個壓縮包解壓縮,然后把EspruinoTools壓縮包解壓之后的文件拷貝到Espruino Web IDE解壓目錄的「EspruinoWebIDE-gh-pages\EspruinoTools」,之后就可以在Chrome瀏覽器的擴展程序設置里加載這個Espruino Web IDE了。

加載Espruino Web IDE

啟動該工具,首先進入「設置」頁面,也就是點擊右上角那個「齒輪」圖標,齒輪圖標一般都是設置的意思。

選擇右邊的「Communications(通信)」,設置波特率為115200。

修改波特率

最后回到主頁面,點擊左上角的「連接」圖標。即可通過串口連接ESP8266。

串口連接ESP8266

測試

接下來可以進行測試。

打印內存信息,輸入process.memory()

>process.memory()
={ "free": 1534, "usage": 66, "total": 1600, "history": 53 }
>

打印HelloWorld,可以使用console.log或者print

>console.log("Hello World!")
Hello World!
=undefined
>print("Hello World!")
Hello World!
=undefined
> 

點燈

接下來嘗試控制芯片的引腳,點一下LED燈。

實物圖

根據LED「長正短負」的口訣,為了讓芯片低電平能點亮LED燈,把LED短引腳與NodeMCU的D3引腳短接,LED長引腳接在外面與一個電阻(1K、4.7K或者10K)串聯,該電阻另一端短接3V3。因為有電阻限流,所以LED不小心接反也沒關系。

接好之后,在IDE處輸入digitalWrite(D0,0)即可看到LED燈點亮了,再次輸入digitalWrite(D0,1)LED燈滅了。

為什么前面接的引腳是D3,這里輸入的是D0

這是因為代碼里的D0是指下圖ESP8266的D0,正好對應NodeMCU引腳的D3。

ESP8266引腳

當然為了開發方便,Espruino引入的NodeMCU的引腳,使用NodeMCU.D3即可對相關引腳操作,例如輸入digitalWrite(NodeMCU.D3,0)可以點亮LED燈。

連接WiFi

ESP8266作為一款WiFi芯片,不連接WiFi和咸魚有什么區別?下面嘗試連接WiFi,直接上代碼。

掃描WiFi

首先是掃描WiFi,很奇怪,雖然我的代碼是掃描到了WiFi,但是打印出來的WiFi沒有我手機看到的那么多,不知道是我的代碼問題還是固件的問題。

wifi.scan(function(msg){console.log(msg);}));

連接WiFi

連接WiFi代碼如下。

var wifi = require("Wifi");
wifi.connect("<my-ssid>", {password: "<my-password>"},
   function(err){if(err)console.log(err);else console.log("connected!");})

<my-ssid><my-password>字段修改為你要連的WiFi即可。過了一段時間就會打印connected!

這里也有BUG,不知道是我使用錯誤還是固件的問題。

第一次連接WiFi沒有問題,再連接一次就會出現bad password信息,可是SSID和密碼都沒有動過,有知道內情的朋友可以告訴我,感謝。

查看WiFi信息

可以輸入wifi.getStatus()wifi.getIP()查看WiFi狀態和IP地址。

>wifi.getStatus()
={
  "mode": "sta+ap",
  "station": "off",
  "ap": "enabled",
  "phy": "11n",
  "powersave": "ps-poll",
  "savedMode": "off"
 }
> 

保存WiFi信息

據說調用wifi.save()可以掉電保存WiFi信息,并且可以上電自動連接。我實際測試了一下,沒有達到預期效果。這里固件可能有BUG。

Socket連接實例

連接上了WiFi,下面就要嘗試Socket連接了,我看了一下文檔,似乎只支持TCP Socket,不支持UDP,太可惜了!

下面相關代碼,由于是阿秀自己寫的實例所以可能會寫得不太好,湊合看一下吧。

var net = require('net');
s = net.connect({host:"192.168.0.50", port:12345})  // 配置host和port
s.write("Hello World!");    // 發送數據
s.read();                   // 讀取數據
s.end("Bye bye!");          // 發送數據并關閉連接

寫個小插曲,很坑的是我一開始不知道是用net這個模塊,明明有Socket模塊為什么沒有配置host和port的接口呢,害得我找了很久很久,終于找到了net

掉電存儲代碼

其它相關API可以去查看文檔,不過有一點很重要的就是我們還需要知道如何把自己的代碼寫入芯片,這樣每次重啟芯片后都會運行自己的代碼。

要實現這樣的效果,可以使用全局函數:function onInit()+save()

下面放上示例代碼,每次上電都會打印Hello onInit!字符串。

function onInit() {
    console.log("Hello onInit!");
}

save();
上傳代碼

點擊截圖的左邊那個「Send ti Espruino」按鈕,就可以上傳代碼到芯片,之后會打印下面的信息,表示寫入Flash。

Erasing Flash..................
Writing....
Compressed 25600 bytes to 1743
Checking...

重啟下芯片試試,看看是不是出現Hello onInit!字符串了~

關于Espruino的評價

在瀏覽Espruino官網教程的時候發現了這么一句:「Currently 12KB of flash are reserved to save JS code to flash using the save() function.」很有意思,這句話的意思是說save()函數保留了12KB Flash空間,用來保存JS代碼。當然我這么截取句子可能會造成斷章取義,英文好的可以去看下原文(《Espruino on ESP8266 WiFi》的Saving code to flash小節,末尾有鏈接)。

除了能保存12KB的代碼以外,不能使用UDP是一個非常大的缺點(也有可能是我閱讀文檔不仔細沒找到),MicroPython都能使用UDP,為什么JS不可以呢?

當然,Espruino基本的通信接口UART、IIC、SPI、OneWire都支持了,用起來還是比較方便的。TCP Socket客戶端上面代碼也簡單嘗試了一下,當然也可以建立TCP Socket服務器、HTTP服務器和HTTP請求。JSON是肯定支持的,JSON全稱就是JavaScript對象標記語言嘛,本身就屬于JS。

和MicroPython一樣,Espruino與原生SDK C語言開發相比,在接口方面依舊不能比。不支持SmartConfig和sniffer,不支持IR Control等等。計算性能方面暫時不知道相差多少。

以上僅僅是個人對基于ESP8266的Espruino不完全評價。

相關資料

本教程相關固件和工具下載


本文首發于CSDN:http://blog.csdn.net/yannanxiu/article/details/72861216

由于文章發表之后可能會發現描述不妥的地方,所以文章發布后可能會不定期潤色一下。

最后編輯時間:2017年6月

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容