arduino analogread_万能超的arduino学习日记(一)

Hi,大家好,这里是万能超,一个机械狗。本科时候有接触过arduino,但是由于导师方向原因,转做了3D打印和动力学分析,所以这里是啥都会一点点的万能超,希望能够和大家一起学习讨论。

最近由于兴趣原因,决定重新捡起arduino,所以决定写这个万能超的arduino学习日记跟大家一起重新学习。

最开始的入门学习,我选择跟B站太极创客的学习视频,因为有基础,选择二倍速观看学习。从arduino uno的各个引脚功能到各类元器件的使用方法视频里讲的很清楚,我主要从三个小电路的控制来带大家总结一下一些简单的小函数。本次推送,主要是带大家进行一个小小的入门,写的相对粗略,具体的学习还是要靠大家自主学习,后面我将会带大家开始一个个小项目的制作。

首先,拿出我珍藏已久的乱七八糟元器件和arduino开发板。

c09723af8ca9416426252f28fee38557.png

里面有杜邦线、面包板、小电阻、发光二极管、电位器、开关等。

Q1· 

示例一:用两个开关调节Led灯的亮度

当按左边开关led亮度增加,右边开关led亮度减小。

  电路的连接如下图:

c3dbf9e4c86e00443ed97e2379993967.png

代码如下:

bool pushButton1;   // 创建布尔型变量用来存储按键开关1的电平状态

bool pushButton2;   // 创建布尔型变量用来存储按键开关2的电平状态

int ledPin = 9;        //设置LED引脚号

int brightness = 127;  //设计LED初始亮度参数

void setup() {

  pinMode(2, INPUT_PULLUP); //将引脚2设置为输入上拉模式

  pinMode(8, INPUT_PULLUP); //将引脚8设置为输入上拉模式

  pinMode(ledPin, OUTPUT);  //将LED引脚设置为输出模式

  Serial.begin(9600);      //启动串口通讯

}

void loop() {

  // put your main code here, to run repeatedly:

  pushButton1 = digitalRead(2); //读取引脚2电平状态并将其赋值给布尔变量

  pushButton2 = digitalRead(8); //读取引脚8电平状态并将其赋值给布尔变量

  if (!pushButton1 && brightness > 0){     // 当按下按键开关1并且LED亮度参数大于0

    brightness--;                          // 减低LED亮度参数

  //(brightness-- 相当于  brightness = brightness - 1;)

  } else if (!pushButton2 && brightness < 255) {  //当按下按键开关2并且LED亮度参数小于255

    brightness++;   //增加LED亮度参数

 //(brightness++ 相当于  brightness = brightness + 1;)

  }

  analogWrite(ledPin, brightness);  //模拟输出控制LED亮度

  Serial.println(brightness); //将LED亮度参数显示在串口监视器上

  delay(10);

}

除注释外的代码解析:

1、数据类型

首先开头bool为定义布尔型变量,其全称为boolean。Arduino开发板是基于C/C++编程语言。因此,具体的数据类型如下表:

d73668eef84f2ab4dc599a76852e2ea7.png

2、pinMode函数

通过pinMode函数可以将引脚模式改为以下三种:

OUTPUT(输出模式):当引脚设置为输出(OUTPUT)模式时,引脚为低阻抗状态。这意味着Arduino可以向其它电路元器件提供电流。也就是说,Arduino引脚在输出(OUTPUT)模式下可以点亮LED或者驱动电机。

INPUT(输入模式):当引脚设置为输入(INPUT)模式时,引脚为高阻抗状态(100兆欧)。此时该引脚可用于读取传感器信号或开关信号。

INPUT_PULLUP(输入上拉模式):Arduino 微控制器自带内部上拉电阻。如果你需要使用该内部上拉电阻,可以通过pinMode()将引脚设置为输入上拉(INPUT_PULLUP)模式。

3、Serial串行通信

串行端口用于Arduino和电脑或其他设备进行通信。我们可以通过串口监视器来查看串口通信。

初学者常用的命令如下:

Serial.begin():设置电脑与Arduino进行串口通讯时的数据传输速率(每秒传输字节数)。

