本节书摘来自异步社区《动手玩转Arduino》一书中的第10章,第10.3节,作者【澳】John Boxall,译者 翁恺,更多章节内容可以访问云栖社区“异步社区”公众号查看。
10.3 作品35:做一个两区域触摸开关
在这个作品中,我们用触摸屏坐标系做出了一个开关。把屏幕垂直地分成两部分,如图10-5所示,左边的区域表示“on”,而右边的区域表示“off”。
Arduino通过比较触摸点的坐标和屏幕两部分的边界来判断触摸屏上哪个区域被触摸了。判断出区域之后,就可以向一个数字输出发送开或关的信号了,不过这个程序只是简单地在串口监视器上显示哪个区域被触摸了,是开了还是关了。
10.3.1 程序
输入并上传下面的程序。
// 作品35 - 做一个两区域触摸开关
int x,y = 0;
void setup()
{
Serial.begin(9600);
pinMode(10, OUTPUT);
}
void switchOn()
{
digitalWrite(10, HIGH);
Serial.print("Turned ON at X = ");
Serial.print(x);
Serial.print(" Y = ");
Serial.println(y);
delay(200);
}
void switchOff()
{
digitalWrite(10, LOW);
Serial.print("Turned OFF at X = ");
Serial.print(x);
Serial.print(" Y = ");
Serial.println(y);
delay(200);
}
int readX() // 返回触摸屏x轴的值
{
int xr=0;
pinMode(A0, INPUT);
pinMode(A1, OUTPUT);
pinMode(A2, INPUT);
pinMode(A3, OUTPUT);
digitalWrite(A1, LOW); // 设A1为GND
digitalWrite(A3, HIGH); // 设A3为5V
delay(5);
xr=analogRead(0);
return xr;
}
int readY() // 返回触摸屏y轴的值
{
int yr=0;
pinMode(A0, OUTPUT); // A0
pinMode(A1, INPUT);
pinMode(A2, OUTPUT);
pinMode(A3, INPUT);
digitalWrite(A0, LOW); // 设A0为GND
digitalWrite(A2, HIGH); // 设A2为5V
delay(5);
yr=analogRead(1);
return yr;
}
void loop()
{
x=readX();
y=readY();
1 // 检查是否按下(ON)
if (x<=900 && x>=500)
{
switchOn();
}
2 // 检查是否按下(OFF)
if (x<500 && x>=100)
{
switchOff();
}
}
10.3.2 工作原理
在void loop()里的两个if语句检查屏幕的左边或右边有没有发生触摸。如果左边被触摸了,这个触摸在1处被认为是一个“ON”;而如果右边被触摸了(按下了“OFF”),这个触摸会在2处被检测出来。
注意:
y轴上的数值被忽略了,因为触摸屏是被垂直分成左右两半的。如果水平分成上下两半,那么就需要用y轴的数值来做检测了,作品36就是这么干的。
10.3.3 测试程序
图10-6所示是串口监视器上的这个程序的输出结果。每次触摸屏幕,就显示开关的状态和触摸的坐标。