【Processing+Arduino互动编程】NO.2

Arduino读取声音传感器
声音传感器的模拟输出A0可实时输出麦克风的电压信号,数字输出口D0相当于一个开关,在没有声音或者声音较弱的时候,输出低电平,当声音强度到达一个阀值(可通过调节电位器来改变)时,才输出高电平。
Arduino代码:

int sensorPin =A5;   //模拟5输入端口
int DigitalInput =2;//数字2输入端口
int LEDPin =13;      //LED显示端口
int sensorValue =0;   //声音值变量
boolean threshold;

void setup()
{
  pinMode(sensorPin,INPUT);
  pinMode(DigitalInput, INPUT);
  pinMode(LEDPin,OUTPUT);
  Serial.begin(9600);
}
void loop()
{
  sensorValue =analogRead(sensorPin); //读声音传感器的值
  threshold =digitalRead(DigitalInput);
  if(threshold)
  {
    digitalWrite(LEDPin,HIGH);        //大于阈值灯亮
  }
  else
  {
    digitalWrite(LEDPin,LOW);         //小于阈值灯灭
    delay(50);
    Serial.println(sensorValue,DEC);  //以十进制的形式输出声音值
  }
}

在这里插入图片描述


Processing绘制振动条
通过改变正弦曲线的振幅和相位,就能显示出振动条的效果。
正弦曲线表达式:
y = A*sin(x+f)+b
A:曲线的振幅
x:横坐标上的变量
f:相位
b:纵坐标上的初始位置

processing代码

float offset =100;     //正弦曲线零点向y轴移动的值
float scaleVal =35;    //曲线振幅
float angleInc =PI/60; //角速度,控制曲线的正弦周期
float angle =0;
float dx =0;           //x轴的偏移量

void setup()
{
  size(600,200);
  noStroke();
}

void draw()
{
  background(204);
  fill(0);
  for(int posx =0;posx<=width;posx++)//从左向右,每次加一个单位直到画面的右边
  {
    float posy =offset+(sin(angle-dx)*scaleVal); //求出曲线的下,y坐标
    rect(posx,posy,1,1);       //画出该点
    angle+=angleInc;           //角速度增加,控制曲线的正弦周期
  }
  dx+=0.05;                    //改变曲线的相位,值越小曲线运动越慢
  angle=0;                     //重置角度
}

在这里插入图片描述


声音振幅的显示
Arduino 读取声音传感器的数值,通过串口传给Processing。Processing将读取到的数据转化为曲线的振幅。

Processing代码:

import processing.serial.*;              //导入Serial库

Serial myPort;                           //实例化一个Serial对象

public static final char HEADER ='h';    //从串口读取信息的第一个字符的效验符

public static final short LF =10;        //每次从串口读取信息的长度

float vol;                               //音量变量
float offset =100;                       //正弦曲线零点向y轴移动的值
float scaleVal =35;                      //曲线振幅
float angleInc =PI/60;                   //角速度,控制曲线的正弦周期
float angle =0;
float dx =0;                             //x轴的偏移量
float under;                             //振幅的最小量
float high =200;                         //音量的最大值
String [] com;

void setup()
{
  println(Serial.list());                //获取当前可用串口列表,并保存到com中
  com =Serial.list();
  myPort =new Serial(this,com[1],9600);  //初始化myPort,读取第一个可用串口,串口比特率为9600
  myPort.bufferUntil('\n');              //从串口读取数据时遇到换行符则结束读取
  size(600,200);
  noStroke();
  frameRate(60);
}

void draw()
{
  scaleVal =map(vol,under,high,0,90);    //将音量从范围为under~high插值到0~90
  background(204);
  fill(255,0,0);
  rect(20,20,20,20);                     //绘制一个矩形,当鼠标单击它时获取当前背景噪音,并以当前噪音为基准线
  fill(0);
  for(int posx =0;posx<=width;posx++)
  {
    float posy =offset+(sin(angle-dx)*scaleVal); //从左往右,每次加一个单位直到画面的右边
    rect(posx,posy,1,1);                          //画出该点
                                            
    angle+=angleInc;                              //角度增加
  }
  dx+=0.05;                                       //改变曲线的相位,值越小曲线运动越慢 
  angle =0;                                       //角度重置
}
void serialEvent(Serial myPort)
{
  String message =myPort.readStringUntil(LF);     //返回一个字符串缓冲区,并包括一个特殊字符
  if(message!=null)                               //当读取到的信息不为空时
  {
    String [] data =message.split(",");           //将字符串信息以逗号(“,”)分隔
    
    if(data[0].charAt(0)==HEADER)                 //当data中第一个字符为h时
    {
      if(data.length>1)                           //当data长度大于1的时候
      {
        vol =Integer.parseInt(data[1]);           //获取音量数据大于当前设定的最大值时
        if(high<vol)                               //当最大值设置为读取到的音量的值
        {
          vol = high;
        }
        if(under>vol)                             //当音量数据大于当前设定的最小值时
        {                  
          vol=under;                              //将最小值设置为读取到的音量的值       
        }
      }
    }
  }
}
void mouseClicked()
{
  if(mouseX<40&&mouseX>20)
  {
    if(mouseY<40&&mouseY>20)
    {
      under =vol;
    }
  }
}

arduino代码

