ESP8266+Micropython+OLED网络天气和时钟

2023-05-16

在网上查了很多的资料,打算做一个可以按键显示网络时间和天气预报的东西。

手头有WeMos nodeMCU和I2C接口的OLED12864,不打算用时钟模块,因为ESP8266可以上网,完全可以借用网络授时服务器的数据嘛。http://worldtimeapi.org/api/timezone/Asia/Hong_Kong

OLED12864 I2C这里我采用官方版本的驱动

https://github.com/micropython/micropython/tree/master/drivers/display

保存至 /lib文件夹下,然后在根目录下建立文件

from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
import network
import time

net=network.WLAN(network.STA_IF)
if not net.isconnected():
    net.active(True)
    net.connect("YourWifi","KeyWords") #你的Wifi和密码
    while not net.isconnected():
        time.sleep(1)

scl=Pin(12,Pin.OUT)
sda=Pin(14,Pin.OUT)

i2c=I2C(scl=scl,sda=sda)
oled=SSD1306_I2C(128, 64, i2c)
oled.fill(0)
oled.text("Hello World",0,0)
oled.show()

先测试一下,让OLED12864出现文字再说。

参考一个完整的网络时钟代码

ESP32+时钟、闹钟、温度+microPython程序 (2020-10-09) - 简书

接下来解决网络天气问题。在

http://wthrcdn.etouch.cn/weather_mini?citykey=101010100

这个网站可以获取天气实况,有预报功能。没有成功。

还有国外的 天气网站 https://openweathermap.org/city/1799397 这个也可以用,自己第一次测试成功,后来失败,是因为密钥问题。

在这个环节使用完整版的python有很多中方案都是成功的,但是因为是阉割版的Micropython,其中的urequests不是很完整,用别的网站在urequests.get(url)环节总是返回 UnicodeError错误,就是urequests中的问题。

最后还是回到国内网站,在知心天气注册免费的账户获得一个私钥,获取免费天气预报。

import network
import urequests
import ujson
import utime
import ssd1306
import machine
from machine import RTC, I2C, Pin

# user data
ssid = "yourWifi" # wifi router name
pw = "yourkey" # wifi router password
 
# initialization

# SSD1306 OLED display
print("Connecting to wifi...")
oled = ssd1306.SSD1306_I2C(128, 64, I2C(scl=Pin(12), sda=Pin(14)))
oled.fill(0)
oled.text("Connecting", 0, 5)
oled.text(" to wifi...", 0, 15)
oled.show()

# wifi connection
wifi = network.WLAN(network.STA_IF) # station mode
wifi.active(True)
wifi.connect(ssid, pw)
 
# wait for connection
while not wifi.isconnected():
    pass
 
# wifi connected
print("IP: " + str(wifi.ifconfig()[0]) + "\n")
oled.text("Connected. IP: ", 0, 35)
oled.text(" " + str(wifi.ifconfig()[0]), 0, 45)
oled.show()

url = 'https://api.seniverse.com/v3/weather/daily.json?key=yourkey&location=city&language=en&unit=c&start=0&days=5'
oled.fill(0)
oled.show()

def weather_(_):
    result = urequests.get(url)
    if not wifi.isconnected():
        machine.reset()
    j = ujson.loads(result.text)
    for i in range(3):
        city=j['results'][0]['location']['name']
        oled.text(city+" weather", 0, 0)
        
        date=j['results'][0]['daily'][i]['date']
        oled.text("Date "+date, 0, 9)
        
        tianqi='D/N:'+j['results'][0]['daily'][i]['text_day']+'/'+j['results'][0]['daily'][i]['text_night']
        oled.text(tianqi, 0, 20)
        
        high=j['results'][0]['daily'][i]['high']+'  deg'
        low=j['results'][0]['daily'][i]['low']+'  deg'
        
        oled.text('Low:'+low, 0, 29)
        oled.text('High:'+high, 0, 37)
        
        shidu=j['results'][0]['daily'][i]["humidity"]
        oled.text('Humidity:'+shidu+'%', 0, 50)
        oled.show()
        utime.sleep(5)
        oled.fill(0)
        oled.show()
    result.close()
    
