关于
这个项目我最初是看到了这个项目(businesscard-linux)觉得很酷炫,然而没有进一步了解,直到某天看到立创(16块钱做了张ESP8266「名片」V1.2 @Giftina)上有人做了个类似的东西,瞅了瞅觉得应该可行,于是开始尝试照着别人的加上自己摸索着试试。
这个项目的想法还是跟别人的一样定位是一张名片,两边的丝印印上自己的基本信息以及板子的信息。原始的项目是名片插电脑上之后,使用串口执行python或者玩两个小游戏的彩蛋,但是感觉对用户的定位还是偏高(比如我之前就不知道串口是啥),因此我设计的使用场景是上电后将名片变成一个无线接入点(Access Point, AP),其他设备连上指定的WiFi后,通过页面能看到储存在卡片中的内容,通过网页将里面的信息展示出来。
刚好立创上的这个项目使用的是ESP8266,这个芯片的特点是便宜、有WiFi功能、有一些方便开发的固件。有WiFi功能意味着没准可以作为AP或者客户端使用,另外还有4M的flash,里面存网页的需求应该也可以满足。
Demo
外观:
连接卡片WiFi,浏览器打开192.168.1.155
硬件
由于没有硬件基础,板子抄过来之后元件什么的都没有改动(感谢大佬@Giftina的开源)。只改了改丝印上面的文字和二维码就拿去打样了,也体验了一下立创EDA和深圳嘉立创的流程,感觉太强啦。
正面微信二维码中间的头像需要PS处理一下,要不然制版会很奇怪,导入图片的时候就能发现问题。
在立创上改完板子丝印之后可以下载Gerber文件,直接在嘉立创上面下单打样就可以了,其他的元器件都可以在立创上使用BOM单购买。
不过这个板子有个问题,USB接触不太好,所以每次插到USB口之后得塞点卡片固定住防止接触不良,不过使用Type-C口没有这个问题(Type-C口真的是太难焊接了)。
系统
名片本身其实就是一个ESP8266开发板,所以直接使用网上ESP8266的教程就可以了。
一般来说有三种开发方式可供选择:
- NodeMCU + lua
- MicroPython + python
- Arduino + C
这里我选择的是使用lua开发
首先是下载固件然后烧录到卡片里,烧录工具使用的是官方的(flash_download_tool_v3.8.5_1.zip),需要注意的是烧录的时候需要按住Flash键,然后开始烧录的时候按下reset键才会烧录进去,否则会一直等待确认信号。这时候烧录工具控制台一直打印....._____.....____
不过有些板子改了这部分电路,好像不需要按按键也可以烧录了,取决于对应的板子
波特率选择115200(上传代码时候波特率为9600),先点击擦除然后再开始烧录
将固件烧录到卡片里面之后,就可以使用lua进行开发了,这里使用了NodeMCU-Tool这个项目,他能将代码上传到卡片里,执行卡片中的lua文件,以及串口交互等,足够满足这个项目需求。
NodeMCU-Tool支持的指令:
λ node ./nodemcu-tool.js --help
Usage: nodemcu-tool [options] [command]
Options:
-V, --version output the version number
-p, --port <port> Serial port device name e.g. /dev/ttyUSB0, COM1 (default: null)
-b, --baud <baudrate> Serial Port Baudrate in bps, default 115200 (default: null)
--silent Enable silent mode - no status messages are shown
--connection-delay <delay> Connection delay between opening the serial device and starting the communication (default: null)
--debug Enable debug mode - all status messages + stacktraces are shown
--io-debug Enable io-debug mode - logs all serial rx/tx messages (requires enabled debug mode)
-h, --help output usage information
Commands:
fsinfo [options] Show file system info (current files, memory usage)
run <file> Executes an existing .lua or .lc file on NodeMCU
upload [options] [files...] Upload Files to NodeMCU (ESP8266) target
download <file> Download files from NodeMCU (ESP8266) target
remove <file> Removes a file from NodeMCU filesystem
mkfs [options] Format the SPIFFS filesystem - ALL FILES ARE REMOVED
terminal [options] Opens a Terminal connection to NodeMCU
init Initialize a project-based Configuration (file) within current directory
devices [options] Shows a list of all available NodeMCU Modules/Serial Devices
reset [options] Execute a Hard-Reset of the Module using DTR/RTS reset circuit
*
上传代码如果报错的话,先检查设备是否识别出来,如果识别出来了还报错可以看下这个issue https://github.com/AndiDittrich/NodeMCU-Tool/blob/master/docs/Reset_on_Connect.md
nodemcu-tool.cmd upload --connection-delay 300 wifi.lua webserver.lua led.lua init.lua Welcome.html
工具地址:
软件
软件部分就是比较简单的了,在启动的时候负责设置WiFi,启动网站和打开LED灯指示卡片已经启动成功了。
所以有一个启动脚本和三个功能脚本,脚本的大致流程还比较简单,照着网站的API写基本就可以实现,代码放在了GitHub上,功能脚本对应三个文件wifi.lua、webserver.lua、led.lua
然后在init.lua中依次执行这三个文件实现对应的功能,这边的init.lua写的比较复杂
-- 编译并删除源文件
for i = 1, #filename_list do
filename = filename_list[i] .. ".lua"
if file.open(filename) then
file.close()
print("Compile file " .. filename .. "...")
node.compile(filename)
print("Remove file " .. filename .. "...")
file.remove(filename)
end
end
主要是检查下.lua
文件是否存在,存在的话编译成.lc
文件并删除源文件,下次就可以直接执行不用编译了。lua文件原本不用编译也可以直接执行,个人感觉这个编译是针对lua做了优化,方便ESP8266直接运行机器码。
代码都放在了这个项目中 https://github.com/junmo1215/ESP8266-businesscard
主要的代码还比较简单,只有一个led.lua
跟硬件有点关系,这个脚本是用来启动WiFi和网站后,将下面的LED灯点亮的。
通过硬件原理图可以看到这个灯一边是3.3V电平,另一边是GPIO4,所以点亮的方式就是给GPIO4设置低电平就可以了。
不过NodeMCU中IO序号和GPIO序号有一个映射关系,控制的IO口序号是2(https://nodemcu.readthedocs.io/en/release/modules/gpio/)
IO index | ESP8266 pin | IO index | ESP8266 pin |
---|---|---|---|
0 | GPIO16 | 7 | GPIO13 |
1 | GPIO5 | 8 | GPIO15 |
2 | GPIO4 | 9 | GPIO3 |
3 | GPIO0 | 10 | GPIO1 |
4 | GPIO2 | 11 | GPIO9 |
5 | GPIO14 | 12 | GPIO10 |
6 | GPIO12 |
D0(GPIO16) can only be used as gpio read/write. No support for open-drain/interrupt/pwm/i2c/ow.
所以对应led开启和关闭的代码就是
LED_PIN = 2
gpio.mode(LED_PIN, gpio.OUTPUT)
led_on = function()
gpio.write(LED_PIN, gpio.LOW)
end
led_off = function()
gpio.write(LED_PIN, gpio.HIGH)
end
上电后启动WiFi,设置自身IP为192.168.1.155,启动web服务器监听80端口,客户端连接后访问192.168.1.155,实现最终展示效果:
随缘更新系列
电源指示灯等稳定后就关闭(未完成)
目前电源指示灯是长亮的,没有办法通过GPIO控制,感觉开机启动完成之后关闭掉就好了,这个功能需要改PCB
网页使用域名访问(未完成)
目前需要通过一个IP访问到卡片中的网页,IP是内置的,感觉改成域名稍好一点
连接WiFi后自动弹出首页(未完成)
现在连接WiFi后要打开浏览器,输入IP才能显示页面,看能否做到自动弹出