最近参加了学校实验室的立创训练营项目,项目是做一个物联网的时钟,还是比较简单的一个项目,使用的是ESP32-C3模组,两个四位数码管来显示时间,MAX7219驱动数码管,DS1302时钟芯片提供时间,然后还有五个按键。一个程序下载按键,一个RST按键,还有三个功能按键。

img

硬件上来说还是很简单的。我在此基础上添加了锂电池充放电管理,使用的是TP4054这颗充电IC外围电路非常少,因为目前我还不会其他的充电电路,就只能先用这个了,这颗芯片带一个充电指示引脚,连一颗LED就能指示充电了。我还加了个SHT30温湿度传感器,然后把DS1302换成了PCF8563,这颗时钟芯片与单片机使用I2C通信,程序设计上要稍微复杂些,SHT30也是用 I2C 通信的, I2C 确实比较神奇,我复用了两个引脚来连接这两颗芯片。

img

这次使用立创EDA进行电路、PCB设计:项目开源链接

软件上本来打算用ESP-IDF的,可是配置起来麻烦的很,所以最后我还是用我目前比较熟悉的arduino来实现的。打算以后有时间再来用ESP-IDF。

1.arduino参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#include <WiFi.h>
#include <time.h>
#include "NTPClient.h"
#include <Ds1302.h>

const char* ssid = "ssid";
const char* password = "password";

int CLK = 7;
int CS = 6;
int DIN = 4; //这里定义了那三个脚
int sw1=18;//拨轮按键
int sw2=19;
int sw3=10;

int sec;
int n=10;
#define battery 0
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "ntp1.aliyun.com", 60*60*8, 30*60*1000);

void smgdispaly() {
if(sec!=timeClient.getSeconds()){
int h1,h2,m1,m2,s1,s2;
h1=timeClient.getHours()/10;
h2=timeClient.getHours()%10;
m1=timeClient.getMinutes()/10;
m2=timeClient.getMinutes()%10;
s1=timeClient.getSeconds()/10;
s2=timeClient.getSeconds()%10;
Write_Max7219(0x0f, 0x00); //显示测试:1;测试结束,正常显示:0
Write_Max7219(1,h1);
Write_Max7219(2,h2);
Write_Max7219(4,m1);
Write_Max7219(5,m2);
Write_Max7219(7,s1);
Write_Max7219(8,s2);
sec=timeClient.getSeconds();
}
}

void batterydisplay(){
float analog_value = 0;
analog_value = analogRead(battery);
delay(1000);
Serial.printf("Current Reading on Pin(%d)=%f\n",battery,analog_value*4.2/2910);

}

void switchkey(){
if(digitalRead(sw2)==LOW){
delay(10);
if(digitalRead(sw2)==LOW){
Serial.println(n);
Write_Max7219(0x09, 0xff);
Write_Max7219(0x0a, n++);
if(n>=15) n=15;
}
}
if(digitalRead(sw3)==LOW){
delay(10);
if(digitalRead(sw3)==LOW){
Serial.println(n);
Write_Max7219(0x09, 0xff);
Write_Max7219(0x0a, n--);
if(n<=0) n=0;
}
}
}
void setup() { // put your setup code here, to run once:
Serial.begin(115200);
pinMode(CLK,OUTPUT);
pinMode(CS,OUTPUT);
pinMode(DIN,OUTPUT); //让三个脚都是输出状态

pinMode(battery,INPUT);

pinMode(sw1,INPUT_PULLUP);
pinMode(sw2,INPUT_PULLUP);
pinMode(sw3,INPUT_PULLUP);

Init_MAX7219();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
timeClient.begin();
sec=timeClient.getSeconds();
Serial.println(timeClient.getFormattedTime());
}


void loop() {
// put your main code here, to run repeatedly:
timeClient.update();
smgdispaly();
switchkey();
delay(50);
}
void Delay_xms(unsigned int x)
{
unsigned int i,j;
for(i=0;i<x;i++)
for(j=0;j<112;j++);
}
//--------------------------------------------
//功能:向MAX7219写入字节
//入口参数:DATA
//出口参数:无
//说明:
void Write_Max7219_byte(unsigned char DATA)
{
unsigned char i;
digitalWrite(CS,LOW);
for(i=8;i>=1;i--)
{
digitalWrite(CLK,LOW);
if(DATA&0X80)
digitalWrite(DIN,HIGH);
else
digitalWrite(DIN,LOW);
DATA<<=1;
digitalWrite(CLK,HIGH);
}
}
//-------------------------------------------
//功能:向MAX7219写入数据
//入口参数:address、dat
//出口参数:无
//说明:
void Write_Max7219(unsigned char address,unsigned char dat)
{
digitalWrite(CS,LOW);
Write_Max7219_byte(address); //写入地址,即数码管编号
Write_Max7219_byte(dat); //写入数据,即数码管显示数字
digitalWrite(CS,HIGH);
}

void Init_MAX7219(void)
{
Write_Max7219(0x09, 0xff); //译码方式:BCD码
Write_Max7219(0x0a, 15); //亮度
Write_Max7219(0x0b, 0x07); //扫描界限;4个数码管显示
Write_Max7219(0x0c, 0x01); //掉电模式:0,普通模式:1
Write_Max7219(1,0xa);
Write_Max7219(2,0xa);
Write_Max7219(3,0xa);
Write_Max7219(4,0xa);
Write_Max7219(5,0xa);
Write_Max7219(6,0xa);
Write_Max7219(7,0xa);
Write_Max7219(8,0xa);
delay(100);
}

2.ESP-IDF正在尝试中……

参考:快速入门 - ESP32 - — ESP-IDF 编程指南 latest 文档 (espressif.com)