ESP32从网络获取天气OLED显示(附源码)
获取天气
网络上有好多获取天气的API,但是用的比较多的是心知天气提供的API。
注册心知天气账号(https://www.seniverse.com/),购买服务,可以看到秘钥:
有免费版的、有试用版的,免费版的可以一直使用,但是能获取的数据比较少,试用版的获取的数据更多,但是只能使用一个月。
API
将API中的your_private_key替换为自己的秘钥:https://api.seniverse.com/v3/weather/now.json?key=your_private_key&location=beijing&language=zh-Hans&unit=c,其中your_private_key位置为个人账户控制面板里面的私钥。
可以看到提供了比较多的天气参数类型,有空气类、天气类等:
在PC直接输入上面的api查看数据:
OLED显示
目前用的比较多的0.96吋的OLED是用SSD1306驱动的,github上有ssd1306的驱动模块(https://github.com/adafruit/micropython-adafruit-ssd1306),这个库支持i2c和spi两种接口,在初始化的时候选择不同的驱动方式。
7线制的oled同时支持i2c和spi,i2c接口的接线如下:
GND <---------------------> GND
VCC <---------------------> VCC
D0 <---------------------> G22(SCL)
D1 <---------------------> G21(SDA)
RES <---------------------> G19(这个引脚需要输出高电平)
注意事项:7线制的OLED,在这里使用的时候,用单片机驱动一直没问题,但是用micropython一直报错,后来问及网友说是有个电阻需要接上,D2和D1之间的电阻(我这里使用的是50Ω)需要接上,默认是没贴的,即就是下图中的R8。
调试技巧:I2C库里面提供能了scan函数可以扫描i2c设备,扫描到之后会打印设备的地址,如果扫描不到,那就需要检查了。
脚本编写
需要导入ssd1306.py(可以自行下载:https://github.com/adafruit/micropython-adafruit-ssd1306)这个脚本。
应用程序设计:
定义了两个函数:ConnectNet(ssid ,password)和OLEDInit(),一个用于连接wifi,一个用于初始化OLED。
间隔20s请求一次天气,将返回的值转换为json格式,打印在终端并在OLED显示。脚本中前面两个API是免费的,后一个API只能体验一个月。
import network
import time
import os
import urequests
import ujson
from machine import Pin, I2C
import ssd1306
ssid = '********'
password ='********'
def ConnectNet(ssid ,password):
mynetwork=network.WLAN(network.STA_IF)
mynetwork.active(True)
mynetwork.connect(ssid,password)
while True:
if(mynetwork.isconnected()):
break
else :
time.sleep(1)
print(mynetwork.ifconfig())
def OLEDInit():
res=Pin(19, mode=Pin.OUT, pull=None, value=1)
i2c = I2C(scl=Pin(22), sda=Pin(21), freq=400000)
addr=i2c.scan()
for x in addr:
if x==60 :
print('OLED exist!')
break
else:
print('OLED not exist!')
global oled
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
if __name__=='__main__':
ConnectNet(ssid,password)
OLEDInit()
oled.text('Micropython', 20, 5)
oled.show()
oled.invert(False)
while True:
result1=urequests.get('https://api.seniverse.com/v3/weather/now.json?key=SZQ692OfAQcUERtD4&location=SHENZHEN&language=zh-Hans&unit=c')
j1=ujson.loads(result1.text)
print(j1['results'][0]['location']['name'],end=' ')
print(j1['results'][0]['now']['text'],end=' ')
print(j1['results'][0]['now']['temperature'],end='℃ ')
print(j1['results'][0]['last_update'])
# oled.text(' shenzhen:'+j1['results'][0]['now']['temperature'],5,30)
# oled.show()
result2=urequests.get('https://api.seniverse.com/v3/weather/now.json?key=SZQ692OfAQcUERtD4&location=beijing&language=zh-Hans&unit=c')
j2=ujson.loads(result2.text)
print(j2['results'][0]['location']['name'],end=' ')
print(j2['results'][0]['now']['text'],end=' ')
print(j2['results'][0]['now']['temperature'],end='℃ ')
print(j2['results'][0]['last_update'])
# oled.text(' beijing:'+j2['results'][0]['now']['temperature'],5,40)
# oled.show()
result3=urequests.get('https://api.seniverse.com/v3/weather/now.json?key=Sd0epKp6o3tqxTqQ-&location=%E6%B7%B1%E5%9C%B3&language=zh-Hans&unit=c')
j3=ujson.loads(result3.text)
print(j3['results'][0]['location']['name'],end=' ')
print(j3['results'][0]['now']['text'],end=' ')
print(j3['results'][0]['now']['temperature'],end='℃ ')
print(j3['results'][0]['now']['pressure'],end='Pa ')
print(j3['results'][0]['now']['humidity'],end='% ')
print(j3['results'][0]['now']['wind_speed'],end=' ')
print(j3['results'][0]['last_update'])
oled.fill(0);
oled.show();
oled.text('Shenzhen',25,5)
oled.text('T:'+j3['results'][0]['now']['temperature']+'`',30,20)
oled.text('H:'+j3['results'][0]['now']['humidity']+'%',30,30)
oled.text('P:'+j3['results'][0]['now']['pressure']+'Pa',30,40)
oled.text('W:'+j3['results'][0]['now']['wind_speed']+'km/h',30,50)
oled.show()
time.sleep(20)
END
- 安全科普:SQLi Labs 指南 Part 1
- Do You Kown Asp.Net Core - 根据实体类自动创建Razor Page CURD页面模板
- 2014上半年国内安卓银行应用隐私泄露和安全隐患研究报告
- Do You Kown Asp.Net Core -- Asp.Net Core 2.0 未来web开发新趋势 Razor Page
- Metasploitable2使用指南
- 在渗透测试中使用fuzz技术(附windows安装指南)
- 黑了记者:写个恶意软件玩玩(二)
- 开源BUG跟踪平台JIRA目录遍历漏洞分析
- 黑了记者:写个恶意软件玩玩(一)
- 使用 Python 工具 Locust 进行负载测试
- 玩转Google的XSS游戏
- iOS基于GPUImage的图像形变设计(简单形变部分)
- 不错的node.js入门
- Sql语句收藏
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法