智能花盆(二)

NodeMcu的使用

我们想要使用NodeMcu,只需要简单的四个步骤

  • 准备好固件(你后面编程所需要的程序库)
  • 将固件刷入NodeMcu
  • 编写程序
  • 将程序刷入NodeMcu

准备固件

你可以在这个网站https://nodemcu-build.com/构建属于你的固件

输入你的邮箱地址

选择你需要的固件,这里会自动帮你选择一些固件,大概看到这些固件就会知道是什么意思,timer就是一个定时器,WiFi用来连接wifi的,这里https://nodemcu.readthedocs.io/en/master/提供了固件的英文文档,可以随意浏览一下,本人作为英语弱渣,也能看个大概,相信对于各位聚聚来讲更不在话下。

再看一下固件,发现了HTTPSJSON,推测可以将采集的数据以JSON格式通过HTTP发送出去,感觉相当便捷。实际上我最后也是采用的这种方式

最后点击构建固件,就阔以了,只要等待固件发送到你的邮箱来就行了。

将固件刷入NodeMcu

使用ESP8266flasher

下载地址:https://github.com/nodemcu/nodemcu-flasher

这玩意长这样

首先点击Config,选择你固件的所在位置

然后选择端口号,点击Flash

若是你的电脑未能识别到你的设备,那么你需要手动安装驱动,具体安装什么驱动呢,google输入NodeMcu上USB转TTL芯片的名字。

编写程序并刷入NodeMcu

使用ESPLorer

下载地址:https://esp8266.ru/esplorer/

这玩意长这样

使用Lua脚本语言编程,具体怎么编,网上一大堆。

这里我们是编写一个init.lua文件,然后将其刷入NodeMcu中,当你复位的时候,运行的就是这个文件里的程序。

首先打开串口,然后点击save to ESP。

代码

自动连接wifi,使用WIFI模块,esp8266有两种模式,一种是station模式(连接wifi),一种是AP模式(esp8266做热点),我们采用station模式,WIFI模块

--自动连接wifi
station_cfg={}
station_cfg.ssid="520"
station_cfg.pwd="z520520520"
station_cfg.save=false
wifi.sta.config(station_cfg)
wifi.sta.connect()

获取温湿度,如果你使用DHT传感器的话,那么很幸运的是有一个DHT模块可以帮助你读取数据 ,然后我们可以使用SJSON模块将获取的数据封装成json格式,DHT模块SJSON模块

function getSensorData()
pin = 1
status, temp, humi, temp_dec, humi_dec = dht.read(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
    --))

    data = {}
    data.id = "12345678"
    data.ip = wifi.sta.getip()
    data.temp = temp
    data.humi = humi
    sensorDataJson = sjson.encode(data)
    
    return true
else
    print('sensor data read failed\r\n')
    return false
end
end

 将json格式的数据通过http库的post函数发送出去,HTTP模块

-- 发送http链接
function sendData(url, st)
http.post(url,
  'Content-Type: application/json\r\n',
  st,
  function(code, data)
    state = true
    if (code < 0) then
      print("HTTP request failed\r\n")
    else
      print(code, data, '\r\n')
    end
  end)
end

 启动定时器,将读取到的传感器数据定时上传到服务器,tmr模块

--启动定时器发送传感器数据
tmr.alarm(1, 4000, tmr.ALARM_AUTO, function()
    if wifi.sta.getip() == nil then
        print('Waiting for connectting IP ...')
    else if state and getSensorData() then
        print('IP is ' .. wifi.sta.getip())
        print(sensorDataJson)
        state = false
        sendData(url, sensorDataJson)
        --tmr.stop(1)
    end
    end
end)

链接wifi的时候不一定能立马连接上,所有我们需要esp8266链接上wifi后,再发送数据。

 

完整代码:

wifi.sta.sethostname("Node-MCU")
wifi.setmode(wifi.STATION)
print(wifi.sta.gethostname(),"\n")

--自动连接wifi
station_cfg={}
station_cfg.ssid="520"
station_cfg.pwd="z520520520"
station_cfg.save=false
wifi.sta.config(station_cfg)
wifi.sta.connect()

url = "http://192.168.1.121:8080/SmartHomeDemo/SensorData_servlet"
sensorDataJson = nil
state = true

