本节书摘来异步社区《动手玩转Arduino》一书中的第10章,第10.4节,作者:【澳】John Boxall,更多章节内容可以访问云栖社区“异步社区”公众号查看
在这个作品中,我们要做一个三区域的触摸开关,可以控制数字引脚3上的一个LED,让这个LED点亮、熄灭,还可以通过PWM调节它的亮度(第3章的知识)。
触摸屏的坐标系设计如图10-7所示。
这个触摸屏的坐标系分成“OFF(关)”、“ON(开)”和“brightness(亮度)”控制区域,程序测量触摸屏返回的数值来判断哪个部分被按下了,然后做相应的动作。
输入并上传下面的程序。
// 作品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的亮度。