雷竞技注册
项目

光杆“相对舒适”温度计与NodeMCU

2015年9月28日经过帕特里克·劳埃德

通过使用MQTT在多个运行NodeMCU的ESP8266模块上广播温度数据,创建一个无线“相对舒适”的光条温度计。

技术概念

*克隆GitHub的代码存储库
*通过Linux命令行连接到串口
* Basic Linux Bash
*基本电路面包板

介绍

最后一次我们讨论过了MQTT其在低功耗嵌入式应用中使用。该系统仅使用单个远程Nodemcu客户端,并且只能将RGB闪烁,通过网络发送的命令,并以基于Python发送的命令泛美卫生组织的客户。本教程将我们自制的MQTT网络的功能扩展为更实用的东西:测量外部温度的相对舒适度的温度计。这包含了两个运行NodeMCU固件的ESP8266模块,MAX31855热电偶放大器,如我所示如何在8月份做一个突破板和一个可寻址RGB LED带使用WS8612 LED。用户选择最大和最小温度,它们会认为是“太冷”的范围“太冷”。指示灯LED将标记当前温度在该规模上的位置,并为您提供外部感觉的快速视觉参考。

所需材料

硬件:

  • 2 x ESP8266模块
  • 1x可寻址RGB LED灯条
    • 我用的是来自Sparkfun的COM-12027,但只要他们使用,任何都可以WS2812发光二极管
  • MAX31855跑火板
  • 任何k型热电偶探头(只要你能把它以某种方式连接到MAX31855)
  • 3.3V电源供应用于两个设备
    • 我用的是便宜的
  • 无焊接面包板

软件:

  • Git.
  • 项目文件
  • Mosquitto
    • Mosquitto(MQTT经纪人)
    • Mosquitto-Clients(PUB和Sub客户端用于MQTT调试)
  • Esptool(flash NodeMCU固件,包含在项目文件存储库中)
  • Luatool(将Lua文件上传到设备,包括在项目文件存储库中)

项目文件将沿途发布,但强烈建议您克隆并使用该文件github存储库。它更容易保持更新,我或其他人所做的任何改进都将被更流畅地集成。

要获得项目文件,进入你选择的目录,并在终端中输入以下内容:

Git克隆——递归https://github.com/swedishhat/nodemcu-mqtt-thermo.git
cd nodemcu-mqtt-thermo

如果更新发生在一行(项目文件或子模块),你可以用以下方法更新你的项目文件夹:

cd nodemcu-mqtt-thermo
git拉
git子模块同步
git子模块更新

原理图和硬件

在系统层面上,网络看起来是这样的:

在讨论单个节点时,我将对其进行更详细的分析。

关于固件的说明

固件是使用惊吓的编译NodeMCU自定义构建安装以下模块:节点,文件,gpio, wifi, tmr, uart, mqtt, ws2812。由于错误在GitHub存储库的主分支中,开发分支是必需的。尽管连接到MAX31855的温度计模块不需要驱动任何WS2812 LED,但为了简单起见,我对两个模块使用了相同的固件。固件文件位于项目存储库中:

../nodemcu-mqtt-thermo/firmware/nodemcu-firmware.bin.

该固件可以使用Esptool.py(位于. . / nodemcu-mqtt-thermo /工具/ esptool目录),使用以下命令:

./nodemcu-mqtt-thermo/tools/esptool/esptool.py -p (PORT) -b (BAUD) write_flash 0x00000 ./nodemcu-mqtt-thermo/firmware/nodemcu-firmware.bin . conf . conf . conf

如果删除-p或-b选项,工具默认值分别为/dev/ttyUSB0和9600。

