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
}