arduino

目录

关于点亮LED灯

实验1点亮LED灯(闪烁)

实验2点亮LED灯+HELLO WORLD

实验3for循环制作流水灯

实验4利用RGB三色灯制作炫彩灯光

实验5 通过analogWrite() 函数实现呼吸灯效果

数字IO口的外部电路

用按钮控制LED灯的开关

按钮控制进阶

串口配置

Serial.begin(speed, config)

Serial.available():

Serial.end()

Serial.find(target)

......

最终实现的串口通信



关于点亮LED灯

INPUT        输入模式
OUTPUT        输出模式
INPUT_PULLUP        输入上拉模式

在Arduino核心库中,OUTPUT被定义等于1,INPUT被定义等于0,HIGH被定义等于1,LOW被定义等于0。因此这里也可以用数字替代这些定义。

setup()函数:开始的时候运行一次,相当于初始化的功能。

loop()函数:arduino的执行函数,在运行的过程中不断循环。

用pinMode(pin,mode): 函数将13号引脚设置成输出模式。

digitalWrite(pin,value):将数字IO口输出高电平或低电平

delay(ms):暂停执行多少毫秒

在英文输出状态时,;分号是作为结束符用

在英文输入状态时,//是用单行注释

实验1点亮LED灯(闪烁)

//点亮LED灯(闪烁)
void setup(){
  pinMode(13,OUTPUT);//将13号引脚设置成输出模式
}

void loop(){
  digitalWrite(13,HIGH);//13号引脚上的LED灯就亮了,输出高电位
  delay(1000);
  digitalWrite(13,LOW);//13号引脚上的LED灯就灭了,输出低电位
  delay(1000);
}

 直接在开头定义一个变量,方便日后修改。

int led = 13;

 也可以宏定义的方式,来为设备设置一个名称。

#define LED 13

实验2点亮LED灯+HELLO WORLD

波特率:单片机或计算机在串口通信时的速率(所以一定要保持通信设备的波特率一致,不然无法通信)

Serial.read()这个函数是读串口并返回收到参数,读取1比特的序列资料

意思是:Serial.read() == 'a'正确,Serial.read()=='aa'是错误的

用Serial.println():这个函数从串行端口输出数据

//点亮LED灯+Hello World
void setup(){
  pinMode(13,OUTPUT);//将13号引脚设置成输出模式
  Serial.begin(9600);//将波特率设置成9600
}

void loop(){
  if(Serial.read()=='a'){
    digitalWrite(13,HIGH);
    delay(1000);
    digitalWrite(13,LOW);
    delay(1000);
    Serial.println("Hello World");
  }
  delay(1);//小延时
}

这样就可以在串口监视器上输入a然后LED闪烁一次,并输出Hello World。

实验3for循环制作流水灯

void setup()
{
  // 初始化I/O口
  for(int i=2;i<8;i++)
    pinMode(i,OUTPUT);
}

void loop()
{
  // 从引脚2到7引脚,逐个点亮LED,等待1秒再熄灭LED
  for(int i=2;i<8;i++)
  {
    digitalWrite(i,HIGH);
    delay(1000);
    digitalWrite(i,LOW);   
  }
}

实验4利用RGB三色灯制作炫彩灯光

void setup() {
  // put your setup code here, to run once:
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  
}

void loop() {
  // put your main code here, to run repeatedly:
    for(int i=2;i<=4;i++)
    {
      for(int j=2;j<=4;j++)
      {
        for(int k=2;k<=4;k++)
        {
          digitalWrite(i,HIGH);
          delay(10);
          digitalWrite(j,LOW);
          delay(10);
          digitalWrite(k,HIGH);
          delay(10);
          digitalWrite(k,LOW);
          delay(10);
          digitalWrite(j,HIGH);
          delay(10);
          digitalWrite(i,LOW);
          delay(10);
        }
      }
    }
}

 ps:RGB灯上的-引脚接arduino的GND(接地) 

实验5 通过analogWrite() 函数实现呼吸灯效果

​
/*
Fading
通过analogWrite() 函数实现呼吸灯效果
*/

int ledPin = 2;    // LED连接在9号引脚上
int ledPin2 = 3;
int ledPin3 = 4;
void setup()  { 
  // Setup部分不进行任何处理
} 

void loop()  { 
  // 从暗到亮,以每次加5的形式逐渐亮起来
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) { 
    // 输出PWM
    analogWrite(ledPin, fadeValue);   
    analogWrite(ledPin2, fadeValue);
    analogWrite(ledPin3, fadeValue);      
    // 等待30ms,以便观察到渐变效果
    delay(30);                            
  } 

  // 从亮到暗,以每次减5的形式逐渐暗下来
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) { 
    // 输出PWM
    analogWrite(ledPin, fadeValue);         
    // 等待30ms,以便观察到渐变效果
    delay(30);                            
  } 
}

​

数字IO口的外部电路