如果您使用的是使用ESP-01或SEAM 8266 BERCUT,则没有像Nodemcu-devkit(如上面的Sparkfun和Adafruit选项),您需要使用像FTDI 232RL这样的外部程序员突发板。此外,对于ESP-01特别是,有一些额外的箍跳过将设备放入固件闪烁模式:

  • 通过拉动使能ESP8266CH_PD高至VCC。我实际上焊接了一个跳线之间的那些引脚在我的,所以它总是启用;我打算使用ESP8266作为主微控制器而不是从外设
  • GPIO_0低到GND和循环力量。这实际上将设备放在闪光模式下。一旦闪烁完成,删除与地面和循环电源的连接以返回正常模式。

MAX31855温度计节点

这是ESP8266,读取MAX31855热电偶放大器,并将温度广播到MQTT网络。自从此以来SPI接口对于MAX31855需要三个GPIO引脚(SCK,MISO和〜CS),需要连接到Nodemcu-devkit或同等的ESP-12备用板。我为SCK,MISO,〜CS引脚选择了Nodemcu引脚D1,D2和D3。这是我特定设置的图片:

连接到我电脑的USB数据线将此节点断电。如果您想将其放在外部,则需要为节点提供外部电源(可能还有一个外壳)。

WS2812 RGB LED带状显示节点

该项目的下半部分是RGB LED显示屏。此ESP8266节点侦听MQTT网络上的热电偶温度数据,并将当前温度的闪烁标记放在用户定制的比例上,从“太热”到“太冷”。WS2812 LED的表现类似于移位寄存器,因此可以在链中连接任意数量的LED,并使用单个GPIO引脚控制。我的特殊WS2812 LED带来自SparkFun的LED条带有60个LED,但它们都是用我的ESP-01的GPIO_2引脚控制(根据Nodemcu的D4是D4对于一些愚蠢,混乱的原因)。WS2812的数据表表示,其正常工作电压为5V,但在进行一些研究和测试之后,电源导轨和数据线可以合理地推动3.3V(我注意到有些闪烁但没有令人沮丧的事情)。无需处理多个电源和电平转换。下面可以在My ESP-01设置的图像。ESP-01通过面包板适配器连接到面包板,由9V电池和面包板调节器供电。我的外部USB - 串行转换器位于“梅花疯狂紫色”的顶部。

温柔的一面……

基础代码

将代码放到NodeMCU的工具是luatool.py.并位于. . / nodemcu-mqtt-thermo /工具/ luatool / luatool /目录。上传文件的格式是:

./nodemcu-mqtt-thermo/tools/luatool/luatool/luatool.py -p (PORT) -b (BAUD) -f (SOURCE FILE) -t (DEST FILE) -vr .py /nodemcu-mqtt-thermo/tools/luatool/luatool/luatool.py

和esptool.py一样,-p和-b是可选的,默认值分别为/dev/ttyUSB0和9600。“-vr”是冗长和重新启动后上传标志的组合,我发现这很有帮助。

我希望我的代码是因此,我为这个项目编写了一些节点不明确的文件。它们是初始化文件(i.a lua)和MQTT设置和操作函数(MQTT .lua)。它们都可以使用特定于每个项目的配置文件进行定制(config.lua),还需要进行一些细微的调整,比如指定GPIO插脚和MQTT订阅主题,但它们都是非常通用的。

初始化文件连接到WiFi网络,并在存储器中创建一个表,用于存储有关系统的信息(IP地址,剩余堆大小,MAC地址,MQTT主机等)。然后它将该信息打印到串行端口:

