maker_tinker 发表于 2023-8-6 15:43:38

用raspberrry pi pico 和 PCF8563 RTC 模块(辉光用)

在网上找不到PCF8563 的 micropython/circuitpython 的模块,有 adafruit 的但装不下来
有没有通用模块或其它方式啊

isdkz 发表于 2023-8-6 15:43:57

您好!对于Raspberry Pi Pico和PCF8563 RTC模块,虽然目前可能没有专门为Micropython或Circuitpython开发的PCF8563模块,但我们可以通过其他方式来使用它。

一种通用的方法是使用Python的smbus库来与PCF8563 RTC进行通信。smbus库是Python的标准库之一,用于与I2C设备进行通信。您可以按照以下步骤进行操作:

1. 确保您的Raspberry Pi Pico上已经安装了Micropython或Circuitpython,并且已经正确连接了PCF8563 RTC模块。

2. 在您的Pico上创建一个新的Python脚本文件,例如 rtc_test.py 。

3. 在脚本中导入smbus库:
import smbus


4. 初始化I2C总线:
i2c = smbus.SMBus(0)# 或者使用SMBus(1),具体取决于您的硬件连接方式


5. 设置PCF8563 RTC的I2C地址:
rtc_address = 0x51# 根据PCF8563的规格手册,设置正确的I2C地址


6. 现在,您可以使用smbus库的读写方法来与PCF8563 RTC进行通信了。例如,您可以读取当前时间:
seconds = i2c.read_byte_data(rtc_address, 0x02)
minutes = i2c.read_byte_data(rtc_address, 0x03)
hours = i2c.read_byte_data(rtc_address, 0x04)
# 还可以读取其他的日期和配置信息


请注意,上述代码仅供参考,具体的读写寄存器地址和数据格式可能会因PCF8563的不同而有所不同。请参考PCF8563的规格手册以获取更多详细信息。

希望这可以帮助到您!如果您有任何进一步的问题,请随时提问。

学习编程中的Ben 发表于 2023-8-6 15:44:08

PCF8563 RTC模块的MicroPython/CircuitPython支持

很遗憾,目前在MicroPython/CircuitPython中没有官方支持PCF8563 RTC模块的库。不过,你可以尝试使用I2C通信协议来手动与PCF8563 RTC模块进行通信,以读取和设置时间。

下面是一个示例代码,演示了如何使用Raspberry Pi Pico和PCF8563 RTC模块通过I2C进行时间读取和设置。在运行该代码之前,请确保你已经将PCF8563 RTC模块正确连接到Raspberry Pi Pico上的I2C引脚。

import machine
import utime

# 定义PCF8563 I2C地址
PCF8563_I2C_ADDR = 0x51

# 初始化I2C总线
i2c = machine.I2C(0, scl=machine.Pin(1), sda=machine.Pin(0), freq=100000)

