20 Commits

Author SHA1 Message Date
星光-k
2d9959cd77 Add files via upload 2025-02-08 11:58:02 +00:00
星光-k
10f8b8182b Delete bin/vendor/1 2025-02-08 19:57:27 +08:00
星光-k
469aec331a Add files via upload 2025-02-08 11:56:46 +00:00
星光-k
a8247c1932 Create 1 2025-02-08 19:55:48 +08:00
星光-k
f37acd5a20 Update install.sh 2025-02-08 19:20:25 +08:00
星光-k
6836c448be Update README.md 2025-02-08 19:18:32 +08:00
星光-k
2efc2c4f5d Update install.sh 2025-02-08 15:21:57 +08:00
星光-k
01f62f696b Update install.sh 2025-02-08 15:19:52 +08:00
星光-k
e8b3668ed7 更新 weather.py 2025-02-08 01:17:31 +00:00
星光-k
b840257988 更新 main.py 2025-02-08 01:12:39 +00:00
星光-k
3541ecc135 Update start.sh 2025-01-27 21:52:10 +08:00
星光-k
aa6df92479 更新 clock.py 2025-01-23 15:19:55 +00:00
星光-k
da65b28227 更新 main.py 2025-01-23 15:19:04 +00:00
星光-k
2c2de32b57 Update clock.py 2025-01-23 12:24:18 +08:00
星光-k
4e7cceaa72 Update clock.py 2025-01-23 12:20:25 +08:00
星光-k
1f00376e90 Update main.py 2025-01-23 12:13:22 +08:00
星光-k
41bf67d6fe Update weather.py 2025-01-23 11:10:15 +08:00
星光-k
d932daedd4 Update main.py 2025-01-23 10:55:42 +08:00
星光-k
ce705c6dd5 更新 main.py 2025-01-21 14:04:07 +00:00
星光-k
e420aa23a2 更新 main.py 2025-01-21 13:49:10 +00:00
23 changed files with 337 additions and 551 deletions

View File

