Arduino 内置示例——基本原理示例

之前我们简单介绍了Arduino 内置示例结构及其简单框架,这里我们继续介绍其基本原理中的基本示例。

基本原理

image.png
  • 模拟读取串口:读取一个电位计,打印它的状态到Arduino串口监视器。
  • 最简框架:开始一段新程序的最简框架
  • 闪烁:不停打开关闭一个LED灯。
  • 数字读取串口:读取一个开关,打印它的状态到Arduino串口监视器。
  • 渐变:使用模拟输出口来使一个LED灯的亮度变淡。
  • 读取模拟电压:读取一个模拟输入,然后打印其电压值到串口监视器。
1、模拟读取串口
image.png

这个例子展示怎样通过电位计从物理世界里读取模拟输入。电位计是一个简单的物理设备,在它的轴转动时可以提供一系列的阻值。流过的电压通过电位计和进入开发板的模拟输入口,可以测量由电位计产生的大量电阻,作为一个模拟值。我们可以通过该例子监视电位计的状态。电位计也可以叫做电平值。

连接从电位计到你的开发板的3条线。第一根线从电位计的一个输出引脚到地。第二根从电位计的另一个输出引脚到5V。第三根从电位计中间的引脚到模拟引脚A0。

硬件连接:


image.png

注意:

  1. 通过旋转电位计的轴,你在刮器任意一个方向改变电阻的值(刮器连接到电位计中心引脚)。这个可以改变中间引脚的电压。当中心引脚和5v的电阻约为0时(中心引脚到地的电阻约为10kΩ),中心引脚的电压约为5V。当电阻被翻转时,中心引脚电压约为0,即是地。这个电压是你在读取输入引脚的模拟电压。

  2. Arduino开发板有一个内置电路叫模拟到数字转换器(ADC),这个可以读取变化的电压,并转换成0到1023之间的数值。另外,analogRead()函数可以按比例转换一个0到1023之间的数字成为这个引脚上的电压。

样例代码:

// 当程序启动或者复位后,setup只运行一次
void setup() {
  // 通过串口初始化其波特率为9600
  Serial.begin(9600);
}

// 板子会自动调用loop使其程序会以循环模式运行
void loop() {
  //需要创建一个变量来保存来自你的电位计的电阻值(这个数值在0到1023之间,最好用int)
  int sensorValue = analogRead(A0);
  // 需要打印这个信息到你的串口监视器窗口。你可以在代码的最后一行增加Serial.println()来打印
  Serial.println(sensorValue);
  //每次循环延时1ms
  delay(1);       
}

现在,当你打开你在Arduino IDE软件上的串口监视器(可以通过键盘快捷键Ctrl+Shift+M打开),你应该看到和罐子位置相关的一个稳定的从0到1023的数据流。随着你转动电位计,这些数字会即时响应。

运行效果:


image.png
image.png

2、闪烁

通过io,控制led的不停闪烁。需要使用LED灯,220 ohm 电阻。

硬件连接:


image.png

注意:

  1. 先连接电阻的一端到Arduino的PIN2引脚。再连接LED灯的短引脚(负脚,也叫负极)到电阻的另一端。最后连接LED灯的长引脚(正脚,也叫阳极)到Arduino的V5引脚。
  2. 串联LED灯的电阻值可以在220 ohm之间;LED灯点亮时,其阻值直达1k ohm。

插好电路板,连上电脑之后,打开Arduino IDE软件,从菜单里载入。
File/Examples/01.Basics/Blink 。你最先要做的事是,作为一个输出引脚初始化pin2:


image.png

示例源码:

//在该代码首位置,需要定义我们需要输出的IO,例如
#define LED_BUILTIN 2 //定义数字IO 2的名字为led

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // 写入pin2为高电平
  delay(1000);                       // 延时1s
  digitalWrite(LED_BUILTIN, LOW);    // 写入pin2为低电平
  delay(1000);                       // 延时1s
}

运行效果:


闪烁.gif

3、数字读取串口

这个例子展示怎样通过创建开发板和电脑的串口通讯监视开关状态

image.png

注意:

  1. 连接两根线到开发板。GND脚接一个开关的一脚,开关对角线的脚接pin2。
    2、开关连接电路的两点。按钮是断开的(未按),默认读取到的是高定平1,当按键按下开关变为连通状态,由于接GND,pin2电平被拉低为0.
  2. 如果你没有连接到数字I/O口到任何地方,TX的LED灯可能会不规则闪烁。这是因为输入引脚处于悬浮状态——它没有固定连接到电源或者地,并且它会随机在高电平和低电平之间切换。这是你需要下拉或者上拉电阻的原因。(延时缩小,就能看到数据在0、1反复切换)

IO悬空状态输出:


IO悬空

正常状态:


image.png
// digital pin 2 has a pushbutton attached to it. Give it a name:
int pushButton = 2;

// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
  // make the pushbutton's pin an input:
  pinMode(pushButton, INPUT);
}

// the loop routine runs over and over again forever:
void loop() {
  // 读取pin2脚电平状态
  int buttonState = digitalRead(pushButton);
  // 输出电平的状态值
  Serial.println(buttonState);
  delay(1000);        // 原例程延时1ms,建议加大延时,效果可能会明显一些
}
image.png