button1 = Pin(4, Pin.IN, Pin.PULL_UP)
button1.irq(trigger=Pin.IRQ_FALLING, handler=weather_)

#以上是显示天气的程序

web_query_delay = 60000 # interval time of web JSON query
retry_delay = 5000 # interval time of retry after a failed Web query
url2 = 'http://worldtimeapi.org/api/timezone/Asia/Hong_Kong'
# internal real time clock
rtc = RTC()
def webtime_(_):
    oled.fill(0)
    oled.show()
    # set timer
    for i in range(15):
        update_time = utime.ticks_ms() - web_query_delay
        if not wifi.isconnected():
                machine.reset()
            
        # query and get web JSON every web_query_delay ms
        if utime.ticks_ms() - update_time >= web_query_delay:
        
            # HTTP GET data
            response = urequests.get(url2)
        
            if response.status_code == 200: # query success
                # parse JSON
                parsed = ujson.loads(response.text) 
                # you can also use parsed = response.json()
                datetime_str = str(parsed["datetime"])
                year = int(datetime_str[0:4])
                month = int(datetime_str[5:7])
                day = int(datetime_str[8:10])
                hour = int(datetime_str[11:13])
                minute = int(datetime_str[14:16])
                second = int(datetime_str[17:19])
                subsecond = int(round(int(datetime_str[20:26]) / 10000))
            
                # update internal RTC
                rtc.datetime((year, month, day, 0, hour, minute, second, subsecond))
                update_time = utime.ticks_ms()
                print("RTC updated\n")
       
            else: # query failed, retry retry_delay ms later
                update_time = utime.ticks_ms() - web_query_delay + retry_delay
        
        # generate formated date/time strings from internal RTC
        date_str = "{:02}/{:02}/{:4}".format(rtc.datetime()[1], rtc.datetime()[2], rtc.datetime()[0])
        time_str = "{:02}:{:02}:{:02}".format(rtc.datetime()[4], rtc.datetime()[5], rtc.datetime()[6])
     
        # update SSD1306 OLED display
        oled.fill(0)
        oled.text("ESP8266 Clock", 0, 5)
        oled.text("Date: " + date_str, 0, 25)
        oled.text("Time: " + time_str, 0, 45)
        oled.show()
        
        utime.sleep(0.1)
    oled.fill(0)
    oled.show()
    response.close()
button2 = Pin(5, Pin.IN, Pin.PULL_UP)
button2.irq(trigger=Pin.IRQ_FALLING, handler=webtime_)
while True:
    pass


这里用两个按键控制,分别通过引脚中断调用两个函数,注意这里的button2 = Pin(5, Pin.IN, Pin.PULL_UP)是GPIO编号不是D5.

在获取知心天气的网页地址中 url = 'https://api.seniverse.com/v3/weather/daily.json?key=yourkey&location=city&language=en&unit=c&start=0&days=5' 把yourkey换成你的私钥,city换成你的城市。这里之所以选择language=en是为了方便显示,如果用默认的language=zh-Hans显示汉字的话,在OLED中还需要构建字模,挺麻烦的,以后有机会再说。