——i.lua代表温度计——作者Patrick Lloyd——Init文件,但名字不是Init。Lua为了——手动测试和调试初始化代码。——加载所有的全局定义的变量dofile(“config.lua”)——创建系统信息表和一个函数把它填平sys_info ={}函数get_sys_info()——无线信息本地ip, nm, gw = wifi.sta.getip当地mac () = wifi.sta.getmac()当地wifi_mode ={[1] =“站”,[2]=“软ap”[3]=“STATIONAP”},当地ver_maj硬件信息,ver_min、ver_dev chip_id、flash_id flash_size, flash_mode flash_speed = node.info()当地heap_size = node.heap () sys_info ={(“无线”)={(“无线模式”)= wifi_mode [wifi.getmode ()], [" MAC地址"]= MAC(“IP地址”)= IP(“子网掩码”)= nm,(“网关”)= gw},(“sys”)={(“版本”)= ver_maj . .”。“…ver_min…”。”…ver_dev, ["Heap Size"] = heap_size, ["Chip ID"] = chip_id, ["Flash ID"] = flash_id, ["Flash Size"] = flash_size, ["Flash Mode"] = flash_mode, ["Flash Speed"] = flash_speed}, ["mqtt"] ={["客户端ID"] = MQTT_CLIENTID, ["mqtt Host"] = MQTT_HOST..":"..MQTT_PORT}} end——SW_SPI引脚初始化模式(PIN_CS gpio.OUTPUT) gpio。write(PIN_CS, gpio. high)——chip not selected gpio. write(PIN_CS, gpio. high)模式(PIN_SCK gpio.OUTPUT) gpio。gpio. write(PIN_SCK, gpio. low)——idle low设置模式(wifi.STATION)——启动连接尝试wifi.sta。config(WIFI_SSID, WIFI_PASS)——创建一个警报来轮询wifi.sta.getip()函数每秒一次——如果设备还没有连接,通过LED颜色闪烁。如果有,把LED变成白色tmr。function() if wifi.sta.getip() == nil then print(" connect to AP…")else——刷新系统信息表get_sys_info()——打印所有的系统信息print(" ---- system info ----") for key,vals成对(sys_info[“sys”])做打印(钥匙. .”:\ t”. . vals)结束打印(" ")——打印所有的无线信息打印(“\ n——无线信息”)为关键,val成对(sys_info.wifi)打印(关键. .”:\ t”. . val)结束打印(" ")tmr.stop(0)——停止WiFi连接报警dofile(“main.lua”)——主函数运行结束结束)

MQTT文件有点复杂一点(并获得了在这个项目中工作的最多时间!)。在我的MQTT示例来自上次在美国,我们只发布和订阅了一个主题。我发现,在发布或订阅事件以及完成回调函数时,会有相当大的延迟。如果用户试图过快地发出MQTT事件,就会出现问题;例如,不是所有的消息都会被发布,或者不是所有的主题都会被订阅。一些其他正在经历这个问题,所以我写了一个简单的信号用与它相关联的计时器实现队列(filo)。用户想要调用一个事件,并且该事件将附加到队列的末尾。每50毫秒,计时器调用该事件,并在每个事件的回调函数中,事件从队列中删除自己并将其他人移位。这可以如下所示:

