文章目录
ESP32制作气象站
提示:以下是本篇文章正文内容,下面案例可供参考
一、硬件
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
二、软件
ESP32使用micropython语言开发,
micropython官方文档
https://docs.micropython.org/en/latest/
micropython中文文档
http://docs.micropython.01studio.org/zh_CN/latest/
1.micropython固件烧录方法
基于micropython固件,micropython固件下载地址
下载固件一般使用esptools软件
esptools安装方法:
打开命令行,输入以下命令:
pip install esptool
烧录micropython固件,打开命令行,输入以下命令:
esptool.py --port <你的ESP32端口号> erase_flash
esptool.py --chip esp32 --port <你的ESP32端口号> write_flash -z 0x1000 <你的固件存放的路径>
例如:
esptool.py --port COM24 erase_flash
esptool.py --chip esp32 --port COM24 write_flash -z 0x1000 D:\esp32-idf3-20200902-v1.13.bin
要实现获取天气信息,首先要将ESP32连接到因特网,利用手机开启热点充当路由器:
1.wifi连接
import network
ssid="vivo X27 8G+128G"//热点的名称,这里我用的是手机的热点名称
password = "123456"//热点的密码
//用于开启连接的自定义函数,此处ESP32作为Station
def connect():
station = network.WLAN(network.STA_IF)
if station.isconnected()==True://检测ESP32是否已经连上了热点,因为如果之前配置过的话,ESP32开机后会自动连接之前配置的热点
print("Already connected")
return
station.active(True)
station.connect(ssid,password)
while station.isconnected() == False:
pass//保险起见,这里应该增加超时处理的函数
print("Connection successful")//连接成功
return station.ifconfig()
把此段代码单独作为成一个python文件下载到ESP32里。
调试的时候如果需要用到联网的功能,直接在命令行里输入以下两条命令即可连接网络,省去了每次单独一行行输入代码配置网络的麻烦。
import wifiConnect
wifiConnect.connect()
2.创建socket连接
首先在PC端创建TCP服务器
串口助手设置如下:
本机IP地址查看方法:
打开命令行,输入ipconfig:
在ESP32端创建socket连接
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address=('192.168.43.43',9666) #192.168.43.43为PC端ip地址
s.connect(address) #启用
s.send('xianyuwang') #传输字符 xianyuwang
s.close()
3.获取某网站ip
打开命令行
ping+网站域名
4.字符编码
常用的字符编码有UTF-8,ASCII,GBK,Unicode,GB2312,在使用网络进行通讯时要保证通信双方的编码格式相同,以保证文本正确显示。编码方式详解
PC端网络调试助手的编码方式为GB2312,因此手机端与PC端通信时,手机端的编码方式也应该设为GB2312。
5.获取天气信息
获取天气用的是知心天气的API,注册一个账号,免费申请一个密钥;
GET /v3/weather/now.json?key=your_private_key&location=beijing&language=zh-Hans&unit=c
将此处的your_private_key换位你申请的密钥。
下面我们要将ESP32与知心天气的服务器建立socket连接,连接之前请确保你的ESP32已连接到手机热点。
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address=('116.62.81.138',80)#ping api.seniverse.com的服务器后得到的ip,知心天气服务器开放的端口为80
s.connect(address) #启用
s.send('GET /v3/weather/now.json?key=SYQseueXByqAipnQF&location=beijing&language=zh-Hans&unit=c\r\n')
data=s.recv(1000)
s.close()
6.JSON解析
从服务器得到的是下面内容,为JSON格式
{"results":[{"location":{"id":"WX4FBXXFKE4F","name":"北京","country":"CN","path":"北京,北京,中国","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"now":{"text":"扬沙","code":"27","temperature":"11"},"last_update":"2021-03-15T14:10:00+08:00"}]}
使用在线网站JSON解析进行JSON解析后得到的内容如下
{
"results":[
{
"location":{
"id":"WX4FBXXFKE4F",
"name":"北京",
"country":"CN",
"path":"北京,北京,中国",
"timezone":"Asia/Shanghai",
"timezone_offset":"+08:00"
},
"now":{
"text":"扬沙",
"code":"27",
"temperature":"11"
},
"last_update":"2021-03-15T14:10:00+08:00"
}
]
}
micropython提供了进行JSON解析的库
import ujson
parsed = ujson.loads(data)
id=parsed["results"][0]['location']['id']
这样就能得到知心天气服务器返回的值。
7.使用OLED12864显示图片
oled12864使用的是四线式的OLED,IIC通信,如下图所示
micropython提供了OLED显示英文字符,绘制图形,绘制图片的库,使用前需要将ssd1306.py库文件下载到ESP32
framebuf方法可以显示pbm格式的文件
from ssd1306 import SSD1306_I2C
from machine import I2C,Pin
import framebuf,time,os, machine
i2c = I2C(sda = Pin(4),scl = Pin(5))#定义软件I2C接口
display = SSD1306_I2C(128,64,i2c)#创建屏幕对象
with open('1.bmp' ,'rb') as f :#注意,这里的'rb'参数很重要,没有的话会读取错误
f.readline()
f.readline()
data = bytearray(f.read())
fbuf = framebuf.FrameBuffer(data,64,64,framebuf.MONO_HLSB)
display.fill(0)
display.blit(fbuf,0,0)#如果不居中,可以修改中间的参数
display.show()#记得show
将任意格式的图片转化为pbm格式
创建convert.py文件,代码如下
import os
from PIL import Image
def changePngoPbm(w, h, path,new_path):
# 修改图像大小
image = Image.open(path,"r")
image = image.resize((w, h), Image.ANTIALIAS)
image = image.convert("1")
image.save(new_path)
for i in range(1,39):
path=str(i)+"@2x.png"
new_path=str(40)+".pbm"
changePngoPbm(64,64,path,new_path)
将想要转化的图片和convert.py放到同一文件夹下,运行convert.py文件