数码之家

 找回密码
 立即注册
搜索
查看: 4421|回复: 9

[Arduino] [esp8266_micropython] ssd1306显示时间

[复制链接]
发表于 2021-6-30 21:36:20 | 显示全部楼层 |阅读模式
代码逻辑:
1.  连接wifi, 访问指定API获取时间信息
2.  将获取的时间信息绘制在屏幕上

###############代码分割线/编辑器自带的代码框会吞掉缩进/#############
import network
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
import math
import time
import random
import urequests as requests
import gc

def light_dot(x, y, width=4):
    #oled.pixel(x, y, 1)
    for i in range(x,x+width):
      for j in range(y,y+width):
        oled.pixel(i,j,1)


def draw_line(x1, y1, x2, y2, isShow=1):
    if (x1 == x2):
        step = 1
        if (y1 > y2):
            step *= -1
        while (y1 != y2):
            light_dot(x1, y1)
            y1 = y1 + step
        light_dot(x2, y2)
    else:
        # y = kx+a
        k = (y2 - y1) / (x2 - x1)
        if (abs(k) <= 1):
          a = y1 - (k * x1)
          step = 1
          if (x1 > x2):
              step *= -1
          while (x1 != x2):
              light_dot(x1, round(k * x1 + a))
              x1 += step
          light_dot(x2, y2)
        else:
          k = (x2-x1)/(y2-y1)
          a = x1-(k*y1)
          step = 1
          if (y1 > y2):
            step *= -1
          while (y1 != y2):
            light_dot(round(k*y1+a),y1)
            y1 += step
          light_dot(x2, y2)



def draw_one(x,y):
  draw_line(x,y,x,y+16)
def draw_two(x,y):
  draw_line(x,y,x+16,y)
def draw_three(x,y):
  draw_line(x+16,y,x+16,y+16)
def draw_four(x,y):
  draw_line(x,y+16,x+16,y+16)
def draw_five(x,y):
  draw_line(x,y+16,x,y+32)
def draw_six(x,y):
  draw_line(x,y+32,x+16,y+32)
def draw_seven(x,y):
  draw_line(x+16,y+16,x+16,y+32)


def draw_number_zero(x,y):
  draw_one(x,y)
  draw_two(x,y)
  draw_three(x,y)
  draw_five(x,y)
  draw_six(x,y)
  draw_seven(x,y)
  oled.show()
def draw_number_one(x,y):
  draw_three(x,y)
  draw_seven(x,y)
  oled.show()
def draw_number_two(x,y):
  draw_two(x,y)
  draw_three(x,y)
  draw_four(x,y)
  draw_five(x,y)
  draw_six(x,y)
  oled.show()
def draw_number_three(x,y):
  draw_two(x,y)
  draw_three(x,y)
  draw_four(x,y)
  draw_six(x,y)
  draw_seven(x,y)
  oled.show()
def draw_number_four(x,y):
  draw_one(x,y)
  draw_three(x,y)
  draw_four(x,y)
  draw_seven(x,y)
  oled.show()
def draw_number_five(x,y):
  draw_one(x,y)
  draw_two(x,y)
  draw_four(x,y)
  draw_six(x,y)
  draw_seven(x,y)
  oled.show()
def draw_number_six(x,y):
  draw_one(x,y)
  draw_two(x,y)
  draw_four(x,y)
  draw_five(x,y)
  draw_six(x,y)
  draw_seven(x,y)
  oled.show()
def draw_number_seven(x,y):
  draw_two(x,y)
  draw_three(x,y)
  draw_seven(x,y)
  oled.show()
def draw_number_eight(x,y):
  draw_one(x,y)
  draw_two(x,y)
  draw_three(x,y)
  draw_four(x,y)
  draw_five(x,y)
  draw_six(x,y)
  draw_seven(x,y)
  oled.show()
def draw_number_nine(x,y):
  draw_one(x,y)
  draw_two(x,y)
  draw_three(x,y)
  draw_four(x,y)
  draw_six(x,y)
  draw_seven(x,y)
  oled.show()

def draw_clock_char(x,y,char):
  if char == '0':
    draw_number_zero(x,y)
  elif char == '1':
    draw_number_one(x,y)

  elif char =='2':
    draw_number_two(x,y)
  elif char =='3':
    draw_number_three(x,y)
  elif char =='4':
    draw_number_four(x,y)
  elif char =='5':
    draw_number_five(x,y)
  elif char =='6':
    draw_number_six(x,y)
  elif char =='7':
    draw_number_seven(x,y)
  elif char =='8':
    draw_number_eight(x,y)
  elif char =='9':
    draw_number_nine(x,y)

