Code Repository 1. Gitee: https://gitee.com/yangkun_monster/clock.git 2. Github: https://github.com/pifan-open-source-community/clock.git Video Tutorial Address: Bilibili: Raspberry Pi Enthusiast Base, Play Pi VLOG Video VLOG Record: Bilibili: Play Pi VLOG
1. Overview
Using Raspberry Pi PICO to create a desktop clock that displays year, month, day, hour, minute, second, week, temperature, and humidity. The clock can be divided into two types: one uses the built-in RTC function, and the other uses the DS1302 clock module, which can be selected based on your situation (the clock module has a backup battery that can ensure it continues to keep time during power outages).
Programming language: MicroPython.
2. Material Preparation
1. Raspberry Pi PICO
PICO Interface Diagram
2. DHT11 Temperature and Humidity Sensor
DHT11 is a temperature and humidity sensor with calibrated digital signal output. Its precision is ±5% RH for humidity and ±2℃ for temperature, with a range of humidity from 5% to 95% RH and temperature from -20 to +60℃.
3. DS1302 Clock Module (optional)
The DS1302 clock chip is a low-power real-time clock chip with fine current charging capability, launched by DALLAS in the USA. It can keep track of year, month, day, week, hour, minute, and second, and has various functions such as leap year compensation. The DS1302 chip contains a 31-byte static RAM for storing the real-time clock/calendar, which can communicate with the microprocessor via a simple serial interface to store the current time in RAM. The DS1302 chip will automatically adjust for months with fewer than 31 days and will automatically correct for leap years.
Pin Description
Register (optional view)
Read address is 0x81 (seconds), 0x83 (minutes), 0x85 (hours), 0x87 (days), 0x89 (months), 0x8b (weeks), 0x8d (years)
Write address is 0x80 (seconds), 0x82 (minutes), 0x84 (hours), 0x86 (days), 0x88 (months), 0x8a (weeks), 0x8c (years)
4. SSD1306 Screen
The communication method is IIC
5. Other Materials
Breadboard
Male to Female Dupont Wires
3. Start
1. Wiring
DTH11 | |
VCC | |
GND | |
DATA | GP0 |
SSD1306 | |
VCC | |
GND | |
SCL | GP3 |
SDA |
GP2 |
DS1302 | |
VCC | |
GND | |
CLK | GP12 |
DAT | GP13 |
RST | GP14 |
![Insert image description here](https://img-blog.csdnimg.cn/a80d7b6bde37487c9c86e0948b376a56.png#pic_center)
2. Write Program
(1)Clock Implemented Using Built-in RTC Function
This clock can automatically read the computer’s time when connected to the computer; when the PICO loses power, the clock will pause and cannot keep time.
from machine import RTC from machine import Pin from machine import I2C from ssd1306 import SSD1306_I2C from machine import Timer import dht
def clock_time(tim): timee=clockk.datetime() oled.fill(0) oled.text("Date:",0,0) oled.text(str(timee[0])+'-'+str(timee[1])+'-'+str(timee[2])+'-'+week[timee[3]],0,10) oled.text(str(timee[4])+'-'+str(timee[5])+'-'+str(timee[6]),0,20) d.measure() oled.text("Temperature:"+str(d.temperature())+'C',0,40) oled.text("Humidity:"+str(d.humidity())+'%',0,50) oled.show()
i2c=I2C(1,sda=Pin(2),scl=Pin(3)) oled=SSD1306_I2C(128,64,i2c,addr=0X3c)
week=['Mon','Tues','Wed','Thur','Fri','Sat','Sun'] clockk=RTC() #clockk.datetime((2022,10,30,6,17,25,0,0)) #Set initial time, year, month, day, week, hour, minute, second
d=dht.DHT11(Pin(0))
tim=Timer(-1) tim.init(period=300,mode=Timer.PERIODIC,callback=clock_time
(2)Clock Implemented Using DS1302 Clock Module
The clock module has a backup battery that can ensure it continues to keep time during power outages.
Main Program
from machine import Pin from machine import I2C from ssd1306 import SSD1306_I2C from machine import Timer import dht from DS1302 import DS1302
def clock_time(tim): timee=ds.DateTime() oled.fill(0) oled.text("Date:",0,0) oled.text(str(timee[0])+'-'+str(timee[1])+'-'+str(timee[2])+'-'+week[timee[3]],0,10) oled.text(str(timee[4])+'-'+str(timee[5])+'-'+str(timee[6]),0,20) d.measure() oled.text("Temperature:"+str(d.temperature())+'C',0,40) oled.text("Humidity:"+str(d.humidity())+'%',0,50) oled.show()
i2c=I2C(1,sda=Pin(2),scl=Pin(3)) oled=SSD1306_I2C(128,64,i2c,addr=0X3c)
week=['Mon','Tues','Wed','Thur','Fri','Sat','Sun']
d=dht.DHT11(Pin(0)) ds = DS1302(Pin(12),Pin(13),Pin(14)) #ds.SetTime(2022,11,12,5,20,03,30) #Set initial time, year, month, day, week, hour, minute, second tim=Timer(-1) tim.init(period=300,mode=Timer.PERIODIC,callback=clock_time
DS1302 Library
''' DS1302 RTC drive
Author: shaoziyang Date: 2018.3
http://www.micropython.org.cn''' from machine import *
DS1302_REG_SECOND = (0x80) DS1302_REG_MINUTE = (0x82) DS1302_REG_HOUR = (0x84) DS1302_REG_DAY = (0x86) DS1302_REG_MONTH = (0x88) DS1302_REG_WEEKDAY= (0x8A) DS1302_REG_YEAR = (0x8C) DS1302_REG_WP = (0x8E) DS1302_REG_CTRL = (0x90) DS1302_REG_RAM = (0xC0)
class DS1302: def __init__(self, clk, dio, cs): self.clk = clk self.dio = dio self.cs = cs self.clk.init(Pin.OUT) self.cs.init(Pin.OUT) def DecToHex(self, dat): return (dat//10) * 16 + (dat%10)
def HexToDec(self, dat): return (dat//16) * 10 + (dat%16)
def write_byte(self, dat): self.dio.init(Pin.OUT) for i in range(8): self.dio.value((dat >> i) & 1) self.clk.value(1) self.clk.value(0)
def read_byte(self): d = 0 self.dio.init(Pin.IN) for i in range(8): d = d | (self.dio.value()<<i) self.clk.value(1) self.clk.value(0) return d
def getReg(self, reg): self.cs.value(1) self.write_byte(reg) t = self.read_byte() self.cs.value(0) return t
def setReg(self, reg, dat): self.cs.value(1) self.write_byte(reg) self.write_byte(dat) self.cs.value(0)
def wr(self, reg, dat): self.setReg(DS1302_REG_WP, 0) self.setReg(reg, dat) self.setReg(DS1302_REG_WP, 0x80) def start(self): t = self.getReg(DS1302_REG_SECOND + 1) self.wr(DS1302_REG_SECOND, t & 0x7f)
def stop(self): t = self.getReg(DS1302_REG_SECOND + 1) self.wr(DS1302_REG_SECOND, t | 0x80) def Second(self, second = None): if second == None: return self.HexToDec(self.getReg(DS1302_REG_SECOND+1))%60 else: self.wr(DS1302_REG_SECOND, self.DecToHex(second%60))
def Minute(self, minute = None): if minute == None: return self.HexToDec(self.getReg(DS1302_REG_MINUTE+1)) else: self.wr(DS1302_REG_MINUTE, self.DecToHex(minute%60))
def Hour(self, hour = None): if hour == None: return self.HexToDec(self.getReg(DS1302_REG_HOUR+1)) else: self.wr(DS1302_REG_HOUR, self.DecToHex(hour%24))
def Weekday(self, weekday = None): if weekday == None: return self.HexToDec(self.getReg(DS1302_REG_WEEKDAY+1)) else: self.wr(DS1302_REG_WEEKDAY, self.DecToHex(weekday%8))
def Day(self, day = None): if day == None: return self.HexToDec(self.getReg(DS1302_REG_DAY+1)) else: self.wr(DS1302_REG_DAY, self.DecToHex(day%32))
def Month(self, month = None): if month == None: return self.HexToDec(self.getReg(DS1302_REG_MONTH+1)) else: self.wr(DS1302_REG_MONTH, self.DecToHex(month%13))
def Year(self, year = None): if year == None: return self.HexToDec(self.getReg(DS1302_REG_YEAR+1)) + 2000 else: self.wr(DS1302_REG_YEAR, self.DecToHex(year%100))
def DateTime(self, dat = None): if dat == None: return [self.Year(), self.Month(), self.Day(), self.Weekday(), self.Hour(), self.Minute(), self.Second()] else: self.Year(dat[0]) self.Month(dat[1]) self.Day(dat[2]) self.Weekday(dat[3]) self.Hour(dat[4]) self.Minute(dat[5]) self.Second(dat[6])
def ram(self, reg, dat = None): if dat == None: return self.getReg(DS1302_REG_RAM + 1 + (reg%31)*2) else: self.wr(DS1302_REG_RAM + (reg%31)*2, dat) def SetTime(self,YEAR,MONTH,DAY,WEEK,HOUR,MINUTE,SECOND,): self.Year(YEAR) self.Month(MONTH) self.Day(DAY) self.Weekday(WEEK) self.Hour(HOUR) self.Minute(MINUTE) self.Second(SECOND)
Leave a Comment
Your email address will not be published. Required fields are marked *