本节书摘来异步社区《动手玩转Arduino》一书中的第10章,第10.4节,作者:【澳】John Boxall,更多章节内容可以访问云栖社区“异步社区”公众号查看
10.4 作品36:做一个三区域触摸开关
在这个作品中,我们要做一个三区域的触摸开关,可以控制数字引脚3上的一个LED,让这个LED点亮、熄灭,还可以通过PWM调节它的亮度(第3章的知识)。
10.4.1 触摸屏坐标系
触摸屏的坐标系设计如图10-7所示。
这个触摸屏的坐标系分成“OFF(关)”、“ON(开)”和“brightness(亮度)”控制区域,程序测量触摸屏返回的数值来判断哪个部分被按下了,然后做相应的动作。
10.4.2 程序
输入并上传下面的程序。
// 作品36 - 做一个三区域触摸开关
int x,y = 0;
void setup()
{
pinMode(3, OUTPUT);
}
void switchOn()
{
digitalWrite(3, HIGH);
delay(200);
}
void switchOff()
{
digitalWrite(3, LOW);
delay(200);
}
void setBrightness()
{
int xx, bright;
float br;
xx=x-100;
br=(800-xx)/255;
bright=int(br);
analogWrite(3, bright);
}
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); // A1
pinMode(A2, OUTPUT); // A2
pinMode(A3, INPUT); // A3
digitalWrite(A0, LOW); // 设A0为GND
digitalWrite(A2, HIGH); // 设A2为5V
delay(5);
yr=analogRead(1);
return yr;
}
void loop()
{
x=readX();
y=readY();
// 检查是否按下(ON)
if (x<=500 && x>=100 && y>= 150 && y<375)
{
switchOn();
}
// 检查是否按下(OFF)
if (x>500 && x<=900 && y>= 150 && y<375)
{
switchOff();
}
// 检查亮度
if (y>=375 && y<=900)
{
setBrightness();
}
}```
####10.4.3 工作原理
和分成两区域的程序类似,这个程序在2.jpg和3.jpg处判断触摸是否发生在“ON”和“OFF”区域,以及在4.jpg处判断是否有在水平分割线之上的触摸,那是表示亮度调节的。如果在亮度区域触摸了屏幕,在1.jpg处,x轴的位置会被转换成相应的PWM值,然后用setBrightness()调节LED的亮度。