关于Espruino

什么是Espruino?

Espruino是一款适用于微控制器的JavaScript解释器,可以快速轻松地进行嵌入式软件开发。Espruino解释器是可在各种不同的微控制器上运行的开源固件,购买预装有解释器的Espruino板是最容易上手的方式。
Espruino本身不仅是解释器固件或硬件,还有 Web IDE,命令行工具,文档,教程和模块,它们构成了嵌入式软件开发的完整解决方案。

为什么要使用JavaScript?

我们想使用一种语言:

  • 具有与C相同的基本形式,因此简单的代码看起来类似于Arduino代码
  • 鼓励基于事件的编程(以降低功耗)
  • 广泛使用,在线上有很多学习资料
  • 进行解释,并允许在解释器运行时修改函数(与某些其他语言不同,JavaScript将函数视为变量)

    Espruino 100%JavaScript兼容吗?

    Espruino实现了完整JavaScript规范的(大)子集,但还不是100%完整。我们的目标是使我们确实实现的所有功能都符合标准。请查看Espruino功能表以获取Espruino支持的语言功能的完整列表。
    尽管我们实现了许多JavaScript的标准库,但是缺少了一些未使用的部分,因为它们没有足够的内存来包含它们。
    实际上,如果您正在编写普通的JavaScript代码,那么您不太可能会注意到Espruino与普通JavaScript之间的任何区别。如果您确实遇到任何问题,请在论坛中发布代码示例,如果它是错误或我们认为人们会使用的功能,我们将尝试予以修复。
    更多问题参见官方文档:http://www.espruino.com/FAQ

    Espruino语言快速入门

    现在您可以试着在Espruino IDE的左侧或命令行界面输入以下命令,然后在后面按’Enter’键,它们将被立即执行(您也可以将它们复制并粘贴到终端窗口中):

    1. 1+2

    上面的命令结果应该返回=3
    如果没有,可能是终端应用程序已经输入了一些其他文本。按Ctrl-C键清除,然后再试一次。
    每次你输入一个命令并按’enter’键,它将立即被执行。如果命令没有执行结果(例如,如果你执行的函数没有返回值),则显示 =undefined

    引脚输出

    1. digitalWrite(LED1,1)

    注意上面代码中的大写字母——JavaScript(以及Espruino)区分大小写,因此在此处digitalwrite将不起作用,而digitalWrite可以。
    如果一切顺利,将显示=undefined,表示没有返回值,但是板子上的LED1灯会亮起。这就是控制开发板引脚输出电压(1=3.3V,0=0V)的方法。你可以使用任何引脚名称来代替LED1,例如A1B5(引脚名称和查看开发板的引脚图:)。Espruino语言快速入门 - 图1
    如果上面的命令出现错误提示:Uncaught ReferenceError: "LED1" is not definedLED1``var LED1 = you_pin_name?(LED1未定义),那么您可能没有使用官方的开发板——你可以在引脚上附加一个LED,然后键入var LED1 = 引脚名 自己定义一个LED1。

    修改命令

    现在,按 “向上 “箭头。这将显示你已运行的最后一条命令,并再次显示digitalWrite(LED1,1)文本。按左移键直到光标移动到1的后面,按退格键,然后按0。现在看起来应该是这样的。

    1. digitalWrite(LED1,0)

    现在,您可以将光标移动到该行的末尾(使用右移键或’end’键),然后按Enter执行该命令(这将关闭LED)。
    只有在光标位于行的末尾时按Enter键,才会执行该命令,否则只是换行(您可以按Backspace键回退并删除换行)。

    创建变量

    接下来,我们需要创建一个变量。例如:

    1. var on = false

    然后按’enter’键 ——这将创建一个新的变量,并将其值设置为布尔false。

    编写函数

    您现在可以编写一个函数。输入以下内容:

    1. function toggle() {
    2. on = !on;
    3. digitalWrite(LED1, on);
    4. }

    当你在第一行末尾按’Enter’键时,命令并没有被执行,相反,Espruino只是创建了一个新的行,这是因为行末有一个未闭合的大括号{。而如果在行的末尾不是未闭合的括号,那么函数将被立即执行,如果你不想把你的括号放在行尾而是放到新的行中,可以在function toggle()行的末尾按Alt+Enter这将换行而不是执行命令(不建议这样做)。
    如果你不小心创建了一个新行怎么办?只要按退格键就可以了。或者如果你完全搞乱了,只想重新开始,按Ctrl+C键,你输入的文字就会被删除。
    一旦你在最后一行后按了’enter’键,就会在终端中显示出=function () { ..... }。这意味着你的函数(名为toggle)已经定义好了。那么它的作用是什么呢?on变量存储了一个值,这个值可以是true或false。命令on = !on;执行后,如果 on 的值之前是false,那么就会变成true,如果之前是true,那么就会变成false(即:将on变成非on)。
    下一行是用改变后的 on 的值(truefalse)控制引脚LED1的电平输出。每当你使用toggle函数时,on的值就会在true和false之间切换,从而使LED打开或关闭。

    调用函数

    现在我们可以尝试一下,键入以下内容,然后按Enter键:

    1. toggle()

    如果你想再次运行它,只需点击向上箭头(在历史记录中找到该命令),然后按’enter’键。每次运行它,LED会从开到关,或者相反。

    创建定时器

    现在输入:

    1. var i = setInterval(toggle, 500)

    这将每隔500ms调用一次切换函数(也即,一秒钟两次),所以LED会开始闪烁。新的变量i(由var定义)是对我们创建的定时器的引用——这在后面修改定时器会很有用!

    修改函数

    但是,如果我们想改变切换函数怎么办?
    输入如下:

    1. edit('toggle')

    您也可以通过单击向上箭头直到返回定义toggle的命令来获得类似的效果。现在函数显示出来了,按左箭头将光标向后移动,开始编辑函数。在末尾添加一行新的行,使其看起来像这样(要在digitalWrite之后添加一行,将光标移动到行的末尾,然后按’enter’键)。

    1. function toggle() {
    2. on = !on;
    3. digitalWrite(LED1, on);
    4. digitalWrite(LED2, !on);
    5. }

    现在,用方向键将光标右移到最后一行的末尾(或按’page down’),然后按’enter’键。这将执行该命令,这将重新定义函数功能 - 现在LED1会亮,然后是LED2,然后是LED1 - 如此循环。

    修改定时器

    现在,您可以使用以下命令更改指示灯闪烁的速度:

    1. changeInterval(i, 200)

    这与您最初调用setInterval( ... , 200)时相同- 现在每200毫秒(每秒5次)调用一次toggle

    清除定时器

    如果您想让灯光停止闪烁-只需输入以下内容:

    1. clearInterval(i)

    注意,如果键入clearInterval()而不加任何参数,可以清除所有的定时器。

    程序复位

    如果您想完全从头开始并清除您所做的所有事情,只需键入:

    1. reset()

    如果您按下板子上的重置按钮(如果您的板子有的话),Espruino 也会重置。但是我们不建议这样做 - 在大多数电路板上,这也会重置USB/蓝牙连接,所以您可能需要重新启动您的终端应用程序,或者在某些情况下,甚至是拔掉插头重新插入设备。

    保存程序

    如果你使用重置按钮关闭或重置Espruino,它将丢失你写的所有代码。您可以使用save()命令保存Espruino的状态,这样就不会发生这种情况。
    save()命令会保存引脚和片上外设的当前状态,以及所有的函数、变量、表和定时器。但是你之前输入的命令将不会被再次执行。

    启动事件

    如果你想在Espruino启动时执行一些代码(例如你可能需要初始化一些外部硬件,如LCD),你可以使用E上的init事件:

    1. E.on('init', function() {
    2. digitalWrite([LED1,LED2], 2);
    3. setTimeout("digitalWrite([LED1,LED2], 1);", 1000);
    4. setTimeout("digitalWrite([LED1,LED2], 0);", 2000);
    5. });

    注意:您可以添加第二个处理程序,以在Espruino启动时执行其他操作,只需再次调用E.on('init', ...)即可。如果您编写了一个名为onInit的函数,那么该函数也会自动执行。
    上面的代码使用了Espruino中一些以上未介绍的额外功能:

  • 你可以向digitalWrite传递一个引脚数组(也适用于digitalRead)。如果你这样做,你所提供的值将被视为二进制值,最小的位将被送到数组中最右边的引脚,以此类推。

  • 如果你将一个字符串传递给setTimeoutsetInterval,它将被当作一个函数来处理,并在一定时间段后执行。

至此您已经知道如何使用Espruino了。

其他参考资料

如果您已经设法保存了一些东西到Espruino,导致它无法工作,不用担心 - 您可以很容易地恢复它。只需查看故障排除页面。
在Espruino IDE的帮助菜单里有一个循序渐进的新手入门训练,强烈建议新手尝试一下:
Espruino语言快速入门 - 图2

更多信息请参考官网文档(英文):http://www.espruino.com/Quick+Start+Code