在获取时间时使用的是香港时间,因为和北京位于一个时区,时间是一样的 url2 = 'http://worldtimeapi.org/api/timezone/Asia/Hong_Kong'

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ESP8266+Micropython+OLED网络天气和时钟 的相关文章

  • Java 垃圾回收机制与几种垃圾回收算法

    一 如何确定某个对象是 垃圾 xff1f 这一小节先了解一个最基本的问题 xff1a 如果确定某个对象是 垃圾 xff1f 既然垃圾收集器的任务是回收垃圾对象所占的空间供新的对象使用 xff0c 那么垃圾收集器如何确定某个对象是 垃圾 xf
  • Ubuntu18下编译安装torchvision—C++API的详细过程

    最近使用libtorch做网络模型的部署 xff0c 在编写后处理代码时用到了官方自带的nms h文件 xff0c 但该文件需要安装torchvision xff0c 而torchvision并不包含在官方的LibTorch包中 xff0c
  • Element UI 树形控件整合带图标的下拉功能菜单(tree + dropdown + input)

    本文主要讲述 xff1a 自定义树形控件 lt el tree gt 需求说明 xff1a Element UI 官网提供的树形控件包含基础的 可选择的 自定义节点内容的 带节点过滤的以及可拖拽节点的树形结构 如下 xff1a 我想要的效果
  • Vue子组件调用父组件的方法

    子组件 xff1a span class token tag span class token tag span class token punctuation lt span template span span class token
  • Element UI 自定义穿梭框的数据项

    文章目录 需求官网说明实现效果具体步骤附加需求 xff1a 调节穿梭框高宽度 需求 穿梭框中显示的内容是包含多个字段的数据 xff08 把表格的几个字段在穿梭框中展示 xff09 以及修改相应的样式 xff0c 查看 Element UI
  • Vue集成百度的Ueditor的前后端实现

    找了很多写过的文章 xff0c 也具体试验过都写的不太完整 xff0c 这款编辑器借用Vue提供的语法糖实现了数据的双向绑定 xff0c 不用你自己去getContent或setContent 对比其他的富文本编辑器 xff0c Uedit
  • SpringCloud(十)Config配置中心

    微服务就意味着要将单体应用中的业务拆分成一个个子服务 xff0c 每个服务的粒度相对较小 xff0c 因此系统中会出现大量的服务 由于每个服务都需要必要的配置信息才能运行 xff0c 所以一套集中式的 动态的配置管理设施是必不可少的 Spr
  • SpringCloud(十一)Bus消息总线、Stream消息驱动

    一 Bus消息总线 需求 xff1a 分布式自动刷新配置功能 xff1b 解决 xff1a SpringCloud Bus配合Spring cloud Config使用可以实现配置的动态刷新 1 概述 定义 xff1a Spring Clo
  • MySQL数据库面试题(2021最新版)

    文章目录 1 数据库基础知识为什么要使用数据库什么是SQL 什么是MySQL 数据库三大范式是什么MySQL有关权限的表都有哪几个MySQL的binlog有有几种录入格式 xff1f 分别有什么区别 xff1f 2 引擎MySQL存储引擎M
  • SpringCloud(十二)Sleuth分布式请求链路追踪

    为什么会出现这个技术 xff1f 在微服务框架中 xff0c 一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用来协同产生最后的请求结果 xff0c 每个前段请求都会形成一条复杂的分布式服务调用链路I链路中的任何一环出现高延时
  • SpringCloud(十三)Alibaba Nacos服务注册和配置中心

    文章目录 SpringCloud Alibaba 简介1 为什么会出现SpringCloud Alibaba2 SpringCloud Alibaba概念3 主要功能4 下载地址5 主要组件 Nacos简介1 概念2 能干什么3 下载地址4
  • Spring Cloud 五大组件(整合业务场景说明)

    文章目录 1 什么是微服务2 Springcloud是什么 Springcloud中的组件有哪些 xff1f 3 组件分别描述下它的原理 xff1f 4 业务场景介绍Eureka xff08 注册发现 xff09 Fegin xff08 远
  • Ubuntu18中调用cv2.imshow及PIL库遇到的bug “: cannot connect to X server”及display-im6.q16: unable to open X。。。

    在Ubuntu18中用Python写一个有关opencv的代码 xff0c 用到了cv2 imshow xff0c 但是运行到这里就会报错 xff1a cannot connect to X server 而我把cv2 imshow注释掉就
  • SpringCloud Alibaba-Sentinel 实现熔断与限流

    文章目录 1 为什么要引入Sentinel xff1f 分布式系统遇到的问题解决方案 2 Alibaba SentinelSentinel是什么Sentinel和Hystrix对比Sentinel快速开始Sentinel资源保护的方式 启动
  • JMeter下载安装及入门教程

    文章目录 JMeter介绍准备工作JMeter下载及环境配置下载配置环境具体使用 JMeter介绍 JMeter使用了不同技术和协议 xff0c 是一款可以进行配置和执行负载测试 性能测试和压力测试的工具 负载测试 性能测试和压力测试概念
  • 谷粒商城【商城系统】完整总结

    文章目录 项目运行的步骤项目源码地址模块说明商城项目基础篇总结项目知识点总结效果图展示 商城项目高级篇总结项目知识点总结效果图展示 项目中遇到的问题1 node版本与sass版本不对应2 测试单元的 64 Test 前面没有运行图标3 前端
  • 《阿里云服务器搭建》------ 安装tomcat

    Tomcat服务器安装 1 官网下载 Tomcat官网下载 xff1a https tomcat apache org download 80 cgi 将 apache tomcat 9 0 41 tar gz 的安装包下载到本地 xff0
  • 《阿里云服务器搭建》------搭建SVN服务

    文章目录 1 查看和卸载SVN2 安装SVN3 建立SVN版本库4 修改配置文件1 修改authz文件2 修改passwd文件3 修改svnserve conf文件 5 启动与停止6 windows客户端检出项目 1 查看和卸载SVN sp
  • 尚医通【预约挂号系统】总结

    这里写目录标题 1 项目介绍2 技术点3 业务流程4 项目架构5 项目源码 xff08 包含sql xff09 6 启动步骤7 项目模块说明8 项目功能总结9 效果图后台管理端前端展示端数据库 1 项目介绍 尚医通即为网上预约挂号系统 xf
  • 谷粒商城项目笔记总结(1/2)

    文章目录 商城项目 基础篇1 环境搭建2 MyBatis plus引入MyBatis plus的步骤 3 SpringCloud AlibabaNacos注册中心Nacos配置中心Fegin 声明式远程调用Gateway API网关 4 商

