ESP8266 联网后执行在线代码

espruino/esp8266 加载远程代码

今天玩esp8266的时候突然想到, 是不是可以直接运行线上代码, 这样的话就可以灵活的配置esp8266执行什么操作了, 也不用每次更新代码都要把设备拆下来搞到电脑上去下载程序, 因为本身esp8266就需要联网工作, 所以就想到了联网后获取在线代码进行执行, 如果代码更新只需要重启设备就可以了, 不用每次都插到电脑上去下载代码. 后来翻了一下espruino的文档发现有提供加载线上模块的方法, 于是就实现了一下, 下面是加载远程代码的逻辑.

烧录espruino固件并下载代码

  1. 配置wifi和线上代码地址 (注意需要使用http协议, 不支持https协议)
  2. 将代码写入esp8266
  3. 编写线上代码
  4. 重启设备
  5. 重启后设备就会自动联网和拉取指定的代码并执行了.
  1. var wifi = require('Wifi');
  2. var app = {
  3. config: {
  4. wifi: {
  5. ssid: '你的wifi名称',
  6. password: '你的wifi密码'
  7. },
  8. // 你的线上代码地址
  9. online: 'http://espjs.admin-ui.cn/ota.js'
  10. },
  11. init: function () {
  12. this.wifi();
  13. },
  14. wifi: function () {
  15. var self = this;
  16. console.log('wifi connecting...');
  17. wifi.connect(self.config.wifi.ssid, { password: self.config.wifi.password }, err => {
  18. if (err) {
  19. console.log('wifi connect error: ', err);
  20. return;
  21. }
  22. wifi.getIP(function (err, result) {
  23. self.onWifiConnected(result);
  24. });
  25. });
  26. },
  27. run: function () {
  28. this.init();
  29. },
  30. onWifiConnected: function (result) {
  31. console.log('wifi connected: ', result);
  32. this.loadModule(this.config.online);
  33. },
  34. loadModule: function (url, callback) {
  35. if (url.substr(0, 4) !== 'http') {
  36. url = 'http://www.espruino.com/modules/' + url + '.min.js';
  37. }
  38. require("http").get(url, function (res) {
  39. var contents = "";
  40. res.on('data', function (data) { contents += data; });
  41. res.on('close', function () {
  42. Modules.addCached(url, contents);
  43. if (callback) callback();
  44. });
  45. }).on('error', function (e) {
  46. console.log("ERROR", e);
  47. });
  48. }
  49. };
  50. app.run();

案例

比如我这里用了自己的域名, 线上代码是一个获取温湿度和显示的一个例子.
代码地址: http://espjs.admin-ui.cn/ota.js

  1. var demo = {
  2. config: {
  3. dht: {
  4. pin: NodeMCU.D1
  5. },
  6. oled: {
  7. scl: NodeMCU.D5,
  8. sda: NodeMCU.D4,
  9. width: 128,
  10. height : 64
  11. },
  12. led: {
  13. pin: NodeMCU.D2,
  14. }
  15. },
  16. device: {
  17. dht: null,
  18. oled: null,
  19. led: null
  20. },
  21. init: function () {
  22. this.led();
  23. this.oled();
  24. this.dht(2000);
  25. },
  26. led: function () {
  27. var self = this;
  28. app.loadModule('http://espjs.admin-ui.cn/libs/led.js', function (LED) {
  29. self.device.led = new LED(self.config.led.pin);
  30. self.device.led.close();
  31. });
  32. },
  33. dht: function (time) {
  34. var self = this;
  35. app.loadModule('DHT11', function (dht11) {
  36. self.device.dht = dht11.connect(self.config.dht.pin);
  37. setInterval(function () {
  38. self.device.dht.read(function (result) {
  39. self.onDht(result.temp, result.rh);
  40. });
  41. }, time);
  42. });
  43. },
  44. oled: function () {
  45. var self = this;
  46. var i2c = new I2C();
  47. i2c.setup({
  48. scl: this.config.oled.scl,
  49. sda: this.config.oled.sda,
  50. bitrate: 100000
  51. });
  52. var config = {
  53. width: this.config.oled.width,
  54. height: this.config.oled.height
  55. };
  56. app.loadModule('SH1106', function (ssd1306) {
  57. self.device.oled = ssd1306.connect(i2c, function () {
  58. self.onOledInit();
  59. }, config);
  60. })
  61. },
  62. run: function () {
  63. this.init();
  64. },
  65. onDht: function (temp, rh) {
  66. console.log('Temp is ' + temp + ' and RH is ' + rh);
  67. if (this.device.oled) {
  68. this.device.oled.clear(true);
  69. this.device.oled.drawString('Temp: ' + temp , 40 , 20);
  70. this.device.oled.drawString('RH: ' + rh, 40 , 40);
  71. this.device.oled.flip();
  72. }
  73. },
  74. onWifiConnected: function (result) {
  75. console.log('wifi connected: ', result);
  76. },
  77. onOledInit: function () {
  78. this.device.oled.clear(true);
  79. this.device.oled.drawString("Hello World!", 50 , 40);
  80. this.device.oled.flip();
  81. console.log('oled init finish');
  82. }
  83. };
  84. demo.run();