Arduino UNO 板有 14 个数字 I/O 引脚(15)(其中 6 个提供 PWM(脉宽调制)输出),这些引脚可配置为数字输入引脚,用于读取逻辑值(0 或 1) ;或作为数字输出引脚来驱动不同的模块,如 LED,继电器等。标有“〜”的引脚可用于产生 PWM。

上面的0-13口就是arduino的数字IO口,0和1一般作为串口通信使用,不接其他设备。

用按钮控制LED灯的开关

方法一:

const int buttonPin = 2;     // 连接按键的引脚
const int ledPin =  13;      // 连接LED的引脚

// 变量定义
int buttonState = 0;         // 存储按键状态的变量

void setup() {
  // 初始化LED引脚为输出状态
  Serial.begin(9600);        //设置波特率
  pinMode(ledPin, OUTPUT);      
  // 初始化按键引脚为输入状态
  pinMode(buttonPin, INPUT);     
}

void loop(){
  // 读取按键状态并存储在变量中
  buttonState = digitalRead(buttonPin);
  
  // 检查按键是否被按下
  // 如果按键按下,那buttonState应该为高电平
  if (buttonState==HIGH) {     
    // 点亮LED
    digitalWrite(ledPin, HIGH);  
    Serial.println("a");
  } 
  else {
    // 熄灭LED
    digitalWrite(ledPin, LOW); 
    Serial.println(buttonState);
  }
  delay(1000);
}

 

上图中我自己的接法导致了相反的结果,按下按钮时灯灭了,因为按下按钮时2号引脚校测到的输入电压为低电平。并且由串口显示器输出的值时不时输出异样的值可知,2号引脚的状态一直不稳定。通过搜索资料得知:使用pinMode(pin, INPUT)配置的引脚在没连接到任何电路上时(处于悬空状态),从引脚读出的结果可能会“乱跳”。这是因为引脚收到了电子噪声的干扰,或者由于电容耦合读取了附近引脚的值。

所以,在按键控制LED实验-Arduino中文社区 - Powered by Discuz!里面的实验中,采用了下拉电阻,将这一节点通过电阻接地。

因而,代码一样,电路不一样时,效果也不同:

 如果像arduino中文社区中连接的这样,设置了限流电阻(左)和下拉电阻(右).当未按下按键时,2号引脚检测到的输入电压为低电平;当按下按键时,会导通2号引脚和VCC,此时2号引脚检测到的输入电压为高电平。通过判断按键是否被按下,来控制LED的亮灭。

 方法二:

通过电压的变化识别按钮:当按钮按下,2号引脚上的电压是5V,当引脚松开,2号引脚上的电压为0V。

void setup() {
  pinMode(7, OUTPUT);
  pinMode(2, INPUT);
}

void loop() {
  if (digitalRead(2) == HIGH) {
    digitalWrite(7, HIGH);
  }
  else {
    digitalWrite(7, LOW);
  }
  delay(1);
}

 

按钮控制进阶

要实现按一下按键,点亮LED;再按一下按键,熄灭LED。 

初始代码:

//全局变量,局部变量

int x=0;
int deng1=0;//记录按键当时的状态
int deng2=0;//记录按键之前的状态

void setup(){
  pinMode(2,INPUT);
  pinMode(7,OUTPUT);
  //digitalWrite(7,HIGH);
}

void loop(){
  deng1=digitalRead(2);
  if(deng1=1 and deng2==0){
    delay(50);
    if(x==0){    //用来切换x的值
      x=1;
    }else{
      x=0;
    }
  }
  deng2=deng1;
  delay(1000);
  if(x==1){digitalWrite(7,HIGH);
  }else{
    digitalWrite(7,LOW);
  }
  
}

改进后:

改进了方法一中的做法:

pinMode(buttonPin,INPUT_PULLUP);

此操作等效于在该引脚到VCC之间连接一个外部上拉电阻。

使用INPUT_PULLUP对输入引脚进行配置
在Atmega芯片中每个输入引脚都对应着一个20kΩ的上拉电阻,你可以通过代码去使这些内置上拉电阻发挥作用(只需在pinMode函数中传入INPUT_PULLUP函数作为参数即可) 。使用上拉电阻会“反转”读取结果,当读取到HIGH的时候说明引脚上为低电压,当读取到LOW时说明引脚上是高电压。
(————————————————
版权声明:本文为CSDN博主「acktomas」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/acktomas/article/details/85197175)

int buttonPin = 2;
int ledPin = 8;
boolean ledState = true;   //布尔值记录状态
void setup() {
  // put your setup code here, to run once:
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(ledPin,OUTPUT);
}

void loop() {
  // 等待按键被按下
  while(digitalRead(buttonPin)==HIGH){}
  if(ledState == true)
  {
    digitalWrite(ledPin,HIGH);
    ledState = !ledState;
  }
  else
  {
    digitalWrite(ledPin,LOW);
    ledState = !ledState;
  }
  delay(500);
}

