1.前言

    还记得前几个我们都是在讲解数字IO,而其实我们生活中大多数信号都是模拟信号,如声音以及温度变化。在Arduino中,常用0~5v的电压来表示模拟信号。

1.1 模拟输入功能

    在Arduino,编号前带有“A”的引脚是模拟输入引脚,Arduino可以读取这些引脚上输入的模拟值,也就是可以读取引脚上输入的电压大小。
    模拟输入引脚带有ADC功能(ADC:Analog-to-Digital Converter 模数转换)。它可以将外部输入的模拟信号转换为芯片运算时可以识别的数字信号,从而实现读取模拟值的功能。

  • 使用AVR芯片的Arduino模拟输入功能有10位精度,意味着0~5V电压会转换成0~1023的整数形式表示。

    模拟输入功能需要使用analogRead(pin)函数,其中pin是读取模拟值的引脚,被指定的引脚必须是模拟输入引脚。

1.2 模拟输出功能

    要使用analogWrite()函数来实现模拟输出功能。

注意:

  • 该函数并不是输出真正意义上的模拟值,而是以一种特殊的方式来达到输出模拟值的效果,也就是我们经常听到的“PWM”(脉冲宽度调制 Pulse Width Modulation)。

    当使用analogWrite函数,指定引脚会通过高低电平的不断转换来输出一个周期固定(约490Hz)的方波,通过改变高低电平在每个周期中所占比例(占空比),而得到近似输出不同电压的效果。

    analogWrite(pin,value):参数pin为要输出的PWM波的引脚,参数value是PWM的脉冲宽度,范围为0~255。
    大多数Arduino控制器的PWM引脚都会用“~”标识,可以查看一下自己的板子。常见几款板子PWM引脚为:

    基础知识介绍好了,那么就开始接下来的实验了。

2.实验内容

    主要实现两个实验内容:

  • 固定呼吸灯
  • 可调呼吸灯

2.1 固定呼吸灯

实验介绍:
    将LED连接到PWM引脚,主要利用模拟输出功能 analogWrite 函数输出电压,呼吸频率固定。

实验代码:

/**
* @Desc  固定呼吸灯
* @author 单片机菜鸟
* @Date  2016/12/8
* 注意:LED的一端接到5V,另外一端接到输出引脚,低电平亮
*       按键是高电平有效
*/

#define LED 9
#define DELAY_TIME 30 //延时时间

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  //从暗到亮,每次亮度值加5,直到最亮
  for(int fadeValue = 0;fadeValue<=255;fadeValue+=5){
     //输出PWM
     analogWrite(LED,fadeValue);
     //延时一下
     delay(DELAY_TIME);
  }

  //从亮到暗 每次亮度-5直到最暗
  for(int fadeValue=255;fadeValue>=0;fadeValue-=5){
     //输出PWM
     analogWrite(LED,fadeValue);
     //延时一下
     delay(DELAY_TIME);
  }
}

2.2 可调呼吸灯

实验介绍:
    在固定呼吸灯基础上,通过读入的模拟电压大小(模拟输入我们采用一个电位器来分压)来调整频率,同时利用analogRead以及analogWrite函数。

实验代码:

/**
* @Desc  可调呼吸灯
* @author 单片机菜鸟
* @Date  2016/12/8
* 注意:LED的一端接到5V,另外一端接到输出引脚,低电平亮
*       按键是高电平有效
*/

#define LED 9

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  //从暗到亮,每次亮度值加5,直到最亮
  for(int fadeValue = 0;fadeValue<=255;fadeValue+=5){
     //输出PWM
     analogWrite(LED,fadeValue);
     //延时一下
     int delaytime = analogRead(A0)/5;//读取电位器输出电压 用于延时
     delay(delaytime);
  }

  //从亮到暗 每次亮度-5直到最暗
  for(int fadeValue=255;fadeValue>=0;fadeValue-=5){
     //输出PWM
     analogWrite(LED,fadeValue);
     //延时一下
     int delaytime = analogRead(A0)/5;
     delay(delaytime);
  }
}

    当然,上面电位器可以换成光敏电阻之类的,这样就可以考虑做一个晚上呼吸白天熄灭的呼吸灯。

3.总结

    这一课,相对很简单,我们主要学习模拟IO口的使用。以后当我们遇到光敏电阻、热敏电阻、温度传感器、气体传感器之类的可以产生模拟信号的,就应该想到模拟IO口了。