效果是这样的:

ESP8266 Dev Board 电路图

NodeMCU 引脚对应图


NodeMCU引脚对应图

Espruino单片机上的javascript

  话说一直想用javascript语法写单片机程序, 因为我本身是web开发出身, 太熟悉js语法了, 以至于看到c 或 python都感觉很别扭, 于是就在网上找到了这个espruino, espruino是一个固件, 可以让esp8266等芯片支持使用js语法编程, 大大减少了web人员学习单片机开发的成本, 甚至可以让本身会js的人直接上手, 了解基础api后, 就可以直接开发自己的单片机项目了, 这里是官网: https://www.espruino.com/ , Espruino文档: http://www.espruino.com/Reference#software

  但是, 官网提供的开发工具用着很不习惯, 而且代码都在一个文件中, 很不方便管理.

  于是我就自己根据espruino的api, 自己写了个命令行工具, 可以使用自己熟练的ide, 然后配合命令行工具进行开发, 执行的时候就像nodejs一样方便, 目前这个命令行工具叫espjs, 文档地址: https://www.kancloud.cn/shuai/espjs

espjs开源地址 github: https://github.com/zhaishuaigan/espjs
espjs国内下载: https://fetch.ngapp.net/soft/espjs/espjs-latest.zip

  这里简单说明一下使用方法:

  1. 将此压缩包里面的文件放到不包含空格和中文的目录中. 如 c:\espruino-tools
  2. 配置系统环境变量path, 添加 c:\espruino-tools
  3. 进入项目目录, 在目录的地址栏输入 cmd, 进入命令行.
  4. 输入espjs flash esp01s 烧写espruino固件
  5. 输入espjs upload 上传当前目录中的代码到设备

然后设备就开始运行代码了, 之后修改代码只需要执行upload 即可更新代码,
实例可参考 demo 目录下的文件
index.js 或 main.js 会被当做入口文件加载执行

注意事项:
1: 端口是自动选择的, 插上设备后会自动选择, 如果有多个设备, 可以使用port命令切换设备
2: 默认的波特率是115200, 如需修改请到config.json中修改
3: 如果要增加开发板支持, 请到config.json 的Flash字段追加
4: 模块不支持远程加载, 例如 require(“MQTT”) 会提示模块不存在, 解决方法是 手动下载mqtt模块(espjs modules add MQTT), 然后使用 require(“modules/MQTT.min.js”) 进行引用.

Arduino

简介

  Arduino是一款便捷灵活、方便上手的开源电子原型平台,包含硬件(各种型号的Arduino板)和软件(Arduino IDE)。由一个欧洲开发团队于2005年冬季开发。其成员包括Massimo Banzi、David Cuartielles、Tom Igoe、Gianluca Martino、David Mellis和Nicholas Zambetti。

  它构建于开放原始码simple I/O介面版,并且具有使用类似Java、C语言的Processing/Wiring开发环境。主要包含两个主要的部分:硬件部分是可以用来做电路连接的Arduino电路板;另外一个则是Arduino IDE,你的计算机中的程序开发环境。你只要在IDE中编写程序代码,将程序上传到Arduino电路板后,程序便会告诉Arduino电路板要做些什么了。

  Arduino能通过各种各样的传感器来感知环境,通过控制灯光、马达和其他的装置来反馈、影响环境。板子上的微控制器可以通过Arduino的编程语言来编写程序,编译成二进制文件,烧录进微控制器。对Arduino的编程是利用 Arduino编程语言 (基于 Wiring)和Arduino开发环境(基于 Processing)来实现的。基于Arduino的项目,可以只包含Arduino,也可以包含Arduino和其他一些在PC上运行的软件,他们之间进行通信 (比如 Flash, Processing, MaxMSP)来实现。