-------------------- -- MQTT信号量  -- -------------------- -- 简洁是智慧的灵魂。我应该写些短诗……——print("Hear\nme dear,\ndare I ask you for\na way to write a semaphore\ into queue a table with topics因此\n"..——“把你的桌子变成数码灰尘?”因为采取必要行动的时间延误了及时的满足。——“但是,尽管这种想法困扰着我,我却一点也不能回避它。\向队列? \ n”. .——“我愿意”)——它们维护发布和订阅主题的队列——构建主题订阅队列。尽可能快地填充它,但它将在MQTT_CMDTIME_MS sub_list ={}函数mqtt_sub_queue(client, topic)表指定的固定时间内遍历每个项。tmr. Insert (sub_list, {["client"] = client, ["topic"] = topic}) tmr. Insert (sub_list, {["client"] = client, ["topic"] = topic})报警(1 MQTT_CMDTIME_MS 1,函数()如果# sub_list > 0然后sub_list [1] .client:订阅(sub_list[1]。topic, 0, function() print("订阅到"..sub_list[1].topic)表。remove(sub_list, 1) end) else tmr.stop(1) end end) end——构建主题发布队列。 Fill it as fast as you want but it -- will go through each item at a fixed time specified by MQTT_CMDTIME_MS pub_list = {} function mqtt_pub_queue(client, topic, message) table.insert(pub_list, {["client"] = client, ["topic"] = topic, ["message"] = message}) tmr.alarm(2, MQTT_CMDTIME_MS, 1, function() if #pub_list > 0 then pub_list[1].client:publish(pub_list[1].topic, pub_list[1].message, 0, 0, function() print("Published \""..pub_list[1].message.."\" to "..pub_list[1].topic) table.remove(pub_list, 1) end) else tmr.stop(2) end end) end ---------------------------- -- MQTT SETUP AND CONNECT -- ---------------------------- MQTT_SUBS = {["/cmd/get_info/"..MQTT_CLIENTID] = mqtt_sys_info} -- Initialize mqtt client with keepalive timer of 60sec. No password? I too -- like to live dangerously... mq = mqtt.Client(MQTT_CLIENTID, 60, "", "") -- Set up Last Will and Testament (optional) mq:lwt("/lwt", "Oh noes! Plz! I don't wanna die!", 0, 0) -- When client connects, print status message and subscribe to cmd topic mq:on("connect", function(mq) -- Serial status message print("---- MQTT Info ----") for key, val in pairs(sys_info.mqtt) do print(key..":\t"..val) end -- Subscribe to NodeMCU topics using semaphore stuff above for i,_ in pairs(MQTT_SUBS) do mqtt_sub_queue(mq, i) end print("") main_loop() end) -- When client disconnects, print a message and list space left on stack mq:on("offline", function() print ("\nDisconnected from broker") print("Heap:\t"..node.heap().."\n") end) -- On a publish message receive event, run the message dispatcher and interpret the command mq:on("message", function(mq,t,pl) -- It allows different functions to be run based on the message topic if pl ~= nil and MQTT_SUBS[t] ~= nil then MQTT_SUBS[t](mq, pl) end end) -- Connect to the broker mq:connect(MQTT_HOST, MQTT_PORT, 0, 1)

代码的其余部分是特定于节点的,因此我们将对其进行单独分解。唯一剩余的共性存在于配置文件中,因为两个节点需要指定相同的WiFi SSID和密码以及MQTT主机信息。但是,每个MQTT客户机ID是独立的。

MAX31855温度计节点

在配置文件的其余部分中,我们只需要指定MAX31855将连接到的pin号的名称。其他一切都在主函数中处理。

——配置。lua for thermometer - by Patrick Lloyd - Global variable configuration file for better portable - Change for your specific setup. lua for thermometer for temperature - by Patrick Lloyd - Global variable configuration file for better portable - Change for your specific setup。假设默认的mosquito to配置——Pin Declarations PIN_SCK = 1 PIN_MISO = 2 PIN_CS = 3——WiFi WIFI_SSID = "" WIFI_PASS = ""——MQTT MQTT_CLIENTID = "esp-therm" MQTT_HOST = "" MQTT_PORT = 1883 MQTT_CMDTIME_MS = 500 print("\nConfig complete")

主要的。Lua文件是所有操作发生的地方,如果你能想象的话。我首先尝试构建一个Lua模块来控制MAX31855的公共和私有函数,但它太大了,ESP8266无法保存在内存中。我将基本功能移到了主功能。Lua文件和所有“私有”函数(不打算直接运行)都有下划线。第一个是_read32()。这设置和读取SPI总线上的GPIO引脚。从技术上讲,ESP8266中有一个硬件SPI模块,但我在使用NodeMCU时遇到了麻烦(关于这个特性的文档有些差),因此,我只是手动控制总线线路,也称为位撞击

下一个私有函数是_temp_decode(),它获取从SPI总线读取的温度位字符串,并将其转换为人类可读的温度,单位为摄氏度。之后,开始公共功能。mqtt_update_temp()读取温度,将其转换,并将其发送到MQTT网络上,供其他设备读取。mqtt_sys_info是一个helper函数,用于在MQTT网络上发布系统信息以进行调试。最后,main_loop()只是启动一个计时器,每5秒调用mqtt_update_temp()一次。Main_loop()由mqtt中的mq:on("connect", function(mq)调用。lua文件。

-  Main.lua for温度计 - 帕特里克劳埃德----------------------------  - 硬件控制功能 --  ------------------------------- BIT-BANG SPI总线更新'RAW'表读数_BUS = FALSE功能_Read32()本地RAW = {}  - 设置此标志允许函数等待阻塞循环ready_bus = true  - 选择芯片中的数据,并为其提供一个微秒,成为活动gpio.write(pin_cs,gpio.low)tmr。延迟(1) - 循环时钟并将总线数据读取为“RAW”32次,对于i = 1,32 do gpio.write(pin_sck,gpio.high)原始[i] = gpio.read(pin_miso)gpio.write(P.IN_SCK, gpio.LOW) tmr.delay(1) end -- Deselect chip, wait 1 us, clear "busy" flag gpio.write(PIN_CS, gpio.HIGH) tmr.delay(1) reading_bus = false return raw end -- Decodes temperature values either for TC or reference junction depending on the bit width function _temp_decode(bin_value) -- Ignore sign bit for now and convert to decimal number local temp_c = tonumber(string.sub(bin_value, 2), 2) -- Heed the sign bit! if string.sub(bin_value, 1, 1) == 1 then temp_c = temp_c * -1 end -- Differentiate between TC or RJ and scale appropriately if #bin_value == 14 then temp_c = temp_c * 0.25 elseif #bin_value == 12 then temp_c = temp_c * 0.0625 end return temp_c end -- Return a table with floating point temperature values and the error bits -- Sometimes you will get ridiculous (yet legal) temperature values when -- certain errors happen. This puts error checking responsibility on the -- receiving system, if it cares about such things. function mqtt_update_temp(mq) -- Update 'raw' data and wait for it to finish local data = _read32() while reading_bus do end -- Make sure the argument is legal --err_msg = "\nERROR: Device argument for max31855_swspi.temp() not recognized.\nOptions are \"tc\" for thermocouple or \"rj\" for Reference Junction.") mqtt_pub_queue(mq, "/data/temp/rj", _temp_decode(table.concat(data, "", 17, 28))) mqtt_pub_queue(mq, "/data/temp/tc", _temp_decode(table.concat(data, "", 1, 14))) mqtt_pub_queue(mq, "/data/temp/err", table.concat(data, "", 30, 32)) end -- Print and publish system info like at bootup but do it whenever function mqtt_sys_info(mq, pl) get_sys_info() local err_msg = "\nERROR: MQTT payload for mqtt_sys_info() not a valid argument\nOptions are \"wifi\", \"sys\", or \"mqtt\"." if sys_info[pl] == nil then print(err_msg) else for key, val in pairs(sys_info[pl]) do mqtt_pub_queue(mq, "/status/"..MQTT_CLIENTID.."/"..pl, key..":\t"..val) end end end function main_loop() tmr.alarm(5, 5000, 1, function() mqtt_update_temp(mq) end) end -- Load up the MQTT functions and variables dofile("mqtt.lua")

WS2812 RGB LED带状显示节点

在这个配置文件中,除了WiFi和MQTT常量,我们需要设置最大和最小“舒适温度”,并创建一个字符串,其中包含了每个LED的RGB值。这个颜色表的形式是TEMP_COLOR_LUT = string。char(R1, G1, B1, R2, G2, B2,…), R60, G60, B60),其中R#是一个介于0和255之间的数字。由于我的条带中有60个led,所以我的表格有180个元素。NodeMCU提供了一个WS2812.writergb()函数来控制只接受数据线的pin码和一个ASCII字符串(因为ASCII字符可以用8位[0-255]表示)的条带。在这种情况下,TEMP_COLOR_LUT从蓝色到绿色再到红色,这就是所谓的HSV反向梯度。

-  CONFIG.LUA for Light Strip  -  by Patrick Lloyd  - 全局变量配置文件,以更好的可移植性 - 更改您的特定设置。这假设默认mosquitto配置 - 引脚声明PIN_WS2812 = 4  - 这是ESP8266上的GPIO2。不知道为什么nodemcu做这个...  -  wifi wifi_ssid =“wifi_pass =”“ -  mqtt mqtt_clientid =”ESP-LED“MQTT_HOST =”MQTT_PORT = 1883 MQTT_CMDTIME_MS = 50  - 上部和较低温度的舒适度(deg c)temp_max = 44.0  - 太热!temp_min = -7.0  -  brrr!- 基于此工具的Overse HSV梯度形式的HSV温度彩色表:http://www.perbang.dk/rgbgradient/ temp_color_lut = string.cru(0,0,255,0,17,255,0,34,255,0,51,255,0,69,255,0,86,255,0,103,255,0,121,255,0,138,255,0,155,255,0,172,255,0,190,255,0,207,255,0,224,255,0,242,255,0,255,250,0,255,233,0,255,216,0,255,198,0,255,181,0,255,164,0,255,146,0,255,129,0,255,112,0,255,95,0,255,77,0,255,60,0,255,43,0,255,25,0,255,8,8,255,0,25,255,0,43,255,0,60,255,0,77,255,0,95,255,0,112,255,0,129,255,0,146,255,0,164,255,0,181,255,0,198,255,0,216,255,0,233,255,0, 250, 255, 0, 255, 242, 0, 255, 224, 0, 255, 207, 0, 255, 190, 0, 255, 172, 0, 255, 155, 0, 255, 138, 0, 255, 121, 0, 255, 103, 0, 255, 86, 0, 255, 69, 0, 255, 51, 0, 255, 34, 0, 255, 17, 0, 255, 0, 0) print("\nConfig complete")

在LED条带节点的Main.Lua文件中,我们首先将temp_color_lut字符串写入灯带,以便我们在等待临时数据到达网络时,我们有一些很漂亮。然后,on to函数声明。temp_position()基于测量的温度,temp_color_lut中的元素数以及temp_max和temp_min设置的界限,确定指示LED的位置。update_lex_strip()是闪烁指示灯LED的原因,实际上调用WS2812.WRITERGB()函数来更改LED颜色。MQTT_TEMP_UPDATE()是每当新的温度数据在MQTT网络上显示时运行的回调函数,MQTT_SYS_INFO()就像从上一个节点中的一个只提供系统信息进行调试。main_loop()实际上并没有做任何事情,但留下了,以便对节点之间重复使用的MQTT.LUA文件必须进行最小的更改。

-  Main.Lua为LED条带 - 由Patrick Lloyd ----------------------------  - 硬件控制功能-  ----------------------------  -  oooooooo闪亮!WS2812.WRITERGB(PIN_WS2812,TEMP_COLOR_LUT) - 确定相对温度指示符功能TEMP_POSTION(TEMP)的位置 - 检查TEMP是否处于正确的范围。愚蠢的Lua技巧改编自动支持http://lua-users.org/wiki/torkaryoperator  -  +0.001是为了在归一化本地t =(temp> temp_max和temp_max)或(temp <=)期间的'POS'在零中评估为零。(temp <=TEMP_MIN和TEMP_MIN + 0.001)或TEMP  - 将温度正常化为LED条带。这只是代数,Bruh。本地POS =((t  -  temp_min)* #temp_color_lut / 3.0)/(temp_max  -  temp_min) - 舍入到最接近的整数返回math.ceil(pos)结束 - 写入LED条功能update_led_strip(temp,on_off)local err_msg =“\ neRor:Update_led_strip()的开/关参数未识别。\ n选项是\”ON \“或\”OFF \“。”local str_pos_end = 3 * temp_position(temp)local ind_led = {[上“] = string.Char(255,255,255),[”关闭“] = string.Char(0,0,0)} --local displaced = temp_color_lut:子(str_pos_end-2,str_pos_end)如果dem_led [on_off] == nil然后打印(err_ms)else  - 如果子字符串未界限,则不会折腾错误!天啊! ws2812.writergb(PIN_WS2812, TEMP_COLOR_LUT:sub(1, str_pos_end - 3)..ind_led[on_off]..TEMP_COLOR_LUT:sub(str_pos_end + 1)) end end -- Receive MQTT temp data and parse it, then call update_led_strip(). INDICATOR_ON = true function mqtt_temp_update(mq, pl) local on_off = {[true] = "on", [false] = "off"} update_led_strip(tonumber(pl), on_off[INDICATOR_ON]) INDICATOR_ON = not INDICATOR_ON end -- Print and publish system info like at bootup but do it whenever function mqtt_sys_info(mq, pl) get_sys_info() local err_msg = "\nERROR: MQTT payload for mqtt_sys_info() not a valid argument\nOptions are \"wifi\", \"sys\", or \"mqtt\"." if sys_info[pl] == nil then print(err_msg) else for key, val in pairs(sys_info[pl]) do mqtt_pub_queue(mq, "/status/"..MQTT_CLIENTID.."/"..pl, key..":\t"..val) end end end function main_loop() end -- Load up the MQTT functions and variables dofile("mqtt.lua")

小奖金脚本

可是等等!还有更多!在接下来的十分钟内克隆存储库,并收到一个辅助Bash脚本,将所有文件上载到Nodemcu并运行GNU屏幕。这并不适用于所有的系统和设置你的里程可能会有所不同

把一切放在一起

假设所有的东西都上传了,并且彼此都很友好,系统现在应该响应温度的变化并相应地显示它们。这是一个演示视频,我做了两种不同温度的水与环境的测试。

下一个视频演示了如何运行mosquito to broker和通过mosquito - pub和mosquito - sub客户端发布/订阅主题。它演示了读取临时数据和调用命令来发布系统信息。这是在上一篇文章中使用Paho客户机完成的。

结论

从这个项目中可以看出,NodeMCU平台可以扩展到一些相当复杂的项目中,并且对更多设备的支持也在不断增加。在未来的部分,我想探索如何制作一个DIY回流炉控制器,并将反馈控制系统纳入程序。我还想研究用本地C代码编写应用程序,这可以加快某些部分的进程,并让用户很好地体验使用ESP8266 C APIESP-OPEN-SDK。下次见,黑客快乐。

为自己提供这个项目!BOM。

5个评论
  • Tchavdar Naydenov 2015年11月23日

    优秀的教程帕特里克。谢谢你花时间与我们分享。
    K型热电偶探头和MAX31855似乎是用于测量舒适度的矫枉过正。您可以使用DHT22轻松完成此操作,但我需要使用MAX31855使用Nodemcu的信息,并提供了我需要的所有信息。

    喜欢的。 回复
  • 马丁齐格勒 2015年12月08日

    你好Patrick,很棒的教程…

    试着用ESP-12而不是NodeMCU来构建所有这些。
    脚本工作正常,到MQTT Broker的连接也工作正常。
    但是我的MAX发送了错误的数据。我已经将MAX连接到以下引脚:
    PIN_SCK = 5.
    PIN_MISO = 4
    PIN_CS = 0

    其结果是:
    发布“127.9375”到/data/temp/rj
    发布“2047.75”至/ data / temp / tc
    发布“111”到/数据/临时/ err

    你(或其他人)有一个想法吗?

    欢呼声马丁

    喜欢的。 回复
  • P.
    帕特里克·劳埃德 2015年12月08日

    @Tchavdar:谢谢!这是一个例子,使用的是已经在零件箱,而不是出去买一个新的传感器。最初得到用于测量烤箱温度(~400C)的热电偶。

    @martin:正在传输的错误位让我认为没有进行正确的连接。如果您检查数据表,所有三位都意味着有一个短路接地,一个短路到VCC和一个没有产生很多物理意义的开路电路。特别注意确保您连接最大的引脚也在CONFIG.LUA文件中正确设置。可以在Nodemcu和ESP-12之间围绕一点移动引脚。

    喜欢的。 回复