--启动定时器发送传感器数据
tmr.alarm(1, 4000, tmr.ALARM_AUTO, function()
    if wifi.sta.getip() == nil then
        print('Waiting for connectting IP ...')
    else if state and getSensorData() then
        print('IP is ' .. wifi.sta.getip())
        print(sensorDataJson)
        state = false
        sendData(url, sensorDataJson)
        --tmr.stop(1)
    end
    end
end)

-- 获取传感器数据
function getSensorData()
pin = 1
status, temp, humi, temp_dec, humi_dec = dht.read(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
    --))

    data = {}
    data.id = "12345678"
    data.ip = wifi.sta.getip()
    data.temp = temp
    data.humi = humi
    sensorDataJson = sjson.encode(data)
    
    return true
else
    print('sensor data read failed\r\n')
    return false
end
end

-- 发送http链接
function sendData(url, st)
http.post(url,
  'Content-Type: application/json\r\n',
  st,
  function(code, data)
    state = true
    if (code < 0) then
      print("HTTP request failed\r\n")
    else
      print(code, data, '\r\n')
    end
  end)
end

-- 监听80端口
sv = net.createServer(net.TCP, 30)

function receiver(sck, data)
  print(data)
  changeLight()
  sck:close()
end

if sv then
  sv:listen(80, function(conn)
    conn:on("receive", receiver)
    conn:send("hello world")
  end)
end

function changeLight()
    gpio.mode(4, gpio.OUTPUT)
    light = gpio.read(4)
    if (light == 1) then
        gpio.write(4, gpio.LOW)
    else
        gpio.write(4, gpio.HIGH)
    end
end

 

 

对于此项目,我们必须包含一组需要包含的组件:BME280,Seeed Grove灰尘传感器,Seeed Grove空气质量v1.3传感器,电容性土壤湿度传感器,Adafruit 128x64 OLED显示屏,继电器和一个粒子氩。 对于我的设计,我想要一个看起来干净且精致的设置。我本来想把一个盒子和一个花盆放在一个水箱上,但最终将其改为放在丙烯酸圆盘上的所有东西。对于盒子,我在Autodesk Fusion 360中对它和盖子建模,并使用Formlabs 3 Resin打印机将它们打印出来。对于花盆i,我也曾在Fusion 360中对其进行建模,并使用Ultimaker 3 3D打印机将其打印出来。对于水库本身,我使用了刚好适合该项目的剩余丙烯酸光盘。 该项目的目标是要有一个可以通过网络控制的整洁的自动浇水花盆。完成大约8个小时的工作就完成了,但是实际打印所有内容都花费了更长的时间。锅用了大约23个小时,盒子在树脂打印机上用了3个小时,而储藏室用了大约2个小时使其干燥。 BME280与土壤湿度传感器一起安装在花盆内。粒子通过继电器安装在盒子内,显示屏拧紧在外壳上,电动机安装在储水箱内,空气质量传感器和灰尘传感器一起热粘在外壳的盖子上。 对于这种情况,我想要一个易于使用的粒子氩气端口,一个易于拆卸但也可以固定的盖子,允许所有电线通过的直通孔,继电器安装在面包板上方以及灰尘传感器/空气质量传感器都安装在盖子上,以便能够更准确地读取空气。 对于水库,我最初希望将盒子和花盆都安装在其顶部,直径约6英寸。由于材料的使用,这种情况发生了变化,我发现直径为4.5英寸的丙烯酸光盘正被某人使用。我将其更改为双面粘贴到直径9英寸的较大的丙烯酸圆盘上,并将4.5英寸的圆圈粘在一起。虽然我曾经使用硅树脂,但是决定不给丙烯酸树脂提供必要的附着力,所以我最终使用了汽车RTV,该技术可以实现水密密封,并且能够有效地将每一块胶粘在一起。 对于花盆,我希望供水来自侧面,带有一个小尖头,可以使水更均匀地分配给土壤湿度传感器,以更准确地读取土壤。我在锅中钻了两个孔,一个用于土壤传感器的电线,另一个用于连接软管。我将电线和连接器热粘合在一起,希望能形成水密密封,但最终不得不使用浴室硅胶密封它们,以免它们泄漏!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值