发展历程

  Massimo Banzi之前是意大利Ivrea一家高科技设计学校的老师。他的学生们经常抱怨找不到便宜好用的微控制器。 2005年冬天, Massimo Banzi跟David Cuartielles讨论了这个问题。 David Cuartielles是一个西班牙籍晶片工程师,当时在这所学校做访问学者。两人决定设计自己的电路板,并引入了Banzi的学生David Mellis为电路板设计编程语言。两天以后,David Mellis就写出了程式码。又过了三天,电路板就完工了。Massimo Banzi喜欢去一家名叫di Re Arduino的酒吧,该酒吧是以1000年前意大利国王Arduin的名字命名的。为了纪念这个地方,他将这块电路板命名为Arduino。

  随后Banzi、Cuartielles和Mellis把设计图放到了网上。版权法可以监管开源软件,却很难用在硬件上,为了保持设计的开放源码理念,他们决定采用Creative Commons(CC)的授权方式公开硬件设计图。在这样的授权下.任何人都可以生产电路板的复制品,甚至还能重新设计和销售原设计的复制品。人们不需要支付任何费用,甚至不用取得Arduino团队的许可。然而,如果重新发布了引用设计,就必须声明原始Arduino团队的贡献。如果修改了电路板,则最新设计必须使用相同或类似的Creative Commons(CC)的授权方式,以保证新版本的Arduino电路板也会一样是自由和开放的。唯一被保留的只有Arduino这个名字,它被注册成了商标,在没有官方授权的情况下不能使用它。

  Arduino发展至今,已经有了多种型号及众多衍生控制器推出。[2]

平台特点

跨平台

  Arduino IDE可以在Windows、Macintosh OSX、Linux三大主流操作系统上运行,而其他的大多数控制器只能在Windows上开发。

简单清晰

  Arduino IDE基于processing IDE开发。对于初学者来说,极易掌握,同时有着足够的灵活性。Arduino语言基于wiring语言开发,是对 AVRGCC库的二次封装,不需要太多的单片机基础、编程基础,简单学习后,你也可以快速的进行开发。

开放性

  Arduino的硬件原理图、电路图、IDE软件及核心库文件都是开源的,在开源协议范围内里可以任意修改原始设计及相应代码。

发展迅速

  Arduino不仅仅是全球最流行的开源硬件,也是一个优秀的硬件开发平台,更是硬件开发的趋势。Arduino简单的开发方式使得开发者更关注创意与实现,更快的完成自己的项目开发,大大节约了学习的成本,缩短了开发的周期。

  因为Arduino的种种优势,越来越多的专业硬件开发者已经或开始使用Arduino来开发他们的项目、产品;越来越多的软件开发者使用Arduino进入硬件、物联网等开发领域;大学里,自动化、软件,甚至艺术专业,也纷纷开展了Arduino相关课程。[3]

功能

  可以快速使用Arduino与Adobe Flash, Processing, Max/MSP, Pure Data, SuperCollider等软件结合,作出互动作品。 Arduino可以使用现有的电子元件例如开关或者传感器或者其他控制器件、LED、步进马达或其他输出装置。 Arduino也可以独立运行,并与软件进行交互,例如: Macromedia Flash, Processing, Max/MSP, Pure Data, VVVV或其他互动软件…。 Arduino的IDE界面基于开放源代码,可以免费下载使用,开发出更多令人惊艳的互动作品。

硬件组成

主板

Arduino的型号有很多,如

  • Arduino Uno
  • Arduino Nano
  • Arduino LilyPad
  • Arduino Mega 2560
  • Arduino Ethernet
  • Arduino Due
  • Arduino Leonardo
  • Arduino Yún


Arduino Uno
Arduino Uno

Arduino Nano
Arduino Nano


Arduino Yun
Arduino Yun

扩展板

Arduino的扩展板很多,如

  • Ard- uino GSM Shield
  • Arduino GSM Shield Front
  • Arduino Ethernet Shield
  • Arduino WiFiShield
  • Arduino Wireless SD Shield
  • Arduino USB Host Shield
  • Arduino Motor Shield
  • Arduino Wireless Proto Shield
  • Arduino Proto Shield

版权与付费

  为了保持设计的开放源码理念,因为版权法可以监管开源软件,却很难用在硬件上,Arduino决定采用Creative Commons许可。 Creative Commons(CC)是为保护开放版权行为而出现的类似GPL的一种许可(license)。在Creative Commons许可下,任何人都被允许生产电路板的复制品,还能重新设计,甚至销售原设计的复制品。你不需要付版税,甚至不用取得Arduino团队的许可。然而,如果你重新发布了引用设计,你必须说明原始Arduino团队的贡献。如果你调整或改动了电路板,你的最新设计必须使用相同或类似的 Creative Commons许可,以保证新版本的Arduino电路板也会一样的自由和开放。唯一被保留的只有Arduino这个名字。它被注册成了商标。如果有人想用这个名字卖电路板,那他们可能必须付一点商标费用给Arduino的核心开发团队成员。