《动手玩转Arduino》——10.4 作品36:做一个三区域触摸开关

本节书摘来自异步社区《动手玩转Arduino》一书中的第10章,第10.4节,作者【澳】John Boxall,译者 翁恺,更多章节内容可以访问云栖社区“异步社区”公众号查看。

10.4 作品36:做一个三区域触摸开关

在这个作品中,我们要做一个三区域的触摸开关,可以控制数字引脚3上的一个LED,让这个LED点亮、熄灭,还可以通过PWM调节它的亮度(第3章的知识)。

10.4.1 触摸屏坐标系

触摸屏的坐标系设计如图10-7所示。


《动手玩转Arduino》——10.4 作品36:做一个三区域触摸开关

这个触摸屏的坐标系分成“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; 
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(); 
    } 
  }

10.4.3 工作原理

和分成两区域的程序类似,这个程序在2和3处判断触摸是否发生在“ON”和“OFF”区域,以及在4处判断是否有在水平分割线之上的触摸,那是表示亮度调节的。如果在亮度区域触摸了屏幕,在1处,x轴的位置会被转换成相应的PWM值,然后用setBrightness()调节LED的亮度。

我们可以使用这些基础函数,用这个简单廉价的触摸屏做出任意数量的开关或滑动控制。

上一篇:IntelliJ IDEA像Eclipse一样打开多个项目(转)


下一篇:Android应用的构成