arduino入门
1,arduino开发板主要用于处理输入输出信号;
2,第一个案例:利用arduino IDE编辑代码控制LED灯闪烁;
void setup(){ 仅仅执行一次
PinMode(13,output); //设置引脚模式,13号为输出;
}
void loop(){ //循环执行,不停止
digitalWrite(13,HIGH); //设置数字输出,13号引脚高电平,此时灯亮;
delay(1000); //延迟1000ms之后执行下一步函数;
digitalWrite(13, LOW); //设置13号引脚为低电平,此时灯灭;
delay(1000); //延迟函数;
}
3,第二个案例:流水灯控制;
将6个小灯插到面包板上,其中长引脚分别分配arduino的6,7,8,9,10,11接口;短引脚全部都接到面包板的蓝线上,然后在面包板的蓝线中的一个接口连接到arduino的GND接口。代码如下:
void setup(){
pinMode(6,output);
pinMode(7,output);
pinMode(8,output);
pinMode(9,output);
pinMode(10,output);
pinMode(11,output);
}
void loop(){
digitalWrite(6, LOW);
digitalWrite(7,HIGHT);
delay(200);
digitalWrite(7, LOW);
digitalWrite(8,HIGHT);
delay(200);
digitalWrite(8,LOW);
digitalWrite(9,HIGHT);
}
4,开关元件;
(1)开关元件有四个脚,内部电路是这样的,连接的时候要么对角线,要么等侧连接;
(2)还有一种是震动开关:只要震动,里面的电线接触,就接通;没有正负极
(3)第三种开关,干簧管。磁铁一旦靠近就接通。
(4)第四种开关,滚珠开关。只要倾斜就接通,因为里面有个小滚珠。但是只有一侧滚动能接通;
5,本来开关和灯没有关系,现在利用程序控制,当按下开关时,灯亮。其中,灯泡长脚是连接7号接口,7号接口定义为输出信号,而开关连接的引脚是连接8号接口,8号接口定义为输入信号;因为此刻开关作为外部控制设备,是向开发板输入信息,LED灯作为受控器件,是开发板向它输出信号。点击按钮的时候,电流从蓝色线流向接口,此时可以判断如果此接口是低电平则灯泡亮;
源代码:
void setup(){
pinMode(7, output);
pinMode(8,input);
digitalWrite(8,HIGH);//设置开关初始值是高电平;
}
void loop(){
if(digitalRead(8)==LOW) //如果8是低电平,即按下开关;
digitalWrite(7,HIGH);
digitalWrite(7,LOW);
}
7,利用蜂鸣器实现手风琴;
和上一个原理一样,因为蜂鸣器是根据频率不同设置的,所以,根据开关接口的电平不同设置相应的蜂鸣器频率。
void setup(){
pinMode(8,INPUT); //设置开关
digitalWrite(8, HIGH);
pinMode(9,INPUT);
digitalWrite(9, HIGH);
piMode(10,INPUT);
digitalWrite(10, HIGH);
pinMode(11,OUTPUT) //设置灯
pinMode(12, OUTPUT)
pinMode(13,OUTPUT)
}
void loop(){
if(digitalRead(8)==LOW){
tone(7,2093); //蜂鸣器频率设置为2093,发出dou
digitalWrite(11, HIGH);
}else{
notone(7);
digitalWrite(11,LOW);
}
往下重复2个开关值;;;
8,呼吸灯:所谓呼吸比较平稳,所以不能像闪烁的LED那样忽闪忽灭,所以要使用模拟输出,电流连续变化。
代码:
void setup(){
pinMode(11,OUTPUT);
}
void loop(){
for(int i=0;i<30;i++){
analogWrite(11,i); //模拟信号输入,其中的i范围是[0,255];
delay(10);
}
for(int j=29;j>0;j--){
analogWrite(11,j);
delay(10);
}
}
其中模拟信号电压和数字信号电压的值,对应关系:
模拟信号是如何实现,在一个周期控制电压在一个范围内的?
如图,on属于5v, off属于0v,在一个时间周期,即发送一次脉冲时, 上一个图ta在on的持续时间是25%,off持续的时间是75%,这样计算出来的电压值:v0=5*25%+0*75%=1.25(v); 可以简单的这样理解;
9,呼吸流水灯:
void setup(){
pinMode(3, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
}
int ports[6]=[3,5,6,9,10,11];
int i=0,level=0;
set loop(){
analogWrite(ports[i], level);
delay(10);
++level %=7;
++i %=6; i首先自增,然后取模6,也即是,i一直处于0~5的范围循环;
}
10, 台灯的原理(模拟输入):利用电位计能够取得连续值;电位计有3个腿,左边接+5v电源接口,最右边的接GND,中间的接模拟输入接口;
void setup(){
pinMode(9,OUTPUT); //仅需要设置灯的接口是输入还是输出就行了,不用设置电位计的接口,因为电位计接的是模拟输入区域,已经规定那几个端口就是输入;
Serial.begin(9600); //Serial是表示串口,begin设置波特率;
}
void loop(){
Serial.printIn(analogRead(A0)); //analogRead(A0)表示读取电位计A0输入接口的值,Serial.printIn()表示将值输出到屏幕上;这 个屏幕可以是串口小助手工具,将板子连接到电脑,串口小助手设置相应的COM口,然后 就可以读取值并显示;
analogWrite(9, analogRead(A0)/4); //将灯的输出值设置为电位计的输入值;因为模拟输入的范围是[0,1023],而模拟输出的 范围是[0,255],所以接口9的值应该设置为电位计输入值的1/4;
delay(200);
}
11,电子骰子,使用一个电子数码管,电阻,滚珠开关;其中电子数码管是由8个LED灯组合的,有共阴极和共阳极,使用时需要了解阴阳,如果是共阴需要接GND;并且数码管极易烧坏,需要连接电阻;
源代码:(使用的是共阴极一位数码管)
class LedSegmentDisplays
{
private:
int ports[8];
int digits[10][8];
public:
LedSegmentDisplays(int a, int b, int c, int d, int e, int f, int g, int h)
{
ports[0] = a; ports[1] = b; ports[2] = c; ports[3] = d; ports[4] = e; ports[5] = f; ports[6] = g; ports[7] = h;
int digits_copy[10][8] = {
{1, 1, 1, 1, 1, 1, 0, 0}, // 0
{0, 1, 1, 0, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1, 0}, // 2
{1, 1, 1, 1, 0, 0, 1, 0}, // 3
{0, 1, 1, 0, 0, 1, 1, 0}, // 4
{1, 0, 1, 1, 0, 1, 1, 0}, // 5
{1, 0, 1, 1, 1, 1, 1, 0}, // 6
{1, 1, 1, 0, 0, 0, 0, 0}, // 7
{1, 1, 1, 1, 1, 1, 1, 0}, // 8
{1, 1, 1, 1, 0, 1, 1, 0} // 9
};
for(int i = 0; i < 8; i++)
pinMode(ports[i], OUTPUT);
for(int i = 0; i < 10; i++)
for(int j = 0; j < 10; j++)
digits[i][j] = digits_copy[i][j];
}
void noLight()
{
for(int i = 0; i < 8; i++)
digitalWrite(ports[i], LOW);
}
void d(int digit)
{
for(int i = 0; i < 8; i++)
digitalWrite(ports[i], digits[digit][i]);
}
};
void setup() {
randomSeed(analogRead(0)); //设置随机种子,配合random使用
pinMode(2, INPUT);
digitalWrite(2, HIGH);
}
LedSegmentDisplays Disp(3,10,7,8,9,4,5,6); //LedSegmentDisplays 是一个模板,Disp是模板下的实例
void loop() {
if(digitalRead(2) == LOW)
Disp.d(random(1,7)); // [1,6] d是实例Disp下的一个方法,radom不包含下限;
delay(20);
}
12,震荡的LED:需要光敏电阻,电阻,LED;
将光敏电阻一端接到5v,另一端接电阻,电阻接GND,两者中间拉出一条线接analogIn;
代码:
void setup(){
Setrial.begin(9600);
}
void loop(){
Setril.printIn(analogWrite(0)); //中间那根线接0端口,即串口输出端口;
delay(200);
}
电铃的原理:通电时,电磁感应产生磁力,开关(振荡器)被吸引下拉,然后断电,线圈失去磁性,开关又复原,然后又通电;周而复始。这也是晶振的原理;
源代码:
void setup(){
pinMode(9,OUTPUT);
Setrail.begin(9600);
}
void loop(){
Setrail.printIn(analogRead(0));
analogWrite(9, map(analogRead(0), 400,700,0,255); //map(值,a1,b1,a2,b2),即,将值的原始范围[a1,b1]映射到[a2,b2];
delay(200);
}
13,测量温度。器材:LM35
LM35有三条腿,左边接正极,右边接地,中间接串口输出0端口;
void setup(){
Serail.begin(9600);
}
void loop(){
Serail.printIn(analogRead(0)*0.48828125); //与0.48828125相乘在串口助手界面显示的时温度值,(5/开发板的测量精度)*100
delay(200);
}
14,红外热释报警。器材:红外热释传感器,蜂鸣器。红外热释传感器左边接5v,中间接数字输入7号,右边接GND;
有探测角度和探测距离等参数;
void setup(){
pinMode(7, INPUT);
}
void loop(){
if(digitalRead(7)==LOW)
tone(13,2000); //蜂鸣器的震动频率
else{
noTone(13);
}
}
15,74HC595芯片。功能:扩展输入端口;
从8号端口输出一个1,在芯片内部设置8个位,然后这8个位作为输出,是并行同时输出。所以是串转并。