Arduino 入门程序示例之一个 LED(2015-06-11)
前言
答应了群主写一些示例程序,一直拖延拖延拖延唉。主要还是害怕在各大高手面前班门弄斧……(这也算是给拖延症找一个美好的理由吧),这几天终于下决心要写出来了,各位高手拍砖敬请轻拍啊。
示例程序
首先是闪灯程序
示例自带的闪灯就略过了,这里写个不大一样的,使用 millis() 来进行时间间隔的判断,与示例使用 delay() 的方式比较,这种方式不会阻塞主进程,以后很多地方会用得上的:
// ----------------------------------------------------------------------------
// millisBlink.ino
//
// Created 2015-05-28
// By seesea <seesea2517#gmail#com>
//
// 使用millis()来判断时间间隔进行的闪灯程序
//
// 使用板上 LED
// ---------------------------------------------------------------------------- const unsigned char led = ;
const unsigned long switchMs = ; // 亮灭的切换延时时间 unsigned long lastMs = millis();
bool light = false; void setup()
{
pinMode(led, OUTPUT);
} void loop()
{
// 如果不到切换时间,则跳出函数,不阻塞主程序
if (millis() - lastMs < switchMs)
return; lastMs = millis(); light = !light;
digitalWrite(led, light);
}
其次,还是闪灯程序
这里使用时钟中断来实现。
// ----------------------------------------------------------------------------
// intBlink.ino
//
// Created 2015-05-28
// By seesea <seesea2517#gmail#com>
//
// 使用时钟中断来实现的闪烁灯
//
// 使用板上 LED
// ---------------------------------------------------------------------------- const int led = ;
const unsigned long T1InitCount = - F_CPU / / ; // 2Hz闪烁,TCNT 初始值, 256 预分频 void setup()
{
pinMode(led, OUTPUT); noInterrupts(); TCCR1A = ;
TCCR1B = ; TCNT1 = T1InitCount;
TCCR1B |= ( << CS12); // 256 预分频
TIMSK1 |= ( << TOIE1); // T1 溢出中断允许 interrupts();
} // 中断函数
ISR(TIMER1_OVF_vect)
{
TCNT1 = T1InitCount; // 重装初值。如果使用比较中断,则不需要重装初值了
digitalWrite(led, ! digitalRead(led));
} void loop()
{
// loop 函数里啥也不需要,可以做爱做的事情哟
}
接下来要加上一个按钮啦
// ----------------------------------------------------------------------------
// keyLED.ino
//
// Created 2015-05-29
// By seesea <seesea2517#gmail#com>
//
// 按钮按下灯亮,松开灯灭的实验
//
// 使用板上 LED,按钮引脚接 8 脚及 GND,pin 8 使用内部上拉
// ---------------------------------------------------------------------------- const unsigned char led = ;
const unsigned char key = ; void setup()
{
pinMode(led, OUTPUT);
pinMode(key, INPUT_PULLUP);
} void loop()
{
digitalWrite(led, ! digitalRead(key));
}
下面还是按钮,使用外部中断来实现
// ----------------------------------------------------------------------------
// keyIntLED.ino
//
// Created 2015-05-29
// By seesea <seesea2517#gmail#com>
//
// 使用外部中断来实现的按钮按下灯亮,松开灯灭的实验
// 注:0 号中断固定为 pin 2
//
// 使用板上 LED,按钮引脚接 2 脚及 GND,pin 2 使用内部上拉
// ---------------------------------------------------------------------------- const unsigned char led = ;
const unsigned char key = ; void setup()
{
pinMode(led, OUTPUT);
pinMode(key,INPUT_PULLUP); attachInterrupt(, lightLED, LOW); // 使用低电平中断
} // 中断函数
void lightLED()
{
// 中断函数优先于普通函数,低电平会不断中断,从而只执行灯亮的操作
digitalWrite(led, HIGH);
} void loop()
{
// 中断函数优先于普通函数,低电平会不断中断,从而只执行灯亮的操作
// 待中断结束后,执行这里灯灭操作
digitalWrite(led, LOW);
}
接着还要做按钮实验,这个实验演示了软件消抖
如果不消抖的话,会有非预期的效果出现哦
// ----------------------------------------------------------------------------
// keyIntLED.ino
//
// Created 2015-05-29
// By seesea <seesea2517#gmail#com>
//
// 使用外部中断来实现的按钮按下灯亮,松开灯灭的实验
// 注:0 号中断固定为 pin 2
//
// 使用板上 LED,按钮引脚接 2 脚及 GND,pin 2 使用内部上拉
// ---------------------------------------------------------------------------- const unsigned char led = ;
const unsigned char key = ; void setup()
{
pinMode(led, OUTPUT);
pinMode(key,INPUT_PULLUP); attachInterrupt(, lightLED, LOW); // 使用低电平中断
} // 中断函数
void lightLED()
{
// 中断函数优先于普通函数,低电平会不断中断,从而只执行灯亮的操作
digitalWrite(led, HIGH);
} void loop()
{
// 中断函数优先于普通函数,低电平会不断中断,从而只执行灯亮的操作
// 待中断结束后,执行这里灯灭操作
digitalWrite(led, LOW);
}
现在不玩按钮了,要实验 PWM
// ----------------------------------------------------------------------------
// pwmLED.ino
//
// Created 2015-05-31
// By seesea <seesea2517#gmail#com>
//
// 外部模拟设备控制灯亮度的实验
//
// 使用板上 LED,pin 13 没有 pwm 功能,所以用接线把 pin 11 接到 pin 13 进行实验
// 外部模拟器件可使用电位器,两端接 VCC 及 GND,中间接 A0 模拟引脚
// 外部模拟器件或者使用光敏电阻与普通电阻串联,两端接 VCC 及 GND,中间接 A0 模拟引脚
// ---------------------------------------------------------------------------- const unsigned char led = ;
const unsigned char sensor = A0; void setup()
{
pinMode(led, OUTPUT);
pinMode(sensor, INPUT);
} void loop()
{
// 用 map 函数进行范围的映射
analogWrite(led, map(analogRead(sensor), , , , ));
}
下面有图有真相,使用电位器来控制灯的亮度,或者用模拟传感器来控制——比如光敏电阻:
|
|
![]() |
![]() |
![]() |
呼吸灯
PWM 会了,大名鼎鼎的呼吸灯不能少
// ----------------------------------------------------------------------------
// breathingLED.ino
//
// Created 2015-05-29
// By seesea <seesea2517#gmail#com>
//
// 呼吸灯程序
//
// 使用时将 pin 11 用线接到 pin 13 上可以使用板子上的 LED 来实验
// ---------------------------------------------------------------------------- const unsigned char led = ; void setup()
{
pinMode(led, OUTPUT);
// pinMode(13, INPUT); 如果遇到灯亮度不够的情况,可以试试把这句话加上
} void loop()
{
static unsigned char pwm = ;
static char delta = ; if (pwm == )
{
// 最亮的时候改变变化方向为变暗
delta = -;
}
else if (pwm == )
{
// 最暗的时候改变变化方向为变亮
delta = ;
} pwm += delta; analogWrite(led, pwm);
delay();
}
简单上个接线图:
![]() |
数字口实现的呼吸灯
还是呼吸灯,这次使用数字口来实现,以后有遇到 PWM 口不够的时候,就可以用这种模拟的方法了
// ----------------------------------------------------------------------------
// digitalbreathingLED.ino
//
// Created 2015-05-29
// By seesea <seesea2517#gmail#com>
//
// 直接使用 pin 13 数字引脚来实现呼吸灯
// ---------------------------------------------------------------------------- const unsigned char led = ;
const unsigned char maxPwm = ; void setup()
{
pinMode(, OUTPUT);
} void loop()
{
static unsigned char pwm = ;
static char delta = ; if (pwm == )
{
// 最亮的时候改变变化方向为变暗
delta = ;
}
else if (pwm == )
{
// 最暗的时候改变变化方向为变亮
delta = -;
} pwm += delta; // 先亮灯,等占空比到切换点的时候灭灯
digitalWrite(led, HIGH);
for (unsigned char i = ; i < maxPwm; ++i)
{
if (i == pwm)
digitalWrite(led, LOW); delayMicroseconds();
}
}
这个也有图,可以看看没有接线的图 :D
![]() |
Arduino 入门程序示例之一个 LED(2015-06-11)的更多相关文章
- Arduino 入门程序示例之一排 LED(2015-06-11)
概述 最简单的一个 LED 的实验之后,自然是增加几个 LED,咱排成一排来玩吧.最后,再把一排的 LED 排成一个 8 字来玩——七段数码管. 示例程序 流水灯 第一个出场的肯定是经典的流水灯,也叫 ...
- Arduino 入门程序示例之一片 LED(2015-06-11)
概述 从点到线,从线到面.现在开始要来一片的 LED 了,一大波的 LED 正在到来! 示例程序 因为手头没有现成的模块,手头只有 595,所以这里每一个示例程序都是使用 74HC595 扩展 IO ...
- Arduino 入门程序示例之直流电机(2015-06-15)
概述 演示直流电机的控制. 示例程序 PWM控制直流电机 略过控制电机转停的示例啦,有需要就把这里的 PWM 换成数字口输出 HIGH 或 LOW 就行了. // ------------------ ...
- arduino入门学习实现语音控制LED灯
需要的准备的硬件arduino+PC+麦克风实现语音命令控制LED灯的亮灭. 首先需要将写好的arduino程序烧录到arduino uno主板中,下面是代码如下: int val;//定义变量val ...
- 第一个程序点亮一个LED灯
#include <reg52.h> // 引用52包文件 可以理解为命名空间 sbit P1_0 = P1^0; // 定义P1管脚0 void main() ...
- 译文 [ROM][多国语言][2015.06.11] Lenovo S750 (MTK6589) - andrea_d86-lenovos750-4.2.2
************************************************** andrea_d86-lenovos750-4.2.2-150530 ************** ...
- 2015.06.11,技术,关于Matlab中的Jbtest检验
总体分布的正态性检验一般采取Jarque-Bera检验方法. 1. JBTest检验的定义: 在统计学中,Jarque-Bera检验是对样本数据是否具有符合正态分布的偏度和峰度的拟合优度的检验.该检验 ...
- SpringMVC系列(一)SpringMVC概述和搭建SpringMVC的第一个helloWord入门程序
一.SpringMVC 概述 • Spring为展现层提供的基于MVC设计理念的优秀的Web框架,是目前最主流的MVC框架之一 • Spring3.0 后全面超越 Struts2,成为最优秀的 MVC ...
- SpringBoot的入门程序
1. 创建一个springboot工程 可以参考springboot入门程序 2. 创建一个实体类 @Data //想相当于@Setter.@Getter和@ToString替代了setter.get ...
随机推荐
- Android手机设置隐藏命令大全
注意:因Android版本较多,固有部分隐藏命令或不能使用 *#*#4636#*#* 显示手机信息.电池信息.电池记录.使用统计数据.WiFi 信息 *#*#7780#*#* 重设为原厂设定,不会删除 ...
- poj 3026 Borg Maze bfs建图+最小生成树
题目说从S开始,在S或者A的地方可以分裂前进. 想一想后发现就是求一颗最小生成树. 首先bfs预处理得到每两点之间的距离,我的程序用map做了一个映射,将每个点的坐标映射到1-n上,这样建图比较方便. ...
- php怎样求一个数组中最长的
<?php $arr = array( 0 => 'd', 1 => '68b3', 2 => 'a86', 3 => 'c9aa97b23b71d5c', 4 => ...
- php随笔5-thinkphp OA系统 人力资源管理
最近闲来无事,自己尝试通过thinkphp3.1.3框架开发一套自己的OA系统,目前已完成了人力资源管理部分的内容,遇到并解决了几个问题. 1.由于刚开始不太熟悉thinkphp的框架,花费了一些功夫 ...
- Python之路:Python 基础(二)
一.作用域 对于变量的作用域,执行声明并在内存中存在,该变量就可以在下面的代码中使用. if 1==1: name = 'lenliu' print name 下面的结论对吗?(对) 外层变量,可以被 ...
- vagrant 使用方法
0.介绍 Vagrant 是一款用来构建虚拟开发环境的工具,非常适合 php/python/ruby/java 这类语言开发 web 应用,"代码在我机子上运行没有问题"这种说辞将 ...
- iframe,modaldialog父子窗口相互通信的问题
--- 子窗口访问父窗口的window对象 --- 打开新窗口一般有几种方法,window.open(...),window.showModalDialog(...),以及iframe中嵌套页面,另外 ...
- POJ-1003&1004
这两题比较简单,就不做分析了,描述下题目,就上代码吧. [题目描述] 1003,其实就是求这个方程的最小n:1/2 + 1/3 + 1/4 + ... + 1/(n + 1) >= c: 100 ...
- 数据结构——链表(linkedlist)
基本分类: 1.单向链表 2.带尾指针的单向链表 3.双向循环链表 以下分类进行说明 1.单向链表 基本元素:*front //头节点 *next //下一节点 声明:node<T>*p; ...
- python 的经常使用时间操作,取得当前时间等
我们先导入必须用到的一个module>>> import time设置一个时间的格式,以下会用到>>>ISOTIMEFORMAT=’%Y-%m-%d %X’看一下当 ...





