Arduino 入门程序示例之一个 LED(2015-06-11)

前言

答应了群主写一些示例程序,一直拖延拖延拖延唉。主要还是害怕在各大高手面前班门弄斧……(这也算是给拖延症找一个美好的理由吧),这几天终于下决心要写出来了,各位高手拍砖敬请轻拍啊。

示例程序

首先是闪灯程序

示例自带的闪灯就略过了,这里写个不大一样的,使用 millis() 来进行时间间隔的判断,与示例使用 delay() 的方式比较,这种方式不会阻塞主进程,以后很多地方会用得上的:

// ----------------------------------------------------------------------------
// millisBlink.ino
//
// Created 2015-05-28
// By seesea <seesea2517#gmail#com>
//
// 使用millis()来判断时间间隔进行的闪灯程序
//
// 使用板上 LED
// ----------------------------------------------------------------------------

const unsigned char led = 13;
const unsigned long switchMs = 1000; // 亮灭的切换延时时间

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 = 13;
const unsigned long T1InitCount = 65536 - F_CPU / 256 / 2; // 2Hz闪烁,TCNT 初始值, 256 预分频

void setup()
{
    pinMode(led, OUTPUT);

    noInterrupts();

    TCCR1A = 0;
    TCCR1B = 0;

    TCNT1 = T1InitCount;
    TCCR1B |= (1 << CS12);  // 256 预分频
    TIMSK1 |= (1 << 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 = 13;
const unsigned char key = 8;

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 = 13;
const unsigned char key = 2;

void setup()
{
    pinMode(led, OUTPUT);
    pinMode(key,INPUT_PULLUP);

    attachInterrupt(0, 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 = 13;
const unsigned char key = 2;

void setup()
{
    pinMode(led, OUTPUT);
    pinMode(key,INPUT_PULLUP);

    attachInterrupt(0, 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 = 11;
const unsigned char sensor = A0;

void setup()
{
    pinMode(led, OUTPUT);
    pinMode(sensor, INPUT);
}

void loop()
{
    // 用 map 函数进行范围的映射
    analogWrite(led, map(analogRead(sensor), 0, 1023, 0, 255));
}

下面有图有真相,使用电位器来控制灯的亮度,或者用模拟传感器来控制——比如光敏电阻:


呼吸灯

PWM 会了,大名鼎鼎的呼吸灯不能少

// ----------------------------------------------------------------------------
// breathingLED.ino
//
// Created 2015-05-29
// By seesea <seesea2517#gmail#com>
//
// 呼吸灯程序
//
// 使用时将 pin 11 用线接到 pin 13 上可以使用板子上的 LED 来实验
// ----------------------------------------------------------------------------

const unsigned char led = 11;

void setup()
{
    pinMode(led, OUTPUT);
    // pinMode(13, INPUT); 如果遇到灯亮度不够的情况,可以试试把这句话加上
}

void loop()
{
    static unsigned char pwm = 0;
    static char delta = 1;

    if (pwm == 255)
    {
        // 最亮的时候改变变化方向为变暗
        delta = -1;
    }
    else if (pwm == 0)
    {
        // 最暗的时候改变变化方向为变亮
        delta = 1;
    }

    pwm += delta;

    analogWrite(led, pwm);
    delay(10);
}

简单上个接线图:

数字口实现的呼吸灯

还是呼吸灯,这次使用数字口来实现,以后有遇到 PWM 口不够的时候,就可以用这种模拟的方法了

// ----------------------------------------------------------------------------
// digitalbreathingLED.ino
//
// Created 2015-05-29
// By seesea <seesea2517#gmail#com>
//
// 直接使用 pin 13 数字引脚来实现呼吸灯
// ----------------------------------------------------------------------------

const unsigned char led = 13;
const unsigned char maxPwm = 100;

void setup()
{
    pinMode(13, OUTPUT);
}

void loop()
{
    static unsigned char pwm = 0;
    static char delta = 1;

    if (pwm == 0)
    {
        // 最亮的时候改变变化方向为变暗
        delta = 1;
    }
    else if (pwm == 100)
    {
        // 最暗的时候改变变化方向为变亮
        delta = -1;
    }

    pwm += delta;

    // 先亮灯,等占空比到切换点的时候灭灯
    digitalWrite(led, HIGH);
    for (unsigned char i = 0; i < maxPwm; ++i)
    {
        if (i == pwm)
            digitalWrite(led, LOW);

        delayMicroseconds(100);
    }
}

这个也有图,可以看看没有接线的图 :D

时间: 2024-10-25 11:28:37

Arduino 入门程序示例之一个 LED(2015-06-11)的相关文章

Arduino 入门程序示例之一排 LED(2015-06-11)

概述 最简单的一个 LED 的实验之后,自然是增加几个 LED,咱排成一排来玩吧.最后,再把一排的 LED 排成一个 8 字来玩——七段数码管. 示例程序 流水灯 第一个出场的肯定是经典的流水灯,也叫跑马灯 // ---------------------------------------------------------------------------- // flowingLEDS.ino // // Created 2015-05-31 // By seesea <seesea25

Arduino 入门程序示例之一片 LED(2015-06-11)

概述 从点到线,从线到面.现在开始要来一片的 LED 了,一大泼 LED 正在到来! 示例程序 因为手头没有现成的模块,手头只有 595,所以这里每一个示例程序都是使用 74HC595 扩展 IO 口的.后面不多加备注了. 现成的模块还有其它专门的驱动芯片的,程序写起来就更简单了,要根据具体的驱动芯片来决定程序,这个程序不通用的哦. 点阵显示静止的心 别看到静止两个字,这里点阵可是动态扫描的哟.所以程序里不能有 delay() 等阻塞主函数的延时函数. // ------------------

Arduino 入门程序示例之直流电机(2015-06-15)

概述 演示直流电机的控制. 示例程序 PWM控制直流电机 略过控制电机转停的示例啦,有需要就把这里的 PWM 换成数字口输出 HIGH 或 LOW 就行了. // ---------------------------------------------------------------------------- // pwmMotor.ino // // Created 2015-06-11 // By seesea <seesea2517#gmail#com> // // PWM 控制直

Arduino 入门程序示例之步进流电机(2015-06-28)

概述 演示单极步进电机的控制.没有现成的 H 桥模块,双极步进电机就不做实验啦. 这里没有使用 stepper 库,用 IO 粗糙地原始地驱动,更增进对步进电机驱动的理解. 示例程序 整步驱动 // ---------------------------------------------------------------------------- // unipolarStepperTest_fullStep.ino // // Created 2015-06-27 // By seesea

arduino入门学习实现语音控制LED灯

需要的准备的硬件arduino+PC+麦克风实现语音命令控制LED灯的亮灭. 首先需要将写好的arduino程序烧录到arduino uno主板中,下面是代码如下: int val;//定义变量val int ledpin=10;//定义数字接口13 void setup() { Serial.begin(9600);//设置波特率为9600,这里要跟软件设置相一致.当接入特定设备(如:蓝牙)时,我们也要跟其他设备的波特率达到一致. pinMode(ledpin,OUTPUT);//设置数字10

DevExpress XtraReports 入门六 控件以程序方式创建一个 交叉表 报表

原文:DevExpress XtraReports 入门六 控件以程序方式创建一个 交叉表 报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用的,为了帮助更多的人不会像我这样浪费时间才写的这篇文章,高手不想的看请路过 本文内容来DevExpress XtraReports帮助文档,如看过类似的请略过. 废话少说 开始正事 在继续本示例之前,要把所有 必需的程序集 添加到项目的 引用 列表中,并且把一个按钮拖放到窗体上. 然后,以下列方式接管此按钮的

JavaCV入门之示例程序

最近因项目需要用到JavaCV,所以本小白在项目正式开始之前先学习了一下JavaCV,记录一下学习过程.附上第一个入门程序: 1.JavaCV简介 JavaCV 是一款开源的视觉处理库,使用它可以采集视频和音频,给这些音视频编解码,然后是用指定格式封装这些音视频数据,以及用什么协议传输 GitHub: https://github.com/bytedeco/javacv 2.maven引入jar包 <dependency> <groupId>org.bytedeco</gro

单片机入门指南系列(十三) 点亮第一个LED——好的开始,成功的一半

前面介绍了很多概念知识,做了很多准备工作,从这一节开始,我们正式开始单片机的学习.我们将使用单片机完成一项非常简单的工作:点亮一个发光二极管(即LED:Light-Emitting Diode). LED简介 先简单介绍一下LED.LED是一种半导体器件,大家其实对LED并不陌生,各种电器的指示灯.手机键盘灯.LED液晶屏的背光.高亮LED手电筒等,都是通过LED发光的.LED有两种主要用途,一种是作为指示灯:另一种是照明.照明用的LED一般都是大功率LED,需要较大的电压电流才能正常工作.而这

ASP.NET MVC4入门—2、第一个MVC程序

目录 ASP.NET MVC4入门—1.ASP.Net的两种开发方式 ASP.NET MVC4入门—2.第一个MVC程序 开发环境:VS2012 .SQL Sserver2008 1.打开VS,文件——新建项目Guestbook 点击确定后,会出现如下对话框,进行模版的选择,在这里你还可以选择是否创建单元测试,为了养成一个良好的习惯,这里我勾选了“创建单元测试项目” 这时会创建两个项目:Guestbook和Guestbook.Tests,将Guestbook设置为启动项目,然后,按Ctrl-F5