本节书摘来自异步社区《动手玩转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; 1 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) 2 if (x<=500 && x>=100 && y>= 150 && y<375) { switchOn(); } // 检查是否按下(OFF) 3 if (x>500 && x<=900 && y>= 150 && y<375) { switchOff(); } // 检查亮度 4 if (y>=375 && y<=900) { setBrightness(); } }和分成两区域的程序类似,这个程序在2和3处判断触摸是否发生在“ON”和“OFF”区域,以及在4处判断是否有在水平分割线之上的触摸,那是表示亮度调节的。如果在亮度区域触摸了屏幕,在1处,x轴的位置会被转换成相应的PWM值,然后用setBrightness()调节LED的亮度。
我们可以使用这些基础函数,用这个简单廉价的触摸屏做出任意数量的开关或滑动控制。
相关资源:敏捷开发V1.0.pptx