def bcd_to_decimal(bcd):
    """将BCD码转换为十进制数值"""
    return (bcd // 16) * 10 + (bcd % 16)

def decimal_to_bcd(decimal):
    """将十进制数值转换为BCD码"""
    return (decimal // 10) * 16 + (decimal % 10)

def read_rtc_time():
    """读取RTC模块的时间"""
    i2c.writeto(PCF8563_I2C_ADDR, bytes())# 设置读取起始地址
    data = i2c.readfrom(PCF8563_I2C_ADDR, 7)# 读取7个字节的时间数据
    seconds = bcd_to_decimal(data & 0x7F)
    minutes = bcd_to_decimal(data & 0x7F)
    hours = bcd_to_decimal(data & 0x3F)
    day = bcd_to_decimal(data & 0x3F)
    weekday = bcd_to_decimal(data & 0x07)
    month = bcd_to_decimal(data & 0x1F)
    year = bcd_to_decimal(data) + 2000
    return (year, month, day, hours, minutes, seconds, weekday)

def set_rtc_time(year, month, day, hours, minutes, seconds, weekday):
    """设置RTC模块的时间"""
    data = bytearray(8)
    data = 0x00# 控制字节,清除停止位
    data = decimal_to_bcd(seconds)
    data = decimal_to_bcd(minutes)
    data = decimal_to_bcd(hours)
    data = decimal_to_bcd(day)
    data = decimal_to_bcd(weekday)
    data = decimal_to_bcd(month)
    data = decimal_to_bcd(year % 100)
    i2c.writeto(PCF8563_I2C_ADDR, data)# 写入时间数据

# 读取RTC模块的时间
year, month, day, hours, minutes, seconds, weekday = read_rtc_time()
print("当前时间:{}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}".format(year, month, day, hours, minutes, seconds))

# 等待1秒
utime.sleep(1)

# 设置RTC模块的时间为当前时间+1秒
set_rtc_time(year, month, day, hours, minutes, seconds + 1, weekday)
print("时间已设置")

# 再次读取RTC模块的时间,确认是否设置成功
year, month, day, hours, minutes, seconds, weekday = read_rtc_time()
print("新的时间:{}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}".format(year, month, day, hours, minutes, seconds))


请尝试运行上述代码,并根据你的需求修改和扩展。希望对你有所帮助!

如果回答对你有帮助,请给我一个最佳答案!{:10_254:}{:10_254:}{:10_254:}

Mike_python小 发表于 2023-8-6 15:44:10

PCF8563 RTC模块与树莓派Pico的Micropython/CircuitPython支持

很抱歉PCF8563 RTC模块在Micropython/CircuitPython中可能没有官方的特定模块。但是,您仍然可以通过I2C接口与PCF8563 RTC模块通信并读取时间。

下面是一些通用的方法,您可以使用这些方法通过I2C与PCF8563 RTC模块进行通信:


import machine

i2c = machine.I2C(0)# 根据您的硬件配置,可能需要调整I2C接口号

rtc_address = 0x51# PCF8563的I2C地址为0x51

def bcd_to_decimal(bcd_value):
    """将BCD格式的值转换为十进制"""
    return (bcd_value >> 4) * 10 + (bcd_value & 0x0F)

def decimal_to_bcd(decimal_value):
    """将十进制的值转换为BCD格式"""
    tens = (decimal_value // 10) << 4
    ones = decimal_value % 10
    return tens | ones

def read_rtc():
    """从PCF8563 RTC模块读取时间"""
    i2c.writeto(rtc_address, bytearray())# 发送命令以选择时间寄存器
    data = i2c.readfrom(rtc_address, 7)# 读取7个字节的时间数据
    second = bcd_to_decimal(data & 0x7F)
    minute = bcd_to_decimal(data & 0x7F)
    hour = bcd_to_decimal(data & 0x3F)
    day = bcd_to_decimal(data & 0x3F)
    weekday = bcd_to_decimal(data & 0x07)
    month = bcd_to_decimal(data & 0x1F)
    year = bcd_to_decimal(data)
   
    # 返回读取的时间数据
    return year, month, day, hour, minute, second

def set_rtc(year, month, day, hour, minute, second):
    """设置PCF8563 RTC模块的时间"""
    i2c.writeto_mem(rtc_address, 0x02, bytearray())# 设置秒寄存器
    i2c.writeto_mem(rtc_address, 0x03, bytearray())# 设置分钟寄存器
    i2c.writeto_mem(rtc_address, 0x04, bytearray())# 设置小时寄存器
    i2c.writeto_mem(rtc_address, 0x05, bytearray())# 设置日寄存器
    i2c.writeto_mem(rtc_address, 0x06, bytearray())# 设置星期几寄存器
    i2c.writeto_mem(rtc_address, 0x07, bytearray())# 设置月寄存器
    i2c.writeto_mem(rtc_address, 0x08, bytearray())# 设置年寄存器

# 使用示例:
year, month, day, hour, minute, second = read_rtc()
print("当前时间:{}-{}-{} {}:{}:{}".format(year, month, day, hour, minute, second))

# 设置RTC时间为2023-08-06 12:00:00
set_rtc(23, 8, 6, 12, 0, 0)
print("RTC时间已设置")


请注意,上述代码是通用的Micropython代码,考虑到不同硬件的差异,您可能需要根据您的具体硬件和I2C配置做适当的修改。

希望这可以帮助您实现与PCF8563 RTC模块的通信和时间读取和设置。

如果回答对你有帮助,请给我一个最佳答案!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: 用raspberrry pi pico 和 PCF8563 RTC 模块(辉光用)