Arduino学习笔记之模拟输入和输出(第四章)

模拟输出

/*
25 模拟输出1 - analogWrite
太极创客
www.taichi-maker.com

此程序用于太极创客<<零基础入门学用Arduino教程>> 
25 模拟输出1 - analogWrite

演示如何通过两个按键开关通过analogWrite指令
进行模拟输出操作。具体电路和其它信息请参考
太极创客网站本教程相关页面。

2017-04-28
*/
boolean pushButton1;   // 创建布尔型变量用来存储按键开关1的电平状态
boolean pushButton2;   // 创建布尔型变量用来存储按键开关2的电平状态
int ledPin = 9;        //LED引脚号
int brightness = 128;  //LED亮度参数

void setup() {
  // put your setup code here, to run once:
  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);
}

只有带有波浪线的可以调节LED亮度。

当长按右边的键,输出从255降到0,灯亮度降至熄灭;

当长按左边的键,输出从0升到255,灯亮度逐渐变亮。

analogWrite()指定引脚输出,并控制亮度(0~255范围内)。支持356911引脚。

执行analogWrite()时,会给该引脚一个指定的PWM频率,除了5,6引脚(980Hz),一般频率是490Hz左右。

analogWrite()不需要pinMode()设置引脚,但是也可以设置。

PWM

主板上有一句话:PWM=~

当修改analogWrite()的第二个参数时,就是修改在一个周期内LED亮的部分的占比。比如127就是127/255的时间处于亮的状态,其他时间处于灭的状态,频率过快时看起来就觉得亮度低了。

模拟输入

电位器

Potentiometer 电位器,本课学习中使用的电位器类似一个螺丝侧面长者3个引脚的东西。原理类似滑动变阻器。

有一个旋钮,三个引脚,电位器上写着电阻值(13号引脚之间的),比如我的是10000.

旋钮向哪边转,哪边电阻降低。

旋钮左转到头,则12间电阻为0,23间电阻为10000.

电位器可以把0~5v输入电压映射到0~1023范围,旋转旋钮模拟输入会从0~1023变化。

/*
  模拟输入
 
  本程序旨在演示如何使用analogRead()读取Arduino的引脚电平。
  通过调节电位器, A0引脚的输入电压将在0V-5V之间。
  该输入电压将被映射到数值0-1023之间,并显示在串口监视器中。
  
 电路连接:
   电位器中间引脚连接到模拟输入A0引脚
   电位器两端引脚分别连接在Arduino +5V和接地引脚
 
 太极创客 www.taichi-maker.com
 2017-01-08
 
 This example code is in the public domain.
 
 */
 
void setup() {
  // 串口通讯初始化(9600 bps):
  Serial.begin(9600);
}
 
void loop() {
  // 读取模拟输入值:
  int analogInputVal = analogRead(A0);
 
  // 将结果通过串口监视器显示:
  Serial.println(analogInputVal);
}

Arduino每0.1毫秒读取一次输入。

当模拟输入引脚没有连线的时候,读取到的值无法确定。甚至我们把手靠近该引脚,值都会变化。

randomSeed()就是利用一个没连线的空引脚赋值。

示例:电位器控制LED灯亮度

其实很简单,analogInputVal获取到的值通过~引脚输出给电灯就可以了。

一个小问题在于:analogInputVal的范围是01023,analogWrite输出电灯亮度范围是0255,要怎么处理?有一个线程的函数:map

int ledpin=9;
void setup() {
  // 串口通讯初始化(9600 bps):
  Serial.begin(9600);
  pinMode(ledpin,OUTPUT);
}
 
void loop() {
  // 读取模拟输入值:
  int analogInputVal = analogRead(A0);
 
  // 将结果通过串口监视器显示:
  Serial.print("analogInputVal:");
  Serial.println(analogInputVal);
  int brightness=map(analogInputVal,0,1023,0,255);//映射
  Serial.print("brightness:");
  Serial.println(brightness);
  analogWrite(ledpin,brightness);
}

物联沃分享整理
物联沃-IOTWORD物联网 » Arduino学习笔记之模拟输入和输出(第四章)

发表评论