祭出 ESP8266 神器

0x00.前言

去翻从家带来的硬件小玩楞,突然发现DHT11,只可惜拿DHNSTM32连上并不是很好用,于是自己又网购了一波,顺便终于淘了个8266留给自己用。当初大三比赛用的是51+DS18B20再加pc的组合,后来比赛结束变成了加rpi的组合,结果到现在彻底换成了NodeMCU+DHT11的组合,8266nb!

tb 并不是很贵的说
tb 并不是很贵的说

这里说明一点,NodeMCU中的Node与我们所熟知的Node.js并没有关系,没想到吧hhh,骚年……
但是是基于Lua语言的(写到这里想到了貌似也有基于Python的开发板,py大法好!
2019-8-18 20:54:41又买了一套扔WZ屋里用

19.4 一套
19.4 一套
未拆
未拆
正面
正面
背面
背面

2019-9-21 23:15:41由于中秋节自己带回去的那套扔家里了所以就又又买了一套给自己玩

终于买继电器了
终于买继电器了
正面
正面
背面
背面

0x01.NodeMCU

超简单的物联网开发平台

一款开源快速硬件原型平台,包括固件和开发板,用几行简单的Lua脚本就能开发物联网应用
一、特点:

  1. Arduino一样操作硬件IO
    提供硬件的高级接口,可以将应用开发者从繁复的硬件配置、寄存器操作中解放出来。用交互式Lua脚本,像arduino一样编写硬件代码!
  2. Nodejs类似语法写网络应用
    事件驱动型API极大的方便了用户进行网络应用开发,使用类似Nodejs的方式编写网络代码,并运行于5mm*5mm大小的MCU之上,加快您的物联网开发进度。
  3. 超低成本的WI-FI模块
    用于快速原型的开发板,集成了售价低于10人民币WIFI芯片ESP8266。我们为您提供性价比最高的物联网应用开发平台。

二、开发板

  1. 基于乐鑫esp8266NodeMcu开发板,具有GPIOPWMI2C1-WireADC等功能,结合NodeMcu固件为您的原型开发提供最快速的途径。
  2. 包含usb串口,即插即用
  3. 10 GPIO, 每个都能配置为PWMI2C1-wire
  4. FCC认证的WI-FI模块,内置PCB天线

0x02.官方文档

看到Basics里面的Getting started了吗?三部曲走起

Getting Started aka NodeMCU Quick Start
The basic process to get started with NodeMCU consists of the following three steps.

  1. Build the firmware with the modules you need
  2. Flash the firmware to the chip
  3. Upload code to the device.

上云编译

云端定制固件,你值得拥有!

要用谷歌邮箱,腾讯邮箱可不行
要用谷歌邮箱,腾讯邮箱可不行

注意masterdevgh上的代码库是同步的,因此随着时间的推移会有部分语法的差别(基本上网上的例程直接跑都会报错需要小修小改尤其是带tmr的),在这里暂时选择1.5.4.1-final (frozen, for 512KB flash)
以上是花了半下午的时间Co.摸鱼)远程连接到家里的电脑之后反复编译,下载试出来的(到最后谷歌邮箱接收的固件直接404不让下载也是绝了2333

勾选模块,注意红框
勾选模块,注意红框

DHTHTTP不是默认自带的,

TLS 可以勾上
TLS 可以勾上

编译开始与完成之时会分别收到邮件:

finished
finished
1
2
3
4
5
6
Strike!
You successfully commissioned a NodeMCU custom build from the dev branch. You selected the following 15 modules: cron crypto dht encoder enduser_setup file gpio http mqtt net node tmr uart websocket wifi.

We'll keep you posted by email about the progress of your build.

In the meantime I suggest you take a look at the build stats to find out how your firmware configuration compares to others in the community.

This was built against the dev branch and includes the following modules: cron, crypto, dht, encoder, enduser_setup, file, gpio, http, mqtt, net, node, tmr, uart, websocket, wifi, tls.

floatinteger具体选哪个好?在这里我选了前者,在print的时候字符串格式化会有差异

NodeMCU PyFlasher烧录

其实这玩楞就是个esptool.py的图形化封装

Flash NodeMCU
Flash NodeMCU

ESPlorer连接

pc需要CH340的驱动,这里是COM4,波特率115200
首次连接可以按一下板子上的RST复位键,并且下载完成应该会提示lua: cannot open init.lua
我这里之前传过了所以不会有这个提示。现在懒得截图,之后再补吧……

Communication
Communication

0x03.代码

注:本文所有代码均经过测试并已通过运行验证

连接WiFi

法一、初级:先定义函数,后在参数中引用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
print('[WiFi]Setting...')
wifi.setmode(wifi.STATION)
wifi.sta.config{ssid="SUT", pwd="<rm>"}
print('[WiFi]Connecting...')
wifi.sta.connect()

function getip()
if wifi.sta.getip() == nil then
print('[WiFi]Waiting(2s)...')
else
print('[WiFi]Connected at:' .. wifi.sta.getip())
tmr.stop(1)
end
end

tmr.alarm(1, 2000, tmr.ALARM_AUTO, getip)

法二、高级:匿名函数直接写入参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
print('[WiFi]Setting...')
wifi.setmode(wifi.STATION)
wifi.sta.config{ssid="SUT", pwd="<rm>"}
print('[WiFi]Connecting...')
wifi.sta.connect()

tmr.alarm(1, 2000, tmr.ALARM_AUTO, function()
if wifi.sta.getip() == nil then
print('[WiFi]Waiting(2s)...')
else
print('[WiFi]Connected at:' .. wifi.sta.getip())
tmr.stop(1)
end
end)

然后你就可以活学活用下了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
print("[WiFi]Scanning...")

function connect(t)
for k, v in pairs(t) do
print(k..":"..v)
if k == "SUT" then
print("[WiFi]Setting...")
wifi.sta.config{ssid="SUT", pwd="<rm>"}
print("[WiFi]Connecting...")
wifi.sta.connect()
tmr.alarm(1, 2000, tmr.ALARM_AUTO, get_ip)
break
else
print("[WiFi]Unavailable AP...")
end
end
end


function get_ip()
if wifi.sta.getip() == nil then
print("[WiFi]Waiting(2s)...")
else
print("[WiFi]Connected:"..wifi.sta.getip())
tmr.stop(1)
end
end

wifi.setmode(wifi.STATION)
wifi.sta.getap(connect)

温湿度传感器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
pin = 1

function measure()
status, temp, humi, temp_dec, humi_dec = dht.read11(pin)
if status == dht.OK then
-- Integer firmware using this example
--[[
print(string.format("DHT Temperature:%d.%03d;Humidity:%d.%03d\r\n",
math.floor(temp),
temp_dec,
math.floor(humi),
humi_dec
))
]]--

-- Float firmware using this example
print("[DHT11][SUCCESS]T:"..temp..";H:"..humi)
elseif status == dht.ERROR_CHECKSUM then
print("[DHT11][ERROR_CHECKSUM]T:"..temp..";H:"..humi)
elseif status == dht.ERROR_TIMEOUT then
print("[DHT11][ERROR_TIMEOUT]")
end
end


tmr.alarm(1, 1000, tmr.ALARM_AUTO, measure)

0x03.引用

NodeMCU–学习笔记(二)连接wifi

未完待续……