int sensorPin =A5;

int sensorValue =0;

void setup()
{
  pinMode(sensorPin,INPUT);
  Serial.begin(9600);
}
void loop()
{
  sensorValue =analogRead(sensorPin);
   Serial.println(sensorValue,DEC);
}

旋转编码器控制播放音乐
在这里插入图片描述
Arduino读取编码器值

const int interruptA =0;                   //中断InterruptA在0引脚上
int CLK =2;                                //连接D2的脉冲信号
int DT=3;                                  //连接D3的脉冲信号,用于判断
int SW =4;                                 //正转(前进)或者反转(后退)
int COUNT =0;                              //连接D4的开关信号

void setup()
{
  attachInterrupt(interruptA,RoteStateChanged,FALLING);//外部中断,高电平变为低电平触发,调用中断处理字函数RotestateChanged()
  pinMode(CLK,INPUT);
  digitalWrite(2,HIGH);
  pinMode(DT,INPUT);
  digitalWrite(3,HIGH);
  pinMode(SW,INPUT);
  digitalWrite(4,HIGH);
  Serial.begin(9600);
}
void loop()
{
  if(!(digitalRead(SW)))   //按下按钮
  {
    COUNT =0;              //计数清零
    Serial.println("STOP COUNT =0");//串口输出清零
    delay(2000);           //延迟2秒
  }
  Serial.println(COUNT);   //如果没有按钮,输出计数值
}
void RoteStateChanged()    //当CLK下降沿触发的时候,进入中断
{
  if(digitalRead(DT))      //当DT为高电平时,前进方向
  {
    COUNT++;               //计数器累加
    delay(20);
  }
  else
  {
    COUNT--;
    delay(20);
  }
}

Processing读取音乐文件用arduino调节音量大小
processing代码

import processing.serial.*;                         //导入Serial和minim函数库
import ddf.minim.*;
Minim minim;                                        //实例化一个Minim对象
AudioPlayer song;                                   //实例化一个音乐播放器对象
Serial port =new Serial(this,"COM3",9600);
float volume =-40;                                  //初始音量大小

void setup()
{
  size(300,300);
  minim =new Minim(this);                           //初始化minim
  song =minim.loadFile("Michal.mp3");               //初始化song对象,读取音乐文件
  song.play();                                       //播放音乐
  song.loop();                                       //循环播放
}

void draw()
{
   background(125); 
   if(port.read()=='a')                             //如果Processing从串口读到字符a,增大音量
   {
     volume++;
   }
   if(port.read()=='b')                              //如果Processing从串口读到字符b,减小音量
   {
     volume--;
   }
   song.setGain(volume);
}

void stop()                                          //停止播放音乐
{
  song.close();                                      //关闭音乐
  minim.stop();
  super.stop();
}

arduino代码

const int interruptA =0;                   //中断InterruptA在0引脚上
int CLK =2;                                //连接D2的脉冲信号
int DT=3;                                  //连接D3的脉冲信号,用于判断
int SW =4;                                 //正转(前进)或者反转(后退)
int COUNT =0;                              //连接D4的开关信号

void setup()
{
  attachInterrupt(interruptA,RoteStateChanged,FALLING);//外部中断,高电平变为低电平触发,调用中断处理字函数RotestateChanged()
  pinMode(CLK,INPUT);
  digitalWrite(2,HIGH);
  pinMode(DT,INPUT);
  digitalWrite(3,HIGH);
  pinMode(SW,INPUT);
  digitalWrite(4,HIGH);
  Serial.begin(9600);
}
void loop()
{
  if(!(digitalRead(SW)))   //按下按钮
  {
    COUNT =0;              //计数清零
  }
}
void RoteStateChanged()    //当CLK下降沿触发的时候,进入中断
{
  if(digitalRead(DT))      //当DT为高电平时,前进方向
  {
    COUNT++;               //计数器累加
    Serial.println('a');
    delay(50);
  }
  else
  {
    COUNT--;
    delay(50);
    Serial.println('b');
  }
}

运行程序后 转传感器的旋钮改变音量大小。


跟随环境光变化的太阳
processing代码

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

void setup()
{
  myPort =new Serial(this,"COM3",9600);
  size(500,500);
  img =loadImage("sun.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代码


const int photocellPin = A0; //photoresistor module attach to A0
const int ledPin = 13;      //pin 13 built-in led
const int relayPin=8;      //relay module attach to digital 8
int outputValue = 0;

void setup()
{
  pinMode(relayPin,OUTPUT); 
  pinMode(ledPin,OUTPUT);
  Serial.begin(9600); 
}

void loop()
{
  outputValue = analogRead(photocellPin);
  Serial.write(outputValue); //print it in serial monitor
  if(outputValue <= 200) //if the value of photoreisitor is greater than 400
  {
    digitalWrite(ledPin,HIGH); //turn on the led 
    digitalWrite(relayPin,LOW); //relay connected
  }
  else //else
  {
    digitalWrite(ledPin,LOW);
    digitalWrite(relayPin,HIGH);
  }
  delay(20); //delay 1s
}


在这里插入图片描述
在这里插入图片描述

发布了28 篇原创文章 · 获赞 3 · 访问量 891

猜你喜欢

转载自blog.csdn.net/wangpuqing1997/article/details/105215864
今日推荐