读《Arduino编程技巧-75个智能硬件程序设计技巧》手记,写出例程演示,备用

这本书很接地气,作者的解释方法很通俗,给出自己搞项目的一些例程,给出许多建议。
Table of Contents
常用指令
i = pulseln(8,HIGH); //返回以微妙为单位出现在引脚8的下一个高电平的时间 tone(8,440,1000); //让引脚8以440Hz频率振荡1000ms noTone(); //关闭任何正在进行的tone进程 delay(1000); delayMicroseconds(100000); //延迟为100000us。最小延迟3us,最大延迟16ms
内部上拉电阻
启用内部的上拉电阻,约40kΩ。
pinMode(2,INPUT_PULLUP);
中断服务
建议
终端服务作者给出以下建议:
- ISR中断程序一定简短,运行快
- ISR和程序其他部分之间传递数据要使用volatile变量
- 不在ISR中使用delay();但是delayMricroseconds()
- 串行通信读取写入不可靠
- millis返回值不会改变
为什么令终端服务短而快?因为在一个ISR运行时出现另外的中断,ISR本身不会被打断,相反,中断信号会被忽略,直到ISR完成
为什么不使用delay?因为delay使用了定时器和中断。而delayMircoseconds不会使用中断
volatile变量
若要在isr中改变全局变量,如bool型的一个flag,需要用volatile变量
volatile boolean flashFast = false;
定时器中断
库 TimerOne
#include <TimerOne.h>
......
void setup()
{
Timer1.initialize(1000);
TImer.attachInterrupt(toggleOutput);
Timer1.pwm(9,512);// P9
}
例程
例程见下方省电例程
休眠
Narcoleptic库
代替delay();
#include <Narcoleptic.h> Narcoleptic.delay(1000);
外部中断唤醒综合例程
//sketch_05_06
#include<avr/sleep.h>
const int ledPin = 13;
cost int inputPin = 2;
volatile boolean flag;
void setup()
{
pinMode(ledPin,OUTPUT);
pinMode(inputPin,INPUT_PULLUP);
GoToSleep();
}
void loop()
{
if(flag)
{
doSomething();
flag = false;
goToSleep();
}
}
void setFlag()
{
flag = true ;
}
void goToSleep()
{
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
attachInterrupt(0,setFlag,LOW);
sleep_mode();
//在此停顿!(误)
sleep_disable();
detachInterrupt(0);
}
void doSomething()
{
.....
//doSomething
}
中断很简短,改变flag值,即完成中断
返回后在loop中判断flag值,完成任务dosomething
重新休眠
玩单片机和树莓派的都是大神
@穹妹的欧尼酱 不不不不,这玩意是因为前一段时间帮人做东西去学的(..)_
狠yoooooooooooo