ps:如果为了显示效果较好,可以引入按键防抖处理
防抖原理:

  1. 按键检测原理:将Arduino的数字IO设置为输入状态来监控按键是否按下,当按键未按下时候因为有上拉电阻存在,读到的电平是高电平,当按键按下时,因为按键引脚接地,读取得电平为低电平,由此判断按键是否按下。
  2. 按键去抖原理:因为人手的机械动作使按键按下时会产生大概20ms左右的按键抖动效果,如果在这期间检测IO电平很可能会出现不稳定信号,因此检测到电平后需要延时20ms
  3. 松手检测原理:程序无限循环等待按键松开,其实就是不断地去检测IO状态,如果恢复了高电平就可以跳出循环。

4、渐变

例子示范怎么使用 analogWrite() 函数来使LED灯逐渐变亮和变暗。
模拟写入是使用调幅脉冲(PWM),快速切换数字引脚的开关状态来达到渐明渐暗的效果。


image.png

把LED灯的阳极(较长,正极的引脚)通过一个220 ohm的电阻连接到开发板上的数字输出引脚pin9。阴极(较短,负极的引脚)连接到地。

样例代码:

/*
  Fade

  This example shows how to fade an LED on pin 9 using the analogWrite()
  function.

  The analogWrite() function uses PWM, so if you want to change the pin you're
  using, be sure to use another PWM capable pin. On most Arduino, the PWM pins
  are identified with a "~" sign, like ~3, ~5, ~6, ~9, ~10 and ~11.

  This example code is in the public domain.

  http://www.arduino.cc/en/Tutorial/Fade
*/

int led = 9;           // the PWM pin the LED is attached to
int brightness = 0;    // how bright the LED is
int fadeAmount = 5;    // how many points to fade the LED by

// the setup routine runs once when you press reset:
void setup() {
  // declare pin 9 to be an output:
  pinMode(led, OUTPUT);
}

// the loop routine runs over and over again forever:
void loop() {
  // set the brightness of pin 9:
  analogWrite(led, brightness);

  // change the brightness for next time through the loop:
  brightness = brightness + fadeAmount;

  // reverse the direction of the fading at the ends of the fade:
  if (brightness <= 0 || brightness >= 255) {
    fadeAmount = -fadeAmount;
  }
  // wait for 30 milliseconds to see the dimming effect
  delay(30);
}
  1. 声明pin9作为LED的引脚后,不用在setup()函数里加入其他语句。
  2. 你要在主循环里用analogWrite()函数来提供两个参数:一个调用这个引脚写入的函数,一个写入PWM的值。
  3. 为了使LED灯渐明和渐暗,从0到255逐渐增加PWM值,然后回到0,重复循环。在下面程序里,这个PWM值是用一个brightness的变量来控制。每次循环,它都跟随变量fadeAmount的值增加而增加。
  4. 如果brightness在它的值的极端(0或者255),那么fadeAmount变为负极。换句话,如果fadeAmount是5,那么它被设为-5。如果它是-5,那么它被设为5。循环的下一次,这个变化同样会引起brightness改变方向。
  5. analogWrite() 可以很快地改变PWM值,所以程序后面的延迟控制渐变的速度。试下改变延时的时间,然后看它怎么影响LED灯渐变。

运行效果:


渐变.gif

5、读取模拟电压

例子展示怎样读取一个在模拟引脚PIN 0上的模拟输入,把analogRead()的值转换成电压,然后打印到Arduino IDE的串口监视器里。

image.png
  1. 连接从电位计到你的开发板的3条线。第一根线从电位计的一个输出引脚到地。第二根从电位计的另一个输出引脚到5V。第三根从电位计中间的引脚到模拟引脚A0.
  2. 通过旋转电位计的轴,你在刮器任意一个方向改变电阻的值(刮器连接到电位计中心引脚)。这个可以改变中间引脚的电压。当中心引脚和5v的电阻约为0时(中心引脚到地的电阻约为10kΩ),中心引脚的电压约为5V。当电阻被翻转时,中心引脚电压约为0,即是地。这个电压是你在读取输入引脚的模拟电压
  3. Arduino和Genuino开发板有一个内置电路叫模拟到数字转换器,或者叫ADC,这个可以读取变化的电压,并转换成0到1023之间的数值。另外,analogRead()函数可以按比例转换一个0到1023之间的数字成为这个引脚上的电压。

样例代码:

/*
  ReadAnalogVoltage

  Reads an analog input on pin 0, converts it to voltage, and prints the result to the Serial Monitor.
  Graphical representation is available using Serial Plotter (Tools > Serial Plotter menu).
  Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.

  This example code is in the public domain.

  http://www.arduino.cc/en/Tutorial/ReadAnalogVoltage
*/

// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
}

// the loop routine runs over and over again forever:
void loop() {
  // 变量sensorValue来保存来自你的电位计的电阻值(这个数值在0到1023之间,最好用int)
  int sensorValue = analogRead(A0);
  // 为了使从0-1023的值对应到读取到的电压值,你需要创建另外一个浮点类型的变量,然后做一些运算:
  float voltage = sensorValue * (5.0 / 1023.0);
  // print out the value you read:
  Serial.println(voltage);
}

运行效果:
当你打开你在Arduino IDE软件上的串口监视器(可以通过键盘快捷键Ctrl+Shift+M打开),你应该看到一个范围从0.0-5.0的稳定的数据流。随着你转动那个旋钮,这个输入到A0引脚的电压值会随之变化。

image.png
image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,076评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,658评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,732评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,493评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,591评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,598评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,601评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,348评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,797评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,114评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,278评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,953评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,585评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,202评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,180评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,139评论 2 352

推荐阅读更多精彩内容