@@ -1,5 +1,5 @@
# 墨水屏展示当前时间及天气数据
# 此分支专属于本人的个人设备实验分支以及备份
本项目复刻自[Seek-Huang](https://github.com/Seek-Huang/2.13-Ink-screen-clock)的代码仓库
并在此基础上进行改进
@@ -66,6 +66,7 @@ sudo reboot
--zh 设置系统语言为zh_CN,UTF-8
--cn 替换apt镜像源为中国镜像源
--gitcn 克隆中国仓库
--pip-offline pip依赖离线安装
--pisugar-wifi-conf 安装pisugar-wifi-conf
--pisugar-power-manager 安装pisugar-power-manager
--version <tag> 版本号(使用方法 --version + 仓库标签,格式例如 v1.x.x ,可以是主仓库main)
@@ -73,22 +74,29 @@ sudo reboot
```
###
```Bash
#中国源默认设置
#中国源默认设置(不加参数)
curl -sSL https://gitee.com/xingguangk/2.13-Ink-screen-clock/raw/main/bin/install.sh | sudo bash
```
```Bash
#中国源参数设置(不使用--debug参数)
curl -sSL https://gitee.com/xingguangk/2.13-Ink-screen-clock/raw/main/bin/install.sh | sudo bash -s -- --zh --cn --gitcn --pisugar-power-manager --pisugar-wifi-conf --version <tag>
#中国源参数设置(不使用--debug参数,替换cn镜像源,pip在线安装,不安装pisugar)
curl -sSL https://gitee.com/xingguangk/2.13-Ink-screen-clock/raw/main/bin/install.sh | sudo bash -s -- --zh --cn --gitcn --version <tag>
```
```Bash
#默认源默认设置
#中国源参数设置(不使用--debug参数,替换cn镜像源,pip依赖离线安装,不安装pisugar)
curl -sSL https://gitee.com/xingguangk/2.13-Ink-screen-clock/raw/main/bin/install.sh | sudo bash -s -- --zh --cn --gitcn --pip-offline --version <tag>
```
```Bash
#默认源默认设置(不加参数)
curl -sSL https://github.com/kxgx/2.13-Ink-screen-clock/raw/main/bin/install.sh | sudo bash
```
```Bash
#默认源全参数设置(不使用--debug参数)
curl -sSL https://github.com/kxgx/2.13-Ink-screen-clock/raw/main/bin/install.sh | sudo bash -s -- --zh --cn --gitcn --pisugar-power-manager --pisugar-wifi-conf --version <tag>
#默认源默认设置(不使用--debug参数,替换cn镜像源,pip在线安装,不安装pisugar)
curl -sSL https://github.com/kxgx/2.13-Ink-screen-clock/raw/main/bin/install.sh | sudo bash -s -- --zh --cn --gitcn --version <tag>
```
```Bash
#默认源默认设置(不使用--debug参数,替换cn镜像源,pip依赖离线安装,不安装pisugar)
curl -sSL https://github.com/kxgx/2.13-Ink-screen-clock/raw/main/bin/install.sh | sudo bash -s -- --zh --cn --gitcn --pip-offline --version <tag>
```
## 需要安装的软件和依赖:
参考
微雪电子 https://www.waveshare.net/wiki/2.13inch_e-Paper_HAT+#Raspberry_Pi

View File

@@ -10,32 +10,37 @@ from threading import Timer
import requests
white = 255 #颜色
black = 0
logging.basicConfig(level=logging.DEBUG)
logging.basicConfig(level=logging.INFO)
################################引入配置文件开始################################################
picdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'pic')
libdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'lib')
if os.path.exists(libdir):
sys.path.append(libdir)#将引入文件添加到环境变量
from waveshare_epd import epd2in13_V4 #引入墨水屏驱动文件
if os.path.exists(libdir):
sys.path.append(libdir) # 将引入文件添加到环境变量
from waveshare_epd import epd2in13_V4 # 引入墨水屏驱动文件
logging.debug("Loading Fonts")
font01 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 20) #字体文件
font02 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 15) #字体文件
font03 = ImageFont.truetype(os.path.join(picdir, 'DSEG7Modern-Bold.ttf'), 66) #字体文件
font04 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 10) #字体文件
font05 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 12) #字体文件
font06 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 13) #字体文件
font01 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 20) # 字体文件
font02 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 15) # 字体文件
font03 = ImageFont.truetype(os.path.join(picdir, 'DSEG7Modern-Bold.ttf'), 66) # 字体文件
font04 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 10) # 字体文件
font05 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 12) # 字体文件
font06 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 13) # 字体文件
################################引入配置文件结束################################################
def Local_strong_brush(): #局部强制刷新显示
i = 0
while i < 5:
epd.displayPartial(epd.getbuffer(info_image.rotate(180)))#局刷开始
i = i + 1
def get_date():#返回当前年月日及星期几
def Local_strong_brush(): # 局部强制刷新显示
i = 0
while i < 5:
epd.displayPartial(epd.getbuffer(info_image.rotate(180))) # 局刷开始
i += 1
def get_date(): # 返回当前年月日及星期几
date = datetime.datetime.now()
today=LunarDate.today()
week_day_dict = {0: '星期一',1: '星期二',2: '星期三',3: '星期四',4: '星期五',5: '星期六',6: '星期日',}
today = LunarDate.today()
week_day_dict = {0: '星期一', 1: '星期二', 2: '星期三', 3: '星期四', 4: '星期五', 5: '星期六', 6: '星期日'}
day = date.weekday()
return time.strftime('%Y年%m月%d')+''+week_day_dict[day]+''+today.strftime('农历%M月%D')
return time.strftime('%Y年%m月%d') + '' + week_day_dict[day] + '' + today.strftime('农历%M月%D')
# 定义一个全局标志变量,用于检查是否已经设置了系统时间或尝试过设置
has_set_system_time = False
@@ -74,7 +79,7 @@ def set_system_time_from_hwclock(utc=True):
# 检查时间是否发生了倒退
if after_time < before_time:
logging.warning(f"Time went backwards after hwclock call: before={before_time}, after={after_time}")
logging.info(f"Time went backwards after hwclock call: before={before_time}, after={after_time}")
return True
except subprocess.CalledProcessError as e:
@@ -97,92 +102,106 @@ def get_time():
current_time = time.strftime('%H:%M').upper()
logging.debug(f"Returning current time: {current_time}")
return current_time
def Get_ipv4_address(): # 获取当前的IP地址
try:
ip_output = subprocess.check_output(
"hostname -I | grep -oE '[0-9]{1,3}(\.[0-9]{1,3}){3}'", shell=True).decode('utf-8').strip()
ip_list = ip_output.split()
filtered_ips = [ip for ip in ip_list if not ip.startswith("172.")]
return filtered_ips[0] if filtered_ips else "地址获取失败"
except subprocess.CalledProcessError:
return "获取失败"
def CPU_temperature():#CPU温度获取
temperatura = os.popen('vcgencmd measure_temp').readline()
temperatura = temperatura.replace('temp=','').strip()
return str(temperatura)
def Memory_footprint():#显示内存占用百分比
return(subprocess.check_output(u"free -m | awk -F '[ :]+' 'NR==2{printf \"%d\", ($3)/$2*100}'", shell = True ).decode('gbk'))
def CPU_usage(): #显示CPU占用百分比
return(str(int(float(os.popen("top -b -n1 | awk '/Cpu\(s\):/ {print $2}'").readline().strip()))))
def power_battery():#获取当前电池电量
return(str(int(subprocess.check_output(u"echo \"get battery\" | nc -q 0 127.0.0.1 8423|awk -F':' '{print int($2)}'", shell = True ).decode('gbk')))+u'%')
def Get_address(): # 获取当前的IP地址
return subprocess.check_output(u"hostname -I | cut -d' ' -f1 | head --bytes -1", shell=True).decode('gbk').strip()
def CPU_temperature(): # CPU温度获取
temperatura = os.popen('vcgencmd measure_temp').readline()
temperatura = temperatura.replace('temp=', '').strip()
return str(temperatura)
def Memory_footprint(): # 显示内存占用百分比
return subprocess.check_output(u"free -m | awk -F '[ :]+' 'NR==2{printf \"%d\", ($3)/$2*100}'", shell=True).decode('gbk')
def CPU_usage(): # 显示CPU占用百分比
return str(int(float(os.popen("top -b -n1 | awk '/Cpu\(s\):/ {print $2}'").readline().strip())))
def power_battery(): # 获取当前电池电量
return str(int(subprocess.check_output(u"echo \"get battery\" | nc -q 0 127.0.0.1 8423|awk -F':' '{print int($2)}'", shell=True).decode('gbk'))) + u'%'
# 打印电量信息
print(power_battery())
def Bottom_edge(): #在图片中添加底边内容
draw.rectangle((0, 105, 250, 122), 'black', 'black')
'''电池图标画图'''
draw.line((126,109,154,109),fill=255, width=1) #电池顶边
draw.line((126,110,126,119),fill=255, width=1) #电池左边
draw.line((127,119,154,119),fill=255, width=1) #电池
draw.line((154,110,154,118),fill=255, width=1)
draw.line((155,112,157,112),fill=255, width=1)
draw.line((155,116,157,116),fill=255, width=1)
draw.line((157,113,157,115),fill=255, width=1)
global power_str
power_str=power_battery()
draw.text((128,108),power_str,font = font04,fill =255) #显示当前电量百分比
'''电池图标画图'''
draw.ellipse((192, 107, 207, 120), 0, 255)# 时钟图标
draw.line((199,109,199,114),fill=255, width=1)
draw.line((200,114,204,114),fill=255, width=1)
global local_addr #获取当前IP地址
local_addr= Get_ipv4_address() #获取当前IP地址
draw.text((10,107),"IP:"+local_addr,font = font05,fill =255)#显示当前IP地址
def Basic_refresh(): #全刷函数
logging.info("Refresh and prepare the basic content before starting the canvas")#开始画布前刷新准备基础内容
def Bottom_edge(): # 在图片中添加底边内容
draw.rectangle((0, 105, 250, 122), 'black', 'black')
'''电池图标画图'''
draw.line((126, 109, 154, 109), fill=255, width=1) # 电池
draw.line((126, 110, 126, 119), fill=255, width=1) # 电池左边
draw.line((127, 119, 154, 119), fill=255, width=1) # 电池下边
draw.line((154, 110, 154, 118), fill=255, width=1)
draw.line((155, 112, 157, 112), fill=255, width=1)
draw.line((155, 116, 157, 116), fill=255, width=1)
draw.line((157, 113, 157, 115), fill=255, width=1)
global power_str
power_str = power_battery()
draw.text((128, 108), power_str, font=font04, fill=255) # 显示当前电量百分比
'''电池图标画图'''
draw.ellipse((192, 107, 207, 120), 0, 255) # 时钟图标
draw.line((199, 109, 199, 114), fill=255, width=1)
draw.line((200, 114, 204, 114), fill=255, width=1)
global local_addr # 获取当前IP地址
local_addr = Get_address() # 获取当前IP地址
draw.text((10, 107), "IP:" + local_addr, font=font05, fill=255) # 显示当前IP地址
def Basic_refresh(): # 全刷函数
logging.info("Refresh and prepare the basic content before starting the canvas") # 开始画布前刷新准备基础内容
global get_date_var
get_date_var=get_date() #记录开始数据
draw.text((2,2),get_date_var,font = font02,fill =0)#将日期及星期几显示到屏幕
get_date_var = get_date() # 记录开始数据
draw.text((2, 2), get_date_var, font=font02, fill=0) # 将日期及星期几显示到屏幕
global local_time
local_time=get_time()
draw.text((5,40),local_time,font = font03,fill =0)#显示当前时间
Bottom_edge() #添加底边内容
local_time = get_time()
draw.text((5, 28), local_time, font=font03, fill=0) # 显示当前时间
Bottom_edge() # 添加底边内容
epd.display(epd.getbuffer(info_image.rotate(180)))
def Partial_full_brush(): #局部定时全刷函数
Basic_refresh() #全局刷新
logging.debug("局部定时全局刷新")
epd.init()
def Partial_refresh():#局刷函数
logging.info("Partial content update, this update is recommended to be synchronized with the minute to save the life of the ink screen")#局部内容更新,此更新建议与分钟同步,以节省墨水屏寿命
epd.displayPartBaseImage(epd.getbuffer(info_image.rotate(180)))
epd.init()
while (True):
global local_time
local_time1=get_time()
if (local_time1==local_time) ==False:
draw.rectangle((5, 17, 133, 95), fill = 255) #时间局刷区域
draw.text((5,17),local_time1,font = font03,fill =0)#刷新当前时间
local_time=local_time1
Local_strong_brush() #局部强刷
get_date_var1=get_date() #局刷判断,如果时间与前一次不一致说明内容变化,需要刷新显示
global get_date_var #再次声明这个是全局变量
if(get_date_var1==get_date_var) ==False:
draw.rectangle((2, 2, 250, 16), fill = 255) #设置头部刷新区域
draw.text((2,2),get_date_var1,font = font02,fill =0)#将日期及星期几刷新显示到屏幕
get_date_var=get_date_var1 #将更新的值保存到初始变量,直到下一次变化时执行该刷新操作
logging.debug("头部日期部位发生刷新变化.")
Local_strong_brush() #局部强刷
global local_addr #当前IP地址
local_addr1 = Get_ipv4_address()
if (local_addr1==local_addr) ==False:
draw.rectangle((1, 107, 94, 120), fill = 0) #设置头部刷新区域
draw.text((10,107),"IP:"+local_addr1,font = font05,fill =255)#显示当前IP地址
local_addr=local_addr1
Local_strong_brush() #局部强刷
#显示当前电量百分比
power_str=power_str1
Local_strong_brush() #局部强刷
logging.debug("电源电量局部刷新")
def Partial_full_brush(): # 局部定时全刷函数
Basic_refresh() # 全局刷新
logging.debug("局部定时全局刷新")
epd.init()
def Partial_refresh(): # 局刷函数
logging.info(
"Partial content update, this update is recommended to be synchronized with the minute to save the life of the ink screen") # 局部内容更新,此更新建议与分钟同步,以节省墨水屏寿命
epd.displayPartBaseImage(epd.getbuffer(info_image.rotate(180)))
epd.init()
while True:
global local_time
local_time1 = get_time()
if local_time1 != local_time:
draw.rectangle((5, 28, 133, 95), fill=255) # 时间局刷区域
draw.text((5, 28), local_time1, font=font03, fill=0) # 刷新当前时间
local_time = local_time1
Local_strong_brush() # 局部强刷
get_date_var1 = get_date() # 局刷判断,如果时间与前一次不一致说明内容变化,需要刷新显示
global get_date_var # 再次声明这个是全局变量
if get_date_var1 != get_date_var:
draw.rectangle((2, 2, 250, 16), fill=255) # 设置头部刷新区域
draw.text((2, 2), get_date_var1, font=font02, fill=0) # 将日期及星期几刷新显示到屏幕
get_date_var = get_date_var1 # 将更新的值保存到初始变量,直到下一次变化时执行该刷新操作
logging.debug("头部日期部位发生刷新变化.")
Local_strong_brush() # 局部强刷
global local_addr # 当前IP地址
local_addr1 = Get_address()
if local_addr1 != local_addr:
draw.rectangle((1, 107, 94, 120), fill=0) # 设置头部刷新区域
draw.text((10, 107), "IP:" + local_addr1, font=font05, fill=255) # 显示当前IP地址
local_addr = local_addr1
Local_strong_brush() # 局部强刷
# 显示当前电量百分比
global power_str
power_str1 = power_battery()
power_str = power_str1
Local_strong_brush() # 局部强刷
retry_interval = 180 # 设置重试间隔时间(秒)
while True:

View File

@@ -18,6 +18,8 @@ USE_CN_GIT=false
USE_PISUGAR_WIFI_CONF=false
# 检查是否安装pisugar-power-manager
USE_PISUGAR_POWER_MANAGER=false
# 检查是否使用离线安装pip依赖
USE_OFFLINE_PIP=false
# 解析命令行参数
while [ "$#" -gt 0 ]; do
@@ -31,6 +33,9 @@ while [ "$#" -gt 0 ]; do
--gitcn)
USE_CN_GIT=true
;;
--pip-offline)
USE_OFFLINE_PIP=true
;;
--pisugar-wifi-conf)
USE_PISUGAR_WIFI_CONF=true
;;
@@ -203,23 +208,7 @@ install_packages() {
fi
}
# 安装pip包函数
install_pip_packages() {
echo "正在安装pip软件包"
if ! sudo pip3 install -i "$PIPY_MIRROR" spidev borax pillow requests Flask; then
echo "pip软件包安装失败如果是最新版系统或是非lite系统" >&2
echo "请手动运行sudo pip3 install -i "$PIPY_MIRROR" spidev borax pillow requests --break-system-packages" >&2
exit 1
fi
}
# 复制服务文件并设置为开机启动
setup_service() {
local service_path="raspi_e-Paper.service"
local service1_path="e-Paper_clean.service"
local service_file_path="$HOME/2.13-Ink-screen-clock/bin/$service_path"
local service1_file_path="$HOME/2.13-Ink-screen-clock/bin/$service1_path"
install_Ink-screen-clock() {
# 检查墨水屏时钟仓库是否存在
if [ ! -d "$HOME/2.13-Ink-screen-clock" ]; then
echo "正在克隆仓库"
@@ -234,6 +223,41 @@ setup_service() {
else
echo "仓库文件夹已存在,跳过克隆"
fi
}
# 安装pip包函数
install_oline_pip_packages() {
echo "正在安装pip软件包"
if ! sudo pip3 install -i "$PIPY_MIRROR" -r "$HOME/2.13-Ink-screen-clock/bin/requirements.txt"; then
echo "pip软件包安装失败如果是最新版系统或是非lite系统" >&2
echo "请手动运行sudo pip3 install -i "$PIPY_MIRROR" -r "$HOME/2.13-Ink-screen-clock/bin/requirements.txt" --break-system-packages" >&2
exit 1
fi
}
install_offline_pip_packages() {
echo "正在安装pip软件包"
if ! sudo pip3 install --no-index --find-links="$HOME/2.13-Ink-screen-clock/bin/vendor" -r "$HOME/2.13-Ink-screen-clock/bin/requirements.txt"; then
echo "pip软件包安装失败如果是最新版系统或是非lite系统" >&2
echo "请手动运行sudo pip3 install --no-index --find-links="$HOME/2.13-Ink-screen-clock/bin/vendor" -r "$HOME/2.13-Ink-screen-clock/bin/requirements.txt" --break-system-packages" >&2
exit 1
fi
}
install_pip_packages() {
if [ "$USE_OFFLINE_PIP" = true ]; then
install_offline_pip_packages
else
install_oline_pip_packages
fi
}
# 复制服务文件并设置为开机启动
setup_service() {
local service_path="raspi_e-Paper.service"
local service1_path="e-Paper_clean.service"
local service_file_path="$HOME/2.13-Ink-screen-clock/bin/$service_path"
local service1_file_path="$HOME/2.13-Ink-screen-clock/bin/$service1_path"
# 检查服务文件是否存在
if [ -f "$service_file_path" ] && [ -f "$service1_file_path" ]; then
@@ -306,6 +330,7 @@ if [ -f /etc/debian_version ]; then
echo "执行Debian 11 (Bullseye) 相关操作"
update_sources_list "bullseye"
install_packages
install_Ink-screen-clock
install_pip_packages
setup_service
#install_webui
@@ -316,6 +341,7 @@ if [ -f /etc/debian_version ]; then
echo "执行Debian 12 (Bookworm) 相关操作"
update_sources_list "bookworm"
install_packages
install_Ink-screen-clock
install_pip_packages
setup_service
#install_webui

View File

@@ -1,37 +1,35 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from PIL import Image,ImageDraw,ImageFont #引入图片处理库
import os,sys,re,json,time,datetime #引入系统相关库
from borax.calendars.lunardate import LunarDate #农历日期以及天干地支纪年法的 Python 库
import logging #日志库
from PIL import Image, ImageDraw, ImageFont # 引入图片处理库
import os, sys, json, time, datetime # 引入系统相关库
from borax.calendars.lunardate import LunarDate # 农历日期以及天干地支纪年法的 Python 库
import logging # 日志库
import subprocess
import os
from threading import Timer
import requests
import socket
white = 255 #颜色
white = 255 # 颜色
black = 0
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s')
################################引入配置文件开始################################################
picdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'pic')
libdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'lib')
if os.path.exists(libdir):
sys.path.append(libdir)#将引入文件添加到环境变量
from waveshare_epd import epd2in13_V4 #引入墨水屏驱动文件
if os.path.exists(libdir):
sys.path.append(libdir) # 将引入文件添加到环境变量
from waveshare_epd import epd2in13_V4 # 引入墨水屏驱动文件
logging.debug("Loading Fonts")
font01 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 20) #字体文件
font02 = ImageFont.truetype(os.path.join(picdir, 'GB2312.ttf'), 15) #字体文件
font03 = ImageFont.truetype(os.path.join(picdir, 'Fonttt.ttf'), 48) #字体文件
font02 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 15) #字体文件
font03 = ImageFont.truetype(os.path.join(picdir, 'DSEG7Modern-Bold.ttf'), 38) #字体文件
font04 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 10) #字体文件
font05 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 12) #字体文件
font06 = ImageFont.truetype(os.path.join(picdir, '原神cn.ttf'), 13) #字体文件
font06 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 13) #字体文件
################################引入配置文件结束################################################
def Local_strong_brush(): #局部强制刷新显示
i = 0
while i < 5:
epd.displayPartial(epd.getbuffer(info_image.rotate(180)))#局刷开始
i = i + 1
def Local_strong_brush(): # 局部强制刷新显示
for _ in range(5):
epd.displayPartial(epd.getbuffer(info_image.rotate(180)))
def get_date(): # 返回当前年月日及星期几
date = datetime.datetime.now()
today = LunarDate.today()
@@ -139,157 +137,142 @@ def power_battery(): # 获取当前电池电量
new_power = last_power # 未到更新时间,使用缓存值
return new_power
# 打印电量信息
print(power_battery())
def Bottom_edge(): #在图片中添加底边内容
draw.rectangle((0, 105, 250, 122), 'black', 'black')
'''电池图标画图'''
draw.line((126,109,154,109),fill=255, width=1) #电池
draw.line((126,110,126,119),fill=255, width=1) #电池左边
draw.line((127,119,154,119),fill=255, width=1) #电池下边
draw.line((154,110,154,118),fill=255, width=1)
draw.line((155,112,157,112),fill=255, width=1)
draw.line((155,116,157,116),fill=255, width=1)
draw.line((157,113,157,115),fill=255, width=1)
global power_str
power_str=power_battery()
draw.text((129,108),power_str,font = font04,fill =255) #显示当前电量百分比
'''电池图标画图'''
draw.ellipse((192, 107, 207, 120), 0, 255)# 时钟图标
draw.line((199,109,199,114),fill=255, width=1)
draw.line((200,114,204,114),fill=255, width=1)
global local_addr #获取当前IP地址
local_addr= Get_ipv4_address() #获取当前IP地址
draw.text((10,107),"IP:"+local_addr,font = font05,fill =255)#显示当前IP地址
def Weather(): #在图片中添加天气内容
Weather_json = open('/root/2.13-Ink-screen-clock/bin/weather.json','r')
Weather_data = Weather_json.read()
Weather_json.close()
Weather_text=json.loads(Weather_data)
global Weather_position
global temperature
global weather
global wind_direction
global weather_update
global weather_date
global humidity
Weather_position = Weather_text['cityname'] #定位位置
temperature=Weather_text['temp']+u'°C' #温度
weather = Weather_text['weather'] #天气情况
wind_direction = Weather_text['WD'] #风向
weather_update = Weather_text['time'] #天气更新时间
weather_date = Weather_text['date'] #日期
humidity = Weather_text['SD'] #湿度
draw.text((150,25),"天气:",font = font06,fill =0)#显示当前天气前缀
draw.text((150,45),"温度:",font = font06,fill =0)#显示当前温度前缀
draw.text((150,65),"湿度:",font = font06,fill =0)#显示当前湿度前缀
draw.text((150,85),"城市:",font = font06,fill =0)#显示当前城市前缀
draw.text((191,25),weather,font = font06,fill =0)
draw.text((191,45),temperature,font = font06,fill =0)
draw.text((191,65),humidity,font = font06,fill =0)
draw.text((191,85),Weather_position,font = font06,fill =0)
draw.text((211,107),weather_update,font = font05,fill =255) #显示天气更新时间
def Bottom_edge(): # 在图片中添加底边内容
draw.rectangle((0, 105, 250, 122), 'black', 'black')
'''电池图标画图'''
draw.line((126, 109, 154, 109), fill=255, width=1) # 电池顶边
draw.line((126, 110, 126, 119), fill=255, width=1) # 电池左边
draw.line((127, 119, 154, 119), fill=255, width=1) # 电池
draw.line((154, 110, 154, 118), fill=255, width=1)
draw.line((155, 112, 157, 112), fill=255, width=1)
draw.line((155, 116, 157, 116), fill=255, width=1)
draw.line((157, 113, 157, 115), fill=255, width=1)
global power_str
power_str = power_battery()
draw.text((129, 108), power_str, font=font04, fill=255) # 显示当前电量百分比
'''电池图标画图'''
draw.ellipse((192, 107, 207, 120), 0, 255) # 时钟图标
draw.line((199, 109, 199, 114), fill=255, width=1)
draw.line((200, 114, 204, 114), fill=255, width=1)
global local_addr # 获取当前IP地址
local_addr = Get_ipv4_address() # 获取当前IP地址
draw.text((10, 107), f"IP:{local_addr}", font=font05, fill=255) # 显示当前IP地址
def Basic_refresh(): #全刷函数
logging.info("在启动画布之前,刷新并准备基本内容")#开始画布前刷新准备基础内容
def Weather(): # 在图片中添加天气内容
with open('/root/2.13-Ink-screen-clock/bin/weather.json', 'r') as file:
weather_data = json.load(file)
global Weather_position, temperature, weather, wind_direction, weather_update, weather_date, humidity
Weather_position = weather_data['cityname'] # 定位位置
temperature = weather_data['temp'] + u'°C' # 温度
weather = weather_data['weather'] # 天气情况
wind_direction = weather_data['WD'] # 风向
weather_update = weather_data['time'] # 天气更新时间
weather_date = weather_data['date'] # 日期
humidity = weather_data['SD'] # 湿度
draw.text((150, 25), "天气:", font=font06, fill=0) # 显示当前天气前缀
draw.text((150, 45), "温度:", font=font06, fill=0) # 显示当前温度前缀
draw.text((150, 65), "湿度:", font=font06, fill=0) # 显示当前湿度前缀
draw.text((150, 85), "城市:", font=font06, fill=0) # 显示当前城市前缀
draw.text((191, 25), weather, font=font06, fill=0)
draw.text((191, 45), temperature, font=font06, fill=0)
draw.text((191, 65), humidity, font=font06, fill=0)
draw.text((191, 85), Weather_position, font=font06, fill=0)
draw.text((211, 107), weather_update, font=font05, fill=255) # 显示天气更新时间
def Basic_refresh(): # 全刷函数
logging.info("在启动画布之前,刷新并准备基本内容") # 开始画布前刷新准备基础内容
global get_date_var
get_date_var=get_date() #记录开始数据
draw.text((2,2),get_date_var,font = font02,fill =0)#将日期及星期几显示到屏幕
get_date_var = get_date() # 记录开始数据
draw.text((2, 2), get_date_var, font=font02, fill=0) # 将日期及星期几显示到屏幕
global local_time
local_time=get_time()
draw.text((5,28),local_time,font = font03,fill =0)#显示当前时间
Bottom_edge() #添加底边内容
Weather() #天气内容
local_time = get_time()
draw.text((5, 40), local_time, font=font03, fill=0) # 显示当前时间
Bottom_edge() # 添加底边内容
Weather() # 天气内容
epd.display(epd.getbuffer(info_image.rotate(180)))
def Partial_full_brush(): #局部定时全刷函数
Basic_refresh() #全局刷新
logging.debug("局部定时全局刷新")
epd.init()
def Partial_refresh():#局刷函数
logging.info("部分内容更新,此更新建议与分钟同步,以节省墨水屏的使用寿命")#局部内容更新,此更新建议与分钟同步,以节省墨水屏寿命
epd.displayPartBaseImage(epd.getbuffer(info_image.rotate(180)))
epd.init()
while (True):
global local_time
local_time1=get_time()
if (local_time1==local_time) ==False:
draw.rectangle((5, 28, 149, 82), fill = 255) #时间局刷区域
draw.text((5,28),local_time1,font = font03,fill =0)#刷新当前时间
local_time=local_time1
Local_strong_brush() #局部强刷
get_date_var1=get_date() #局刷判断,如果时间与前一次不一致说明内容变化,需要刷新显示
global get_date_var #再次声明这个是全局变量
if(get_date_var1==get_date_var) ==False:
draw.rectangle((2, 2, 250, 16), fill = 255) #设置头部刷新区域
draw.text((2,2),get_date_var1,font = font02,fill =0)#将日期及星期几刷新显示到屏幕
get_date_var=get_date_var1 #将更新的值保存到初始变量,直到下一次变化时执行该刷新操作
logging.debug("头部日期部位发生刷新变化.")
Local_strong_brush() #局部强刷
global local_addr #当前IP地址
local_addr1 = Get_ipv4_address()
if (local_addr1==local_addr) ==False:
draw.rectangle((1, 107, 123, 120), fill = 0) #设置头部刷新区域
draw.text((10,107),"IP:"+local_addr1,font = font05,fill =255)#显示当前IP地址
local_addr=local_addr1
Local_strong_brush() #局部强刷
'''天气局部更新函数'''
Weather_json = open('/root/2.13-Ink-screen-clock/bin/weather.json','r')
Weather_data = Weather_json.read()
Weather_json.close()
Weather_text=json.loads(Weather_data)
global Weather_position
global temperature
global weather
global wind_direction
global weather_update
global weather_date
global humidity
Weather_position1 = Weather_text['cityname'] #定位位置
temperature1=Weather_text['temp']+u'°C' #温度
weather11 = Weather_text['weather'] #天气情况
wind_direction1 = Weather_text['WD'] #风向
weather_update1 = Weather_text['time'] #天气更新时间
weather_date1 = Weather_text['date'] #日期
humidity1 = Weather_text['SD'] #湿度
if (weather11==weather) ==False:
draw.rectangle((191, 25, 249, 38), fill = 255) #天气局刷区域
draw.text((191,25),weather11,font = font06,fill =0)
weather=weather11
logging.info("天气局部刷新")
Local_strong_brush() #局部强刷
if (temperature1==temperature) ==False:
draw.rectangle((191, 45, 249, 57), fill = 255) #局刷区域
draw.text((191,45),temperature1,font = font06,fill =0)
temperature=temperature1
logging.info("温度局部刷新")
Local_strong_brush() #局部强刷
if (humidity1==humidity) ==False:
draw.rectangle((191, 65, 249, 77), fill = 255) #局刷区域
draw.text((191,65),humidity1,font = font06,fill =0)
humidity = humidity1
logging.info("湿度局部刷新")
Local_strong_brush() #局部强刷
if (Weather_position1==Weather_position) ==False:
draw.rectangle((191, 85, 249, 98), fill = 255) #局刷区域
draw.text((191,85),Weather_position1,font = font06,fill =0)
Weather_position = Weather_position1
logging.info("城市局部刷新")
Local_strong_brush() #局部强刷
if (weather_update1==weather_update) ==False:
draw.rectangle((211, 107, 248, 118), fill = 0) #设置更新时间刷新区域
draw.text((211,107),weather_update1,font = font05,fill =255) #显示天气更新时间
weather_update=weather_update1
logging.info("天气更新时间局部刷新")
Local_strong_brush() #局部强刷
'''天气局部更新函数'''
global power_str
power_str1 =power_battery()
if (power_str1==power_str) ==False:
draw.rectangle((128, 110, 153, 117), fill = 0) #设置更新时间刷新区域
draw.text((129,108),power_battery(),font = font04,fill =255) #显示当前电量百分比
power_str=power_str1
Local_strong_brush() #局部强刷
# logging.info("电池电量局部刷新")
def Partial_full_brush(): # 局部定时全刷函数
Basic_refresh() # 全局刷新
logging.debug("局部定时全局刷新")
def Partial_refresh(): # 局刷函数
logging.info("部分内容更新,此更新建议与分钟同步,以节省墨水屏的使用寿命") # 局部内容更新,此更新建议与分钟同步,以节省墨水屏寿命
epd.displayPartBaseImage(epd.getbuffer(info_image.rotate(180)))
epd.init()
while True:
global local_time
local_time1 = get_time()
if local_time1 != local_time:
draw.rectangle((5, 40, 133, 82), fill=255) # 时间局刷区域
draw.text((5, 40), local_time1, font=font03, fill=0) # 刷新当前时间
local_time = local_time1
Local_strong_brush() # 局部强刷
get_date_var1 = get_date() # 局刷判断,如果时间与前一次不一致说明内容变化,需要刷新显示
global get_date_var # 再次声明这个是全局变量
if get_date_var1 != get_date_var:
draw.rectangle((2, 2, 250, 16), fill=255) # 设置头部刷新区域
draw.text((2, 2), get_date_var1, font=font02, fill=0) # 将日期及星期几刷新显示到屏幕
get_date_var = get_date_var1 # 将更新的值保存到初始变量,直到下一次变化时执行该刷新操作
logging.debug("头部日期部位发生刷新变化.")
Local_strong_brush() # 局部强刷
global local_addr # 当前IP地址
local_addr1 = Get_ipv4_address()
if local_addr1 != local_addr:
draw.rectangle((1, 107, 123, 120), fill=0) # 设置头部刷新区域
draw.text((10, 107), f"IP:{local_addr1}", font=font05, fill=255) # 显示当前IP地址
local_addr = local_addr1
Local_strong_brush() # 局部强刷
'''天气局部更新函数'''
with open('/root/2.13-Ink-screen-clock/bin/weather.json', 'r') as file:
weather_data = json.load(file)
global Weather_position, temperature, weather, wind_direction, weather_update, weather_date, humidity
Weather_position1 = weather_data['cityname'] # 定位位置
temperature1 = weather_data['temp'] + u'°C' # 温度
weather11 = weather_data['weather'] # 天气情况
humidity1 = weather_data['SD'] # 湿度
weather_update1 = weather_data['time'] # 天气更新时间
if weather11 != weather:
draw.rectangle((191, 25, 249, 38), fill=255) # 天气局刷区域
draw.text((191, 25), weather11, font=font06, fill=0)
weather = weather11
logging.info("天气局部刷新")
Local_strong_brush() # 局部强刷
if temperature1 != temperature:
draw.rectangle((191, 45, 249, 57), fill=255) # 局刷区域
draw.text((191, 45), temperature1, font=font06, fill=0)
temperature = temperature1
logging.info("温度局部刷新")
Local_strong_brush() # 局部强刷
if humidity1 != humidity:
draw.rectangle((191, 65, 249, 77), fill=255) # 局刷区域
draw.text((191, 65), humidity1, font=font06, fill=0)
humidity = humidity1
logging.info("湿度局部刷新")
Local_strong_brush() # 局部强刷
if Weather_position1 != Weather_position:
draw.rectangle((191, 85, 249, 98), fill=255) # 局刷区域
draw.text((191, 85), Weather_position1, font=font06, fill=0)
Weather_position = Weather_position1
logging.info("城市局部刷新")
Local_strong_brush() # 局部强刷
if weather_update1 != weather_update:
draw.rectangle((211, 107, 248, 118), fill=0) # 设置更新时间刷新区域
draw.text((211, 107), weather_update1, font=font05, fill=255) # 显示天气更新时间
weather_update = weather_update1
logging.info("天气更新时间局部刷新")
Local_strong_brush() # 局部强刷
'''天气局部更新函数'''
global power_str
power_str1 = power_battery()
if power_str1 != power_str:
draw.rectangle((128, 110, 153, 117), fill=0) # 设置更新时间刷新区域
draw.text((129, 108), power_str1, font=font04, fill=255) # 显示当前电量百分比
power_str = power_str1
Local_strong_brush() # 局部强刷
retry_interval = 180 # 设置重试间隔时间(秒)
while True:

View File

@@ -1,258 +0,0 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from PIL import Image,ImageDraw,ImageFont #引入图片处理库
import os,sys,re,json,time,datetime #引入系统相关库
from borax.calendars.lunardate import LunarDate #农历日期以及天干地支纪年法的 Python 库
import logging #日志库
import subprocess
import os
from threading import Timer
import requests
import socket
white = 255 #颜色
black = 0
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s')
################################引入配置文件开始################################################
picdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'pic')
libdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'lib')
if os.path.exists(libdir):
sys.path.append(libdir)#将引入文件添加到环境变量
from waveshare_epd import epd2in13_V4 #引入墨水屏驱动文件
logging.debug("Loading Fonts")
font01 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 20) #字体文件
font02 = ImageFont.truetype(os.path.join(picdir, 'GB2312.ttf'), 15) #字体文件
font03 = ImageFont.truetype(os.path.join(picdir, 'Fonttt.ttf'), 48) #字体文件
font04 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 10) #字体文件
font05 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 12) #字体文件
font06 = ImageFont.truetype(os.path.join(picdir, '原神cn.ttf'), 13) #字体文件
################################引入配置文件结束################################################
def Local_strong_brush(): #局部强制刷新显示
i = 0
while i < 5:
epd.displayPartial(epd.getbuffer(info_image.rotate(180)))#局刷开始
i = i + 1
def get_date():#返回当前年月日及星期几
date = datetime.datetime.now()
today=LunarDate.today()
week_day_dict = {0: '星期一',1: '星期二',2: '星期三',3: '星期四',4: '星期五',5: '星期六',6: '星期日',}
day = date.weekday()
return time.strftime('%Y年%m月%d日')+''+week_day_dict[day]+''+today.strftime('农历%M月%D')
def get_time():#返回当前时间,不到秒,大写
return time.strftime('%H:%M')
def Get_address():#获取当前的IP地址
return (subprocess.check_output(u"hostname -I | cut -d\' \' -f1 | head --bytes -1", shell = True ).decode('gbk'))
def Get_ipv4_address(): # 获取当前的IP地址
try:
# 执行命令获取IP地址并处理输出以仅返回IPv4地址
ip_output = subprocess.check_output("hostname -I | grep -oE '[0-9]{1,3}(\.[0-9]{1,3}){3}'", shell=True).decode('utf-8').strip()
# 分割输出以获取单个IP地址列表
ip_list = ip_output.split()
# 过滤掉以172开头的IP地址
filtered_ips = [ip for ip in ip_list if not ip.startswith("172.")]
# 如果有有效的IP地址返回第一个否则返回获取失败
if filtered_ips:
return filtered_ips[0]
else:
return "地址获取失败"
except subprocess.CalledProcessError as e:
#logging.error("获取IPv4地址失败: %s", e)
return "获取失败"
def CPU_temperature():#CPU温度获取
temperatura = os.popen('vcgencmd measure_temp').readline()
temperatura = temperatura.replace('temp=','').strip()
return str(temperatura)
def Memory_footprint():#显示内存占用百分比
return(subprocess.check_output(u"free -m | awk -F '[ :]+' 'NR==2{printf \"%d\", ($3)/$2*100}'", shell = True ).decode('gbk'))
def CPU_usage(): #显示CPU占用百分比
return(str(int(float(os.popen("top -b -n1 | awk '/Cpu\(s\):/ {print $2}'").readline().strip()))))
def power_battery():#获取当前电池电量
return(str(int(subprocess.check_output(u"echo \"get battery\" | nc -q 0 127.0.0.1 8423|awk -F':' '{print int($2)}'", shell = True ).decode('gbk')))+u'%')
# 打印电量信息
print(power_battery())
def Bottom_edge(): #在图片中添加底边内容
draw.rectangle((0, 105, 250, 122), 'black', 'black')
'''电池图标画图'''
draw.line((126,109,154,109),fill=255, width=1) #电池顶边
draw.line((126,110,126,119),fill=255, width=1) #电池左边
draw.line((127,119,154,119),fill=255, width=1) #电池下边
draw.line((154,110,154,118),fill=255, width=1)
draw.line((155,112,157,112),fill=255, width=1)
draw.line((155,116,157,116),fill=255, width=1)
draw.line((157,113,157,115),fill=255, width=1)
global power_str
power_str=power_battery()
draw.text((129,108),power_str,font = font04,fill =255) #显示当前电量百分比
'''电池图标画图'''
draw.ellipse((192, 107, 207, 120), 0, 255)# 时钟图标
draw.line((199,109,199,114),fill=255, width=1)
draw.line((200,114,204,114),fill=255, width=1)
global local_addr #获取当前IP地址
local_addr= Get_ipv4_address() #获取当前IP地址
draw.text((10,107),"IP:"+local_addr,font = font05,fill =255)#显示当前IP地址
def Weather(): #在图片中添加天气内容
Weather_json = open('/root/2.13-Ink-screen-clock/bin/weather.json','r')
Weather_data = Weather_json.read()
Weather_json.close()
Weather_text=json.loads(Weather_data)
global Weather_position
global temperature
global weather
global wind_direction
global weather_update
global weather_date
global humidity
Weather_position = Weather_text['cityname'] #定位位置
temperature=Weather_text['temp']+u'°C' #温度
weather = Weather_text['weather'] #天气情况
wind_direction = Weather_text['WD'] #风向
weather_update = Weather_text['time'] #天气更新时间
weather_date = Weather_text['date'] #日期
humidity = Weather_text['SD'] #湿度
draw.text((150,25),"天气:",font = font06,fill =0)#显示当前天气前缀
draw.text((150,45),"温度:",font = font06,fill =0)#显示当前温度前缀
draw.text((150,65),"湿度:",font = font06,fill =0)#显示当前湿度前缀
draw.text((150,85),"城市:",font = font06,fill =0)#显示当前城市前缀
draw.text((191,25),weather,font = font06,fill =0)
draw.text((191,45),temperature,font = font06,fill =0)
draw.text((191,65),humidity,font = font06,fill =0)
draw.text((191,85),Weather_position,font = font06,fill =0)
draw.text((211,107),weather_update,font = font05,fill =255) #显示天气更新时间
def Basic_refresh(): #全刷函数
logging.info("在启动画布之前,刷新并准备基本内容")#开始画布前刷新准备基础内容
global get_date_var
get_date_var=get_date() #记录开始数据
draw.text((2,2),get_date_var,font = font02,fill =0)#将日期及星期几显示到屏幕
global local_time
local_time=get_time()
draw.text((5,28),local_time,font = font03,fill =0)#显示当前时间
Bottom_edge() #添加底边内容
Weather() #天气内容
epd.display(epd.getbuffer(info_image.rotate(180)))
def Partial_full_brush(): #局部定时全刷函数
Basic_refresh() #全局刷新
logging.debug("局部定时全局刷新")
epd.init()
def Partial_refresh():#局刷函数
logging.info("部分内容更新,此更新建议与分钟同步,以节省墨水屏的使用寿命")#局部内容更新,此更新建议与分钟同步,以节省墨水屏寿命
epd.displayPartBaseImage(epd.getbuffer(info_image.rotate(180)))
epd.init()
while (True):
global local_time
local_time1=get_time()
if (local_time1==local_time) ==False:
draw.rectangle((5, 28, 149, 82), fill = 255) #时间局刷区域
draw.text((5,28),local_time1,font = font03,fill =0)#刷新当前时间
local_time=local_time1
Local_strong_brush() #局部强刷
get_date_var1=get_date() #局刷判断,如果时间与前一次不一致说明内容变化,需要刷新显示
global get_date_var #再次声明这个是全局变量
if(get_date_var1==get_date_var) ==False:
draw.rectangle((2, 2, 250, 16), fill = 255) #设置头部刷新区域
draw.text((2,2),get_date_var1,font = font02,fill =0)#将日期及星期几刷新显示到屏幕
get_date_var=get_date_var1 #将更新的值保存到初始变量,直到下一次变化时执行该刷新操作
logging.debug("头部日期部位发生刷新变化.")
Local_strong_brush() #局部强刷
global local_addr #当前IP地址
local_addr1 = Get_ipv4_address()
if (local_addr1==local_addr) ==False:
draw.rectangle((1, 107, 123, 120), fill = 0) #设置头部刷新区域
draw.text((10,107),"IP:"+local_addr1,font = font05,fill =255)#显示当前IP地址
local_addr=local_addr1
Local_strong_brush() #局部强刷
'''天气局部更新函数'''
Weather_json = open('/root/2.13-Ink-screen-clock/bin/weather.json','r')
Weather_data = Weather_json.read()
Weather_json.close()
Weather_text=json.loads(Weather_data)
global Weather_position
global temperature
global weather
global wind_direction
global weather_update
global weather_date
global humidity
Weather_position1 = Weather_text['cityname'] #定位位置
temperature1=Weather_text['temp']+u'°C' #温度
weather11 = Weather_text['weather'] #天气情况
wind_direction1 = Weather_text['WD'] #风向
weather_update1 = Weather_text['time'] #天气更新时间
weather_date1 = Weather_text['date'] #日期
humidity1 = Weather_text['SD'] #湿度
if (weather11==weather) ==False:
draw.rectangle((191, 25, 249, 38), fill = 255) #天气局刷区域
draw.text((191,25),weather11,font = font06,fill =0)
weather=weather11
logging.info("天气局部刷新")
Local_strong_brush() #局部强刷
if (temperature1==temperature) ==False:
draw.rectangle((191, 45, 249, 57), fill = 255) #局刷区域
draw.text((191,45),temperature1,font = font06,fill =0)
temperature=temperature1
logging.info("温度局部刷新")
Local_strong_brush() #局部强刷
if (humidity1==humidity) ==False:
draw.rectangle((191, 65, 249, 77), fill = 255) #局刷区域
draw.text((191,65),humidity1,font = font06,fill =0)
humidity = humidity1
logging.info("湿度局部刷新")
Local_strong_brush() #局部强刷
if (Weather_position1==Weather_position) ==False:
draw.rectangle((191, 85, 249, 98), fill = 255) #局刷区域
draw.text((191,85),Weather_position1,font = font06,fill =0)
Weather_position = Weather_position1
logging.info("城市局部刷新")
Local_strong_brush() #局部强刷
if (weather_update1==weather_update) ==False:
draw.rectangle((211, 107, 248, 118), fill = 0) #设置更新时间刷新区域
draw.text((211,107),weather_update1,font = font05,fill =255) #显示天气更新时间
weather_update=weather_update1
logging.info("天气更新时间局部刷新")
Local_strong_brush() #局部强刷
'''天气局部更新函数'''
global power_str
power_str1 =power_battery()
if (power_str1==power_str) ==False:
draw.rectangle((128, 110, 153, 117), fill = 0) #设置更新时间刷新区域
draw.text((129,108),power_battery(),font = font04,fill =255) #显示当前电量百分比
power_str=power_str1
Local_strong_brush() #局部强刷
# logging.info("电池电量局部刷新")
retry_interval = 180 # 设置重试间隔时间(秒)
while True:
try:
##################屏幕初始化#########################
epd = epd2in13_V4.EPD() #初始化
epd.init()#设定屏幕刷新模式
#epd.Clear(0xFF) #清除屏幕内容
##################屏幕初始化#########################
logging.info("Width = %s, Height = %s", format(epd.width), format(epd.height)) #打印屏幕高度及宽度
logging.info("初始化并清空显示屏")#屏幕开始准备相关展示
info_image = Image.new('1', (epd.height, epd.width), 255) #画布创建准备
draw = ImageDraw.Draw(info_image)
Basic_refresh() #全局刷新
Partial_refresh() #局部刷新
epd.init()
epd.Clear(0xFF)
epd.sleep()
time.sleep(300)
break # 如果脚本执行成功,则退出循环
except (OSError, Exception) as e: # 捕获你提到的异常
logging.error("发生了错误: %s", e)
time.sleep(retry_interval) # 等待一段时间后重试
except KeyboardInterrupt:
logging.info("检测到键盘中断,正在清理并退出")
epd.init()
epd.Clear(0xFF) # 清除屏幕内容
epd.sleep() # 使屏幕进入休眠状态
epd2in13_V4.epdconfig.module_exit() # 清理资源
exit()
# 脚本正常结束后的清理操作
epd.init()
epd.Clear(0xFF) # 清除屏幕内容
epd.sleep() # 使屏幕进入休眠状态
epd2in13_V4.epdconfig.module_exit() # 清理资源
exit()

8
bin/requirements.txt Normal file
View File

@@ -0,0 +1,8 @@
borax==4.1.2
certifi==2025.1.31
charset-normalizer==3.4.1
idna==3.10
pillow==11.1.0
requests==2.32.3
spidev==3.6
urllib3==2.3.0

BIN
bin/vendor/borax-4.1.2-py3-none-any.whl vendored Normal file

Binary file not shown.

Binary file not shown.

BIN
bin/vendor/idna-3.10-py3-none-any.whl vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
bin/vendor/spidev-3.6.tar.gz vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.