气象站项目(还未完成,已经咕了)


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文件


总结

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值