Posted on  Updated on 

arduino小项目2——电压表

难度系数:★
使用工具,arduino uno,面包板,杜邦线,4寸0.96寸I2C小屏幕,小按钮

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
 
#include <U8g2lib.h>

U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, SCL, SDA); // 配置构造函数

int analogMax = 1008,analogMin = 14;//理想范围0-1023;由实际情况调整;1008~4.93v,0~0V;

void setup() {
Serial.begin(9600);
pinMode(A0, INPUT_PULLUP); // 设置引脚2为上拉输入模式
pinMode(2, INPUT_PULLUP); // 设置引脚2为上拉输入模式
u8g2.begin();
}

void loop() {
float a = Voltage_detect();
displayMenu(a);
}

//oled屏幕显示
void displayMenu(float a) {
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_ncenB08_tr);
u8g2.setCursor(0, 14);


u8g2.print("Voltage, (0-5v)");
// 显示电压表...
u8g2.setFont(u8g2_font_ncenB14_tr);
u8g2.setCursor(20, 34);
u8g2.println(a);
u8g2.sendBuffer();
}

//检测并转化为0-5v
float Voltage_detect(){
//range is 0.07 to 4.91
int analogdate = analogRead(A0); //读取io口模拟值
float Voltage = analogdate*5.0/1023.0; //转化
//Serial.println(Voltage);
if(Voltage>=4.92){
Serial.println("out"); //串口打印
}
else Serial.println(Voltage);
return Voltage; //返回值
}

本来想弄万用表来着,emmp,放弃了,没写完,代码如下

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
 

#include <U8g2lib.h>

U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, SCL, SDA); // 配置构造函数

int gear = 0; // 万用表状态 0.菜单;1.电压表;2.电流表;3.电阻表
int analogMax = 1008,analogMin = 14;//理想范围0-1023;由实际情况调整;1008~4.93v,0~0V;
int R_I=220; // 电流表状态,电阻为220欧姆

void setup() {
Serial.begin(9600);
pinMode(A0, INPUT_PULLUP); // 设置引脚2为上拉输入模式
pinMode(2, INPUT_PULLUP); // 设置引脚2为上拉输入模式
u8g2.begin();
}

void loop() {
double a = Voltage_detect();
switch1();
displayMenu(a);
int analogdate = analogRead(A0);


}

void switch1() {
int key = digitalRead(2);

// 第一次判断
if (key == 0) {
// 延时20ms 消除按键抖动
delay(20);
// 第二次判断
if (key == 0) {
gear++; // 状态++
if (gear > 3) {
gear = 0; // 循环到第一个菜单状态
}
}
// 等待按键被松开
while (!digitalRead(2)) {
// 等待按键松开
}
}
}

void displayMenu(double a) {
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_ncenB08_tr);
u8g2.setCursor(0, 14);

switch (gear) {
case 0:
//u8g2.print("Menu");
// 显示菜单选项...
face();
break;
case 1:
u8g2.print("Voltage");
// 显示电压表...
u8g2.setCursor(20, 34);
u8g2.println(a);
break;
case 2:
u8g2.print("Current");
// 显示电流表...
break;
case 3:
u8g2.print("Resistance");
// 显示电阻表...
break;
}

u8g2.sendBuffer();
}

void face()
{
u8g2.clearBuffer(); //清空显示屏缓存

u8g2.drawCircle(56,40,8,U8G2_DRAW_LOWER_LEFT); //画四分之一圆,圆心坐标(56,44),半径8
u8g2.drawCircle(56,40,8,U8G2_DRAW_LOWER_RIGHT); //画四分之一圆
u8g2.drawCircle(72,40,8,U8G2_DRAW_LOWER_LEFT); //画四分之一圆
u8g2.drawCircle(72,40,8,U8G2_DRAW_LOWER_RIGHT); //画四分之一圆
u8g2.drawCircle(56,41,8,U8G2_DRAW_LOWER_LEFT); //加粗画四分之一圆
u8g2.drawCircle(56,41,8,U8G2_DRAW_LOWER_RIGHT); //加粗画四分之一圆
u8g2.drawCircle(72,41,8,U8G2_DRAW_LOWER_LEFT); //加粗画四分之一圆
u8g2.drawCircle(72,41,8,U8G2_DRAW_LOWER_RIGHT); //加粗画四分之一圆
u8g2.drawLine(40,18,20,30); //画斜线,两端点坐标分别是(40,18)(20,30)
u8g2.drawLine(88,18,108,30); //画斜线
u8g2.drawLine(40,17,20,29); //加粗画斜线
u8g2.drawLine(88,17,108,29); //加粗画斜线

u8g2.sendBuffer(); //加载以上内容
}

float Voltage_detect(){
//range is 0.07 to 4.91
int analogdate = analogRead(A0);
float Voltage = analogdate*5.0/1023.0;
//Serial.println(Voltage);
if(Voltage>=4.92){
Serial.println("out");
}
else Serial.println(Voltage);
return Voltage;
}