随机推荐

  • 利用natapp做内网穿透

    有时候我们自己做个小网站 xff0c 或者开发微信公众号做测试时 xff0c 因为没有公网ip而犯难 xff0c 毕竟买一台云服务器带独立ip的 xff0c 加上域名是一笔不小的开支 这时如果有一个内网穿透工具 xff0c 让自己本地电脑充
  • 权限管理系统【SpringBoot + Vue + SpringSecurity】

    文章目录 项目介绍技术选型环境要求项目结构表结构项目地址展示效果图 项目介绍 基于Springboot 构建的 前后端分离 通用权限管理系统 技术选型 后端技术 Spring Boot xff0c MyBatis plus xff0c Sp
  • JVM虚拟机【面试看这一篇就足够了】

    文章目录 前言内存结构说说JVM内存整体的结构 xff1f 线程私有还是共享的 xff1f 什么是程序计数器 xff08 线程私有 xff09 xff1f 什么是虚拟机栈 xff08 线程私有 xff09 xff1f 什么是本地方法栈 xf
  • 在Ubuntu18上用LibTorch(非darknet)部署YOLOv4的填坑之路(附源码)

    目录 坑一 xff1a 从官网下载的LibTorch库是不带torchvision的 坑二 xff1a Python的PIL库与opencv库在图像处理上的差异值得注意 坑三 xff1a LibTorch对tensor的各种变换操作度相比P
  • 锁升级过程(无锁、偏向锁、轻量级锁、重量级锁)

    文章目录 Synchronized锁升级的背景Synchronized的性能变化Java5之前 xff0c 用户态和内核态之间的切换为什么每个对象都可以称为一把锁 xff1f Java6开始优化Synchronized Synchroniz
  • String.format()的详细用法

    问题 在开发中一段字符串的中间某一部分需要可变的 如 xff1a 文本要展示 张三用户来自深圳 xff0c 年龄 18 xff0c 性别 男 其中的 张三 是用户名 xff0c 每个用户都是不一样的 xff1b 地区 深圳 为可变的Stri
  • Element实现行合并

    效果图 完整代码 span class token tag span class token tag span class token punctuation lt span template span span class token p
  • @EnableAsync @Async

    一直不太忙白线程池在实际应用中到底扮演什么样得角色 xff0c 有什么场景可以使用到 xff0c 只有真正做项目中使用到了才逐渐理解 使用多线程 xff0c 往往是创建Thread xff0c 或者是实现Runnable接口 xff0c 用
  • Java实现QQ邮箱发送给网易邮箱,发送邮件+附件

    实现功能 xff1a Java实现 QQ邮箱 给网易邮箱发送邮件获取邮件信息并下载邮件的附件 前置功能 案例以QQ邮箱为例说明 xff1a 首先登录QQ邮箱将SMTP服务开启 xff0c 会得到一个授权码 创建一个Springboot项目
  • kubernetes(v1.21.10)简介

    学习视频地址 xff1a https www bilibili com video BV13Q4y1C7hS 1 背景 1 部署方式的演变 传统部署时代 xff1a 在物理机服务器上运行应用程序 无法为应用程序定义资源边界 导致资源分配问题
  • Kubernetes(v1.21.10)集群安装

    视频中安装的是v1 20 9 xff0c 我们安装kubernetes的v1 21 10版本 1 环境规划 1 集群类型 Kubernetes 集群大致分为两类 xff1a 一主多从和多主多从 一主多从 xff08 单 master xff
  • Kubernetes(v1.21.10)实战入门与组件说明

    文章目录 一 资源管理1 资源管理介绍2 YAML语言介绍3 资源管理方式3 1 命令式对象管理kubectl命令资源类型 type 操作 command 3 2 命令式对象配置3 3 声明式对象配置3 4 总结 二 kubernetes组
  • 嵌入式系统(一):鸿蒙系统

    本文为期末复习笔记 xff0c 内容仅供参考 x1f600 鸿蒙系统是一款面向万物互联时代的 全新的分布式操作系统 鸿蒙提出了基于同一套系统能力 适配多种终端形态的分布式理念提供全场景 xff08 移动办公 运动健康 社交通信 指挥出行 媒
  • 【机组】--总线-例题

    例题1 某总线时钟频率为 66 M H z 66MHz 6 6 M H z xff0c 在一个
  • ROS:运行usb摄像头报错 No JPEG data found in image

    将usb cam功能包从GitHub上clone到ROS的工作空间 xff0c 编译后运行如下命令 xff1a rosrun usb cam usb cam node 然后报错如下 mjpeg 64 0x55e5f4e34120 No JP
  • breakpad简单使用

    breakpad简单使用 文章目录 1 breakpad简介2 源码下载3 源码编译3 1 编译遇到的问题 4 In Process测试程序 xff1a 4 1 测试程序编译4 2 生成sym文件4 3 产生minidump文件4 4 分析
  • 树莓派+PX4固件+T265+MAVROS+QGC实现室内定位

    树莓派 43 PX4固件 43 T265 43 MAVROS 43 QGC实现室内定位 整了整整两礼拜 终于稍微搞明白了一点PX4和MAVROS 因为APM固件下MISSIONPLANNER地面站只能windows下 觉得windows和U
  • Python调用sumo,解决自定义vehicle颜色等问题

    Python调用SUMO接口 xff0c 解决vehicle颜色设置问题 1 Python调用sumo 的traci接口 xff0c 通过 traci vehicle setColor进行设置 以下是 示例代码 span class tok
  • 反向散射通信

    原文 xff1a Ambient Backscatter Communications A Contemporary Survey 反向散射通信 反向散射通信系统根据其体系结构可分为三大类 xff1a a 单基地反向散射通信系统 xff08
  • ESP8266+Micropython+OLED网络天气和时钟

    在网上查了很多的资料 xff0c 打算做一个可以按键显示网络时间和天气预报的东西 手头有WeMos nodeMCU和I2C接口的OLED12864 xff0c 不打算用时钟模块 xff0c 因为ESP8266可以上网 xff0c 完全可以借