def draw_clock(x,y,str_clock):
  for i in range(4):
    draw_clock_char(x+i*30, y, str_clock)



def connectionWifi(ssid, password):
  wlan = network.WLAN(network.STA_IF)
  wlan.active(True)
  wlan.connect(ssid, password)
  while True:
    if not wlan.isconnected():
      time.sleep_ms(2000)
    else:
      print('connected to network')
      return wlan.ifconfig()
      break

def getJsonInfoFromURL(url):
  response = requests.get(url)
  return response.json()

def my_str(num):
  if num < 10:
    return "0"+str(num)
  return str(num)

if __name__ == '__main__':
  gc.collect()
  i2c = I2C(scl=Pin(5), sda=Pin(4))
  oled = SSD1306_I2C(128, 64, i2c)


  ssid='FAST_20CC'
  password='409409409'
  ifconfig = connectionWifi(ssid, password)
  while True:
    try:
      result = getJsonInfoFromURL("http://ip:8080/bills/ESP8266TimeAPI")
      str_clock= my_str(result['hours'])+my_str(result['minutes'])
      print(str_clock)
      oled.fill(0)
      draw_clock(random.getrandbits(4)%10,random.getrandbits(5)%20,str_clock)
      time.sleep(30)
      gc.collect()
    except :
      print("program get Error")
###############################代码分割线########################################

图片如下




补充内容 (2021-8-4 22:21):
代码修正:
draw_clock函数修改如下:
def draw_clock(x,y,str_clock):
  for i in range(4):
    draw_clock_char(x+i*30, y, str_clock)

补充内容 (2021-8-4 23:00):
代码再修正-_-
def draw_clock(x,y,str_clock):
  for i in range(4):
    draw_clock_char(x+i*30, y, str_clock)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 1家元 +20 收起 理由
家睦 + 20

查看全部打赏

发表于 2021-7-1 00:13:31 | 显示全部楼层
会烧屏的 吧
回复 支持 反对

使用道具 举报

发表于 2021-7-2 01:59:37 | 显示全部楼层
都arduino了,为啥还要用py,真心不喜欢py,各种py。。。
回复 支持 反对

使用道具 举报

发表于 2021-7-2 11:45:08 | 显示全部楼层
这个显示文字的方法很有趣。

继续往前走:单片机矢量字库。
回复 支持 反对

使用道具 举报

发表于 2021-7-9 23:09:00 来自手机浏览器 | 显示全部楼层
一定要动态刷下屏,一直这样显示会烧oled的。就两万小时寿命吧
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-8-4 22:24:10 | 显示全部楼层
40560335 发表于 2021-7-2 01:59
都arduino了,为啥还要用py,真心不喜欢py,各种py。。。

可以py便于各种交易:titter:
python语法简介,易于上手,拥有很方便操作的数据对象;库丰富,可以直接查看源码。
最重要的是:做着玩,选择自己熟悉的语言。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-4 22:29:31 | 显示全部楼层
kelchdeng 发表于 2021-7-9 23:09
一定要动态刷下屏,一直这样显示会烧oled的。就两万小时寿命吧

感谢说明,全部点亮时已经可以明显看到烧屏痕迹了.....
draw_clock(random.getrandbits(4)%10,random.getrandbits(5)%20,str_clock)  这行代码里取了两个随机值作为左上角坐标。后续加了1s的熄屏(看后面的评论)。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-4 22:31:22 | 显示全部楼层
增加刷新次数,减轻烧屏:
main方法主循环修改如下
  while True:
    try:
      result = getJsonInfoFromURL("http://ip/bills/ESP8266TimeAPI")
      str_clock= my_str(result['hours'])+my_str(result['minutes'])
      print(str_clock)
      count = 0
      while (count<5):
          oled.fill(0)
          oled.show()
          time.sleep(1)
          draw_clock(random.getrandbits(4)%10,random.getrandbits(5)%20,str_clock)
          time.sleep(5)
          count = count+1
      gc.collect()
    except :
      print("program get Error")
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-4 22:35:30 | 显示全部楼层
lyy-cy 发表于 2021-7-2 11:45
这个显示文字的方法很有趣。

继续往前走:单片机矢量字库。

8266的存储空间捉急,从网络读取不稳定+慢,只用到数字就用代码替代字库了。
矢量字库,有文档推荐一下吗?:lol:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-6 17:25:58 | 显示全部楼层
代码再修正-_-
def draw_clock(x,y,str_clock):
  for i in range(4):
    draw_clock_char(x+i*30, y, str_clock\[i\])
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-12 01:32 , Processed in 0.187201 second(s), 10 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表