NodeMCU ESP8226 查询天气

NodeMCU(ESP8226)在线查询天气

2018-10-15
77次浏览

一、硬件
NodeMCU开发板一块(20块钱),USB线1根


二、开发环境
ESPlorer,Lua脚本语言


三、获取天气的接口
免费的心知天气接口,链接:https://api.seniverse.com/v3/wea ... uage=zh-Hans&unit=c
得到的数据格式为JSON格式,中英文可选,如下图

{
"results":
[{
"location":{"id":"WWMT5Q64CR3G","name":"青岛","country":"CN","path":"青岛,青岛,山东,中国","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},
"now":{"text":"多云","code":"4","temperature":"19"},
"last_update":"2018-10-15T15:35:00+08:00"
}]
}




四、源代码
刚开始接触Lua脚本,主要是调用各种函数,参考信息出处:https://blog.csdn.net/luckey_pig/article/details/79574387
注意首先得把带sjon的固件刷入MCU,对着参考文档学习,官方参考文档如下:

https://nodemcu.readthedocs.io/en/master/en/modules/sjson/#sjsondecode

代码比较简单,
1、配置Wifi
2、创建链接获取天气数据;
3、使用sjson解析数据,串口打印
源代码回复可见
[hide]lighton=0
pin=4
gpio.mode(pin,gpio.OUTPUT)
print('Setting up WIFI...')
wifi.setmode(wifi.STATION)
station_cfg={}
station_cfg.ssid="21ic"
station_cfg.pwd="12345678"
station_cfg.save=true
wifi.sta.config(station_cfg)
tmr.alarm(0, 1000, tmr.ALARM_AUTO, function()
    if wifi.sta.getip() == nil then
        print('Waiting for IP ...')
    else
        print('IP is ' .. wifi.sta.getip())
    tmr.stop(0)
   end
end)

tmr.alarm(1, 5000, tmr.ALARM_AUTO, function()
    if wifi.sta.getip() ~= nil then
        srv=net.createConnection(net.TCP,0)
        if lighton==0 then
            lighton=1
            gpio.write(pin,gpio.HIGH)
        else
            lighton=0
            gpio.write(pin,gpio.LOW)
        end
        srv:on("receive", function(sck, c)
--        print(c)
        --value = sjson.decode(pl)
        i,j=string.find(c, "{")
        sjson_str=string.sub(c, i)
        --print(sjson_str)
        local sjson = require("sjson");
        local json = sjson.decode(sjson_str);
        print("City: " ..json.results[1]["location"]["name"])
        print("Weather: " ..json.results[1]["now"]["text"])
        print("Code: " ..json.results[1]["now"]["code"])
        print("Temperature: " ..json.results[1]["now"]["temperature"] .." C \n")   
        end)
        
        srv:on("connection", function(sck, c)
        sck:send("GET /v3/weather/now.json?key=cinm0okk7gzgtujn&location=qingdao&language=en&unit=c HTTP/1.1\r\nHost: api.seniverse.com\r\nConnection: keep-alive\r\nAccept: */*\r\n\r\n")
        end)
        srv:connect(80,"api.seniverse.com")
   end
end)
[/hide]

四、效果


目前是串口打印天气,之后准备使用OLED显示屏显示,效果会更好。


等我学会了Lua脚本下驱动显示屏,有前辈知道的也可以指导下,免得走弯路






我要点评