Processing与Arduino交互-光敏传感器

Posted 村头陈师傅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Processing与Arduino交互-光敏传感器相关的知识,希望对你有一定的参考价值。

跟随环境光变化的太阳

公众号:STCode

1-光敏传感器简介


光敏传感器由光敏电阻构成。光敏电阻的阻值会根据光线强度发生变化。环境光线较弱时,阻值增大;环境光强烈时,阻值变小;当环境光线被完全遮时,阻值最大。简单构造一个电路,将阻值的变化用电压表示出来,即可用Arduino的模拟引脚读取。如图所示是一个光敏传感器模块。

image.png

2-Arduino读取光敏传感器


Arduino与光敏传感器模块连接,将光敏传感器A0端的电压读出,并使用串口输出到计算机上显示结果,Arduino与光敏传感器接线及代码如下所示,用Arduino的串口监视器可以读出数值。

接线示意:

image.png

Arduino端代码:

int sensorPin = 0;
int val = 0;
void setup()
{
	Serial.begin(9600);
}

void loop()
{
	val = analogRead(sensorPin);
	Serial.println(val);
	delay(100);
}

说明:连接好线路并将上述代码下载进去Arduino控制器后,打开串口监视器,即可查看光敏传感器返回的数值。

image.png

3-Processing绘制太阳


根据以下代码绘制一个太阳。绘制太阳用了画多角形和曲线的知识,代码首先画了一个14角星形,再在里面画了一个圆,最后在圆上用贝塞尔曲线勾勒出笑脸,如图。绘制完毕后调用save()函数将绘制的图片存储为sunshine.jpg文件。

void setup()    //主函数
{
  size(500,500);      //背景尺寸
  sun(250,250,200,120,14);  //绘制太阳函数
  save("sunshine.jpg");     //将图像储存为sunshine.jpg文件
}

void sun(float x,float y,float r1,float r2,int n)   //绘制太阳函数,n表示角数
{
  background(255);    //背景颜色
  fill(250,180,141);  //尖角填充颜色
  float radian = TWO_PI/(n*2);  //三角函数参数
  float xtemp,ytemp;    //定义定点横坐标、纵坐标
  beginShape();  //开始记录形状顶点
  for(int i = 0;i<n*2;i++)   //循环
  {
    if(i%2 == 0)
    {
      xtemp = x + cos(radian*i)*r1;  //外圆顶点
      ytemp = y + sin(radian*i)*r1;
    }
    else
    {
      xtemp = x + cos(radian*i)*r2;   //内圆顶点
      ytemp = y + sin(radian*i)*r2;
    }
    vertex(xtemp,ytemp);   //绘制顶点
  }
  endShape(CLOSE);   //停止记录
  strokeWeight(1); //设置线宽
  fill(250,218,141); //填充颜色
  ellipse(250,250,250,250);  //绘制圆
  noFill();     //无颜色填充
  strokeWeight(6);  //设置线宽
  bezier(140,210,170,170,190,170,220,210);   //贝塞尔曲线,绘制眼睛
  bezier(280,210,310,170,330,170,360,210);
  strokeWeight(15);                           //设置线宽
  bezier(210,300,220,330,270,330,290,300);   //贝塞尔曲线,绘制嘴巴
}

绘图效果:

image.png

将上述代码生成的sunshiner.jpg文件复制到以下代码的同一个文件夹中。以下代码展示了读取图片,演示了太阳从暗变亮,从亮变暗的过程。(此代码无需与Arduino交互)

PImage img;
int i = 0;
boolean max = false;
void setup()
{
  size(500,500);
  img = loadImage("sunshine.jpg");
  background(255);
}
void draw()
{
  if(max == false)
  {
    if(i<=255)
      i++;
    else
    {
      i = 255;
      max = true;
    }
  }
  else
  {
    if(i>0)
      i--;
    else
    {
      i = 0;
      max = false;
    }
  }
  sunDisplay(i);
}
void sunDisplay(int j)
{
  tint(j);
  image(img,0,0);
}

4-Arduino与Processing交互


下面示例代码演示了如何从Arduino获取光敏传感器的数值,并用数值控制图中太阳的亮度,在黑暗的环境中,太阳图片变暗;在光亮的环境中,太阳图片变得明亮。

Processing端:

PImage img;
import processing.serial.*;
Serial myPort;

void setup()
{
  myPort =new Serial(this,"COM10",9600);
  size(500,500);
  img =loadImage("sunshine.jpg");
  background(255);
  myPort.clear();
}
int data;

void draw()
{
  if(myPort.available()>0)
  {
    data=myPort.read();
    if(data>255)
    {
      data =255;
    }
    data =255-data;
    println(data);
  }
  sun(data);
 // println("");
}

void sun(int light)
{
  tint(light);
  image(img,0,0);
}


Arduino端:

int sensorPin = 0;
int val = 0;
void setup()
{
	Serial.begin(9600);
}

void loop()
{
	val = analogRead(sensorPin);
	Serial.write(val);
	delay(30);
}

验证一下效果吧~

image.png image.png

以上是关于Processing与Arduino交互-光敏传感器的主要内容,如果未能解决你的问题,请参考以下文章

Arduino与Processing交互-超声波测距传感器的读取与显示

Arduino与Processing交互-超声波测距传感器的读取与显示

Arduino和C51开发光敏传感器

Arduino发送多个传感器数据到Processing显示

Arduino发送多个传感器数据到Processing显示

Arduino与Processing交互-旋转编码器控制播放音乐