串口配置

使用串口与计算机通信,需要先使用Serial.begin() 初始化Arduino的串口通信功能

Serial.begin(speed, config)

speed:波特率
config:数据位、校验位、停止位配置

串口输出:Serial.print(val)  val是你要输出的数据,各种类型的数据均可

                   Serial.println(val)   println会在输出完指定数据后,再输出一组回车换行符

串口输入:Serial.read()  每次都会返回一个字节(注意:仅一个字节)的数据,这个返回值是当前串口读到的数据。

Serial.available():

获取串口接收到的数据个数,即获取串口接收缓冲区中的字节数。接受缓冲区最多可保存64 bytes的数据。

Serial.end()

结束串口通信。
该操作可以释放该串口所在的数字引脚,使得其可以作为普通数字引脚使用。

Serial.find(target)

target : 需要搜索的字符串或字符,返回Boolean型:True:找到;False:没有找到

......

通过学习arduino实现软串口通信_lanhebe的博客-CSDN博客_arduino软串口

Arduino串口通信_xiaoshihd的博客-CSDN博客_arduino串口通信实例

最终实现的串口通信

/*
 * arduino uno端程序
 * 串口使用情况
 serial -----computer
 serial1----- nano softwearserial
 */
 #include<SoftwareSerial.h>
 SoftwareSerial softSerial(6,5);
 
void setup() {
  //初始化serial,该串口用于与计算机连接通信:
  Serial.begin(9600);
  //初始化serial1,该串口用于与设备B连接通信;
  softSerial.begin(9600);
  softSerial.listen();
}
//两个字符串分别用于存储A,B两端传来的数据
String device_A_String="";
String device_B_String="";
 
void loop() {
  // 读取从计算机传入的数据,并通过softSerial发送个设备B:
  if(Serial.available()>0)
  {
    if(Serial.peek()!='\n')
    {
      device_A_String+=(char)Serial.read();
     
    }
    else
    {
      Serial.read();
      Serial.print("you said:");
      Serial.println(device_A_String);
      softSerial.println(device_A_String);
      device_A_String="";
     
    }
  }
  //读取从设备B传入的数据,并在串口监视器中显示
  if(softSerial.available()>0)
  {
    if(softSerial.peek()!='\n')
    {
      device_B_String+=(char)softSerial.read();
    }
    else
    {
      softSerial.read();
      Serial.print("device B said:");
      Serial.println(device_B_String);
      device_B_String="";
    }
  }
}
 
 
 
 
/*
 * arduino uno端程序
 * 串口使用情况
 serial -----computer
 serial1----- nano softwearserial
 */
 #include<SoftwareSerial.h>
 SoftwareSerial softSerial(3,2);
 
void setup() {
  //初始化serial,该串口用于与计算机连接通信:
  Serial.begin(9600);
  //初始化serial1,该串口用于与设备B连接通信;
  softSerial.begin(9600);
  softSerial.listen();
}
//两个字符串分别用于存储A,B两端传来的数据
String device_A_String="";
String device_B_String="";
 
void loop() {
  // 读取从计算机传入的数据,并通过softSerial发送个设备B:
  if(Serial.available()>0)
  {
    if(Serial.peek()!='\n')
    {
      device_A_String+=(char)Serial.read();
     
    }
    else
    {
      Serial.read();
      Serial.print("you said:");
      Serial.println(device_A_String);
      softSerial.println(device_A_String);
      device_A_String="";
     
    }
  }
  //读取从设备B传入的数据,并在串口监视器中显示
  if(softSerial.available()>0)
  {
    if(softSerial.peek()!='\n')
    {
      device_B_String+=(char)softSerial.read();
    }
    else
    {
      softSerial.read();
      Serial.print("device B said:");
      Serial.println(device_B_String);
      device_B_String="";
    }
  }
}

 因为这部分当时遇到了很多难题,

用不正常的方式交流
19:54:04.440 -> you said:324
19:54:15.031 -> you said:tyuu
19:54:24.411 -> device A said:hajkldh
19:54:28.395 -> device A said:kkalfdsl
19:54:31.931 -> you said:ksfjlaskdf
19:54:34.205 -> device A said:afjkl
19:54:35.371 -> you said:alkadsj
19:54:39.144 -> you said:中
19:54:54.551 -> device A said:好开心啊
19:55:01.655 -> you said:gfghhjk
19:55:01.935 -> you said:
19:55:04.631 -> you said:nmmbnmkl
19:55:08.669 -> you said:i哦皮哦破看;
19:55:08.855 -> you said:
19:55:13.687 -> device A said:我们终于成功啦
19:55:30.387 -> you said:我们成功了!
19:55:35.024 -> device A said:以后是可以光明正大划水了是吗19:55:40.991 -> you said:哈哈哈哈哈哈哈哈哈哈哈

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值