http://139.196.53.116/ml/index.php/action/login?_=7b11092123454b981835d78ab70a0093
https://www.cnblogs.com/starsnow/p/4570453.html
https://www.cnblogs.com/starsnow/p/4570462.html
https://www.cnblogs.com/starsnow/p/4570604.html
const unsigned char led = 13;
const unsigned long switchMs = 1000; // 亮灭的切换延时时间
void setup() {
// put your setup code here, to run once:
pinMode(led, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(led,HIGH);
delay(switchMs);
digitalWrite(led,LOW);
delay(switchMs);
}
使用 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>
//
// 使用外部中断来实现的按钮按下灯亮,松开灯灭的实验
// 使用板上 LED,按钮引脚接 2 脚及 GND,pin 2 使用内部上拉
/* 注:0 号中断固定为 pin 2
当发生外部中断时,调用一个指定函数。当中断发生时,该函数会取代正在执行的程序。大多数的Arduino板有两个外部中断:0(数字引脚2)和1(数字引脚3)。
arduino Mege有四个外部中断:数字2(引脚21),3(20针),4(引脚19),5(引脚18)。
// 当中断函数发生时,delya()和millis()的数值将不会继续变化
重新分配中断
中断可以再任何时候通过attachInterrupt()命令进行改变。当重新使用attachInterrupt()时,先前分配的中断就会从对应引脚上移除。
启用\停止中断
Arduino也可以忽略所有中断。如果你需要在一段代码中不执行中断,只需要执行 noInterrupts()命令。当这段代码执行完以后,你可以使用 interrupts()命令重新启用中断。
删除中断
终端也可以通过detachInterrupt(interrupt_number)命令进行删除。 */
// ----------------------------------------------------------------------------
const unsigned char led = 13;
const unsigned char key = 2;
bool light = false;
bool softBounce = false;
void setup()
{
pinMode(led, OUTPUT);
pinMode(key,INPUT_PULLUP);
attachInterrupt(0, lightLED, CHANGE); // 使用电平改变时中断 CHANGE LOW FALLING RISING
}
// 中断函数
void lightLED()
{
if(softBounce == false){
softBounce=true;
light = !light;
digitalWrite(led, light);
delay(20);
}
}
void loop()
{
delay(1); //如果前面没有其他耗时代码的话,必须加这句。 不然下面这句执行太快了
softBounce=false;
}
// ----------------------------------------------------------------------------
// 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);
}
}