Serial.print():将每一数位以ASCII码形式发送。

4、analogWrite()

将一个模拟数值写进Arduino引脚。这个操作可以用来控制LED的亮度, 或者控制电机的转速。该命令支持以下引脚: 3, 5, 6, 9, 10, 11。

5、if语句

    接触过编程的都会知道if语句的流程如下图:

37462ca7aac8096d94f0073504faff8d.png

语句表达如下:

if(表达式) {

语句块

}

其意义为:如果 “表达式” 的条件得到满足则执行语句块。否则Arduino将不执行该语句块。

以上述代码为例:

  if (!pushButton1 && brightness > 0){     // 当按下按键开关1并且LED亮度参数大于0

    brightness--;    // 减低LED亮度参数

}

如果按下1并且led亮度大于0成立,那判断为真,执行{}中的语句led亮度减小。

6、delay() 延迟

delay()函数可用于暂停程序运行。暂停时间可以由delay()函数的参数进行控制,单位是毫秒。

Q1· 

示例二:用电位器控制灯的亮度

当电位器向右转时,灯的亮度增加,电位器向左转时,灯的亮度减小。

电路连接如下图:

ea74b3359f0f93cf3fe2416de93f7247.png

代码如下:

void setup() {

Serial.begin(9600);

pinMode(9,OUTPUT);

}

void loop() {

int analogInputVal=analogRead(A0);//定义变量为A0引脚的值

Serial.println(analogInputVal);//串口监视器显示该值

int brightness = map(analogInputVal,0,1023,0,255);//将电位器的数值等比映射到0-255led的亮度区间

analogWrite(9,brightness);//将亮度传到led

}

除注释外的代码解析:

Map函数

map()可以用来将某一数值从一个区间等比映射到一个新的区间。

以上述代码为例

int brightness = map(analogInputVal,0,1023,0,255);

analogInputVal为要映射的值;0,1023为映射前的最大最小值;0,255为映射后最大最小值。

Q1· 

示例三:按下按钮后数码管显示随机数

按下右边按钮后,数码管在随后一段时间显示一个随机数。

电路接线如下:

81264b8761dc458f8be5dc09dd2862a3.png

代码如下:         

void setup() {

  pinMode(2, INPUT_PULLUP);

  Serial.begin(9600);

  for (int i = 2; i <= 9; i++) {

    pinMode(i, OUTPUT);//为每个需要的引脚设置为输出模式

  }

  randomSeed(analogRead(A0));//设置为不同的随机数种子

}

void loop() {

  int myNumber;

  if(!digitalRead(2)){

  myNumber = getRandomNumber(0,10);//产生0-9随机数字

  }

 displayNumber(myNumber);//显示数字

}

int getRandomNumber(int minNumber, int maxNumber){

  int randomNumber;

  int i;

  while(i<5){

    i=i+1;

  randomNumber=random(minNumber,maxNumber);

  displayNumber(randomNumber);

  delay(100);

  displayClear();

  delay(100);

  Serial.print("i=");

  Serial.println(i);

  Serial.print("randomNumber=");

  Serial.println(randomNumber);

  Serial.println("");

 }

   return randomNumber;

}

void displayClear(){

  // 清理显示内容

  digitalWrite(3, LOW);

  digitalWrite(4, LOW);

  digitalWrite(5, LOW);

  digitalWrite(6, LOW);

  digitalWrite(7, LOW);

  digitalWrite(8, LOW);

  digitalWrite(9, LOW);

}

void displayNumber(int ledNumber){

  switch(ledNumber){

    case 1:

      digitalWrite(4, HIGH);

      digitalWrite(7, HIGH);

      break;  

    case 2:

      digitalWrite(3, HIGH);

      digitalWrite(4, HIGH);

      digitalWrite(5, HIGH);

      digitalWrite(8, HIGH);

      digitalWrite(9, HIGH);

      break;  

    case 3:

      digitalWrite(3, HIGH);

      digitalWrite(4, HIGH);

      digitalWrite(5, HIGH);

      digitalWrite(7, HIGH);

      digitalWrite(8, HIGH);

      break;  

    case 4:

      digitalWrite(4, HIGH);

      digitalWrite(5, HIGH);

      digitalWrite(6, HIGH);

      digitalWrite(7, HIGH);

      break; 

    case 5:

      digitalWrite(3, HIGH);

      digitalWrite(5, HIGH);

      digitalWrite(6, HIGH);

      digitalWrite(7, HIGH);

      digitalWrite(8, HIGH);

      break;

    case 6:

      digitalWrite(3, HIGH);

      digitalWrite(5, HIGH);

      digitalWrite(6, HIGH);

      digitalWrite(7, HIGH);

      digitalWrite(8, HIGH);

      digitalWrite(9, HIGH);

      break;   

    case 7:

      digitalWrite(3, HIGH);

      digitalWrite(4, HIGH);

      digitalWrite(7, HIGH); 

      break;

    case 8:

      digitalWrite(3, HIGH);

      digitalWrite(4, HIGH);

      digitalWrite(5, HIGH);

      digitalWrite(6, HIGH);

      digitalWrite(7, HIGH);

      digitalWrite(8, HIGH);

      digitalWrite(9, HIGH);

      break;

    case 9:

      digitalWrite(3, HIGH);

      digitalWrite(4, HIGH);

      digitalWrite(5, HIGH);

      digitalWrite(6, HIGH);

      digitalWrite(7, HIGH);

      digitalWrite(8, HIGH);

      break;

    case 0:

      digitalWrite(3, HIGH);

      digitalWrite(4, HIGH);

      digitalWrite(6, HIGH);

      digitalWrite(7, HIGH);

      digitalWrite(8, HIGH);

      digitalWrite(9, HIGH);

      break;

    default:

      digitalWrite(5, HIGH);   

    }

}

除注释外的代码解析:

1、 for循环函数

同其他编程一样,for循环的流程图如下:

b6ad900cd5e5b0af38ef8229addb6d46.png

Arduino语句为:

for(表达式1; 表达式2; 表达式3){

语句块

}

其执行过程为:

1) 先求解表达式1。

2) 求解表达式2,若其值为真(非0),则执行括号中的语句块,否则将结束循环。

3) 每一次执行完语句块,Arduino将求解表达式3。

4) 重复执行步骤 2) 和 3),直到循环结束。

以上述代码为例:

  for (int i = 2; i <= 9; i++) {

    pinMode(i, OUTPUT);//为每个需要的引脚设置为输出模式

  }

解释为定义i初始值为2,如果i小于等于9则将第i号引脚设置为输出模式,在将i加1后循环判定。

1、 switch case语句

Arduino语句为:

switch (var) {

    case 1:

        //当var等于1时执行这里的程序

        break;

    case 2:

        //当var等于2时执行这里的程序

        break;

    default:

        // 如果var的值与以上case中的值都不匹配

        // 则执行这里的程序

        break;

}

就像if语句,switch…case允许Arduino根据不同的条件运行不同的的程序代码。switch语句通过对一个变量的值与case语句中指定的值进行比较。当一个case语句中的指定值与switch语句中的变量相匹配。就会运行这个case语句下的代码。

2、 创建新函数

  如果你想编一些复杂点的程序,实现一些更眩的功能,你会发现你的loop程序会写得非常的长,有时候会搞不清楚具体的一个功能到底写在哪行了。能不能将一个功能的实现写在一个地方,如果要用的时候只要在loop主程序里调用一下就可以了呢?答案当然是可以的,如果你已经学过了c语言等等,你或许已经知道如何来做了,那就是自定义函数。由于内容过多,我们将在以后讲解。

 到这里,万能超的arduino学习日记也完成了第一周的学习,我们对arduino的入门操作进行了回顾,以后我们将进行更加复杂深入以及和processing结合的学习,期待以后和大家的见面,如果有什么疑问,可以加入我们的qq群478590904进行讨论学习。

2a39d249b4b8e5469a326c52275733da.png

有一种令人向往的

梦想,

激发内心深处的

渴望。

电子艺术

微信公众号:processing与arduino

微信号:chen-mo_shi-jin

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值