0%

在Esp8266上使用JavaScript语法开发 以及 webide集成开发环境

这个坑是真的多如牛毛。。。
本文基于macos 当然win更方便

在某esp8266群里 遇到有人说 js效率怎么怎么低 比Python库少多少之类的指责。对方可能是一个学生,就辩了几句。
首先此JavaScript 非浏览器的JavaScript。micropython也非Python。具体可以看我写的 micropython( Python) espruino(JavaScript) nodemcu(lua) 之间的初步对比

第一部 下载固件
http://www.espruino.com/Download
因为我的是512k的 所以直接下载
https://www.espruino.com/binaries/espruino_2v08_esp8266_combined_512.bin
其他的自己选择,还有分开烧录的方法
bin文件 1024KB( 512KB+ 512KB) 8Mbit 2048KB( 512KB+ 512KB) 16Mbit 4096KB( 512KB+ 512KB) 32Mbit
boot_v1.6.bin 0x0 0x0 0x0
espruino_esp8266_user1.bin 0x1000 0x1000 0x1000
esp_init_data_default.bin 0xFC000 0x1FC000 0x3FC000
blank.bin 0xFE000 0x1FE000 0x3FE000
官网说明
http://www.espruino.com/ESP8266_Flashing
烧录工具 随意,官网是用的esptool.py 我是用的nodemuc-pyFlasher 结果出错
然后因为没装esptool 所以换了win下的 flash_download_tools 在 乐鑫官网 有下载
https://www.espressif.com/zh-hans/support/download/other-tools
单一文件
直接烧录到 0x0 就好了
CrystalFreq选择26M SPI SPEED 选40MHz SPI MODE选择QIO flash size选择对应的,我这个512的选4M 其他不勾选,先擦除一次 或者烧写一个空白的文件,然后点Start开始 等待完成。

烧录后,用串口工具 打开,选择 115200,因为在win下烧写的,所以顺手用sscom串口调试工具,这里发现又一个神坑。就是sscom5.13.1 打开串口后 开发板显示的是乱码,需要先随便选一个倍率,然后再选115200才可以

可以看到 就好了
’‘’


| |___ _ _ _ ||___ _
| |_ -| . | _| | | | | . |
|__
|| || |||||__|
|_| espruino.com
2v08 (c) 2019 G.Williams
Espruino is Open Source. Our work is supported
only by sales of official boards and donations:
http://espruino.com/Donate
Flash map 512KB:256/256, manuf 0x20 chip 0x4016
WARNING: * Your flash chip does not match your flash map *

’‘’
这里有一行警告信息,暂时不知道有什么影响,部分串口工具前面会显示乱码 不用管它。后面能显示版本号就ok了。

然后安装官方推荐的 webide 不得说挺好用的 ,就是全英文 有点。。。
安装方法 首先电脑上有chrome 然后有梯子可以访问 chrome 商店。
http://www.espruino.com/Web+IDE 这里有说明
用Chrome打开商店地址
https://chrome.google.com/webstore/detail/espruino-web-ide/bleoifhkdalbjfbobjackfdifdneehpo
安装 不多说了
以后打开Chrome 地址栏输入 chrome://apps/ 就可以找到了。当然 macos下 保留到程序坞就好了

在连接之前,我们先确保com口是连接到macos的 而不是虚拟机里面。
然后最最重要的一点,点击右上角的齿轮按钮(设置),然后点击左右的 COMMUNICATIONS 找到 BaudRate 改成115200
这个我很服,因为英文不好,尤其是大写的英文字母更容易迷糊,更想不到官网出的ide不能自动识别倍率。所以一度懵逼了很久。
设置好后 回到webide主界面,点右上角 电源插头的按钮,选择对应接口。重启一次开发板。ok了

这里有 webide的几个说明
http://www.espruino.com/Quick+Start+Code

测试一下.这里又一个坑,我一度以为 是右侧代码 点中间的上箭头 然后就可以运行的,后来不是那么回事。。。。

还是点左侧 那个带叉号的 左箭头(我以为是退出 关闭或者什么的,结果是切换视图) 看到光标闪烁了。输入
process.memory();
回车
’‘’

process.memory();
={ free: 1671, usage: 29, total: 1700, history: 7,
gc: 0, gctime: 1.56, blocksize: 16 }

’‘’
再试试
var wifi = require(“Wifi”);
wifi.connect(“wifi名字”, {password: “wifi密码”});
然后神坑又出现了,不支持中文,先试试连接手机热点
wifi.connect(“Lei”, {password: “11111111”},function(err){if(err)console.log(err);else console.log(“connected!”);})
提示=undefined
过一会又提示no_ap_found的话就是wifi名字不对
提示connected! 就连接成狗了,大概需要1-15秒。
然后查看一下
wifi.getStatus()
wifi.getIP()
返回json格式的数据 很舒服哦
其他还有

wifi.save() 好像要保存 和lua以及mpy不一样,不保存重启就嗝屁
重启后 获取ip的话使用
require(“Wifi”).getIP();

webide 还有一个坑 就是 有时候 无法输入,要等一会儿,一直到底部提示 SENT才可以

espruino有一个digitalPulse 函数,是操作gpio的,比如

digitalPulse(D2,0,10000)
他会拉低gpio2 然后维持10秒,然后再拉高。不管之前是什么状态。
暂时不知道是否影响后面的程序制定,但同一个口的话 只能顺序操作
我们使用 digitalWrite试试点亮一下 ESP8266 12F的核心板载led
GPIO02 对应的nodemcu的D4
这里要用D2 对应的GPIO02 而不是D4
官方写法
http://www.espruino.com/Reference#l__global_digitalWrite
function digitalWrite(pin, value)
参数
pin - The pin to use

value - Whether to pulse high (true) or low (false)

digitalWrite(D2, true);
digitalWrite(D2, false);
或者
digitalWrite(D2, 1);
digitalWrite(D2, 0);

现在简单写一个 拉低GPIO0 第一次打开LED 第二次关闭LED的代码试试,也就是要用 digitalRead(pin)了
还有按键的响应
setWatch(function, pin, options)

经典的js代码
function toggle() {
if(digitalRead(D2)==1){
digitalWrite(D2,0);
print(“open led”);
}
else{
digitalWrite(D2,1);
print(“close led”);
}
}
setWatch(toggle,D0,{repeat:true,edge:’rising’,debounce:100}); //100ms防抖

//不防抖 setWatch(toggle,D0,{repeat:true,edge:’rising’});
但是发现 digitalWrite 后 digitalRead依旧是1
而且中间我如果再次 digitalRead(D2) 的话,D2 会改成高电平 也就是说 digitalRead(D2)会读取初始状态并且重置到初始状态
因为刚刚开始鼓捣也没有去研究更多,所以临时解决办法 就是另外引入一个变量了
以后再研究
var temp = 1;
function toggle() {
if(temp ==1){
digitalWrite(D2,0);
print(“open led”);
temp = 0;
}
else{
digitalWrite(D2,1);
print(“close led”);
temp = 1;
}
}
setWatch(toggle,D0,{repeat:true,edge:’rising’,debounce:100}); //100ms防抖

analogRead(D2) 去读电压

print(digitalRead(D2));
digitalWrite(D2,0);
print(digitalRead(D2));