Arduino学习笔记⑤ 模拟IO实验的更多相关文章

  1. Arduino学习笔记④ 经典按键实验

    1.前言     我们讲了数字IO口介绍以及做了流水灯演示(主要用到IO口的输出功能),这节课我们讲解一下IO口的输入功能,说到输入功能,最经典的例子莫过于按键实验.废话少说,赶紧上车. 2.实验材料 ...

  2. Arduino学习笔记① 初识Arduino

    1.前言     近段时间,博主陆续更新了ESP8266学习笔记,主要开发平台是Arduino.但是,对于很多无基础的初学者来说,甚至不了解Arduino是什么.因此,博主决定加入一个Arduino学 ...

  3. Arduino学习笔记③ 经典LED

    1.前言     今天我们开始同时讲解理论以及实践.对于绝大部分有过单片机编程经历的人来说,第一个接触的大多数就是LED灯(忽然想起博主大一那个懵懂的时代,当时大三的师兄给我们展现了一把流水灯功力,当 ...

  4. Arduino学习笔记二:修改LED点灯程序

    看了开源社区的LED控制程序,开始上手代码编写,修改,下载以及调试,原文地址:http://www.arduino.cn/thread-1072-1-1.html,这个帖子写的比较通俗易懂. 自己移植 ...

  5. linux学习笔记之IO

    一.基础知识. 1:普通IO类型. 1,非阻塞IO:发出open/read/write等IO操作,并使这些操作不会永远阻塞.当不能完成时,会立即出错返回. 1)非阻塞的两种标志方式:指定标志:O_NO ...

  6. Java学习笔记之——IO

    一. IO IO读写 流分类: 按照方向:输入流(读),输出流(写) 按照数据单位:字节流(传输时以字节为单位),字符流(传输时以字符为单位) 按照功能:节点流,过滤流 四个抽象类: InputStr ...

  7. Arduino学习笔记⑧ 红外通信

    1.前言     红外通信是一种利用红外光编码进行数据传输的无线通信方式,在目前来说是使用非常广泛的.生活中常见电视遥控器,空调遥控器,DVD遥控器(现在估计是老古董了),均使用红外线遥控.使用红外线 ...

  8. Arduino学习笔记⑦ EEPROM断电保存数据

    1.前言     EEPROM,叫做电可擦可编程可读寄存器(是不是觉得好官方,不知道是什么鬼?反正我也一脸懵逼),只需要知道这是一种断电后数据不会丢失的存储设备,可以用来应对需要做记录做保存的场合.简 ...

  9. Arduino学习笔记⑥ 硬件串口通信

    1.前言     Ardunio与计算机通信最常用的方式就是串口通信.在Arduino控制器上,串口都是位于Rx和Tx两个引脚,Arduino的USB口通过一个转换芯片与这两个串口引脚连接.该转换芯片 ...

随机推荐

  1. 使用python asyncio+aiohttp做接口测试(TODO)

    线程是操作系统层面的“并行”, 协程是应用程序层面的“并行”. 协程本质上就是:提供一个环境,保存一些需要等待的任务,当这些任务可以执行(等待结束)的时候,能够执行.再等待的过程中,程序可以执行别的任 ...

  2. Redis 集群(三)

    为什么为有集群 在 Redis3 版本之前,每台 Redis 机器需要存储所有 Redis key ,这要求每台 Redis 机器有足够大的内存 而且只能是主节点写,从节点读,对于高并发情况下会有性能 ...

  3. C# 事件 Event

    一.事件是什么 微软的定义:和委托类似,事件是后期绑定机制. 实际上,事件是建立在对委托的语言支持之上的.事件是对象用于(向系统中的所有相关组件)广播已发生事情的一种方式. 任何其他组件都可以订阅事件 ...

  4. CSS 换行

    默认情况下,元素的属性是 white-space:normal:自动换行:(不把单词截断,会把单词看作一个整体) -----但是但是但是但是..当元素中的内容是一对没有空格的字符/数字时,超过容器宽度 ...

  5. PHP 正则表达式的简单应用以 preg_match_all 抓取HTML元素为例 [转载]

    PHP 正则表达式的简单应用以 preg_match_all 抓取HTML元素为例 2011-12-02 17:09:39|  分类: PHP|举报|字号 订阅     下载LOFTER我的照片书   ...

  6. .Net Core 商城微服务项目系列(十二):使用k8s部署商城服务

    一.简介 本篇我们将会把商城的服务部署到k8s中,同时变化的还有以下两个地方: 1.不再使用Consul做服务的注册和发现,转而使用k8s-dns来实现. 2.不再使用Ocelot作为业务网关,使用T ...

  7. Vim升华之树形目录插件NERDTree安装图解(ubuntu)

    此文经验证:为真 http://www.linuxidc.com/Linux/2013-06/86048.htm

  8. Linux被中断的系统调用

    慢系统调用,指的是可能永远无法返回,从而使进程永远阻塞的系统调用,比如无客户连接时的accept.无输入时的read都属于慢速系统调用. 在Linux中,当阻塞于某个慢系统调用的进程捕获一个信号,则该 ...

  9. JavaScript设计模式——原型模式

    原型模式: 原型模式是指原型实例指向创建对象的种类,并通过拷贝这些原型创建新的对象,是一种用来创建对象的模式,也就是创建一个对象作为另一个对象的prototype属性: prototype警告:学习了 ...

  10. display值的作用分别是什么?relative和absolute分别是相对谁定位的?

    display值的作用分别是什么? none:元素隐藏,不占据位置 block:该元素显示为块级元素 inline:默认,该元素会被显示为内联元素 inline-block:行内块元素 list-it ...