#include <avr/sleep.h>
#include <avr/power.h>
//#include <avr/wdt.h>
#include <MsTimer2.h>
int pin = 13;
volatile int f_sleepButton = 0;
volatile int f_sleepTimer = 0;
void setup() {
//Serial.begin(9600);
//Serial.print("Welcome to use!\n");
pinMode(pin, OUTPUT);
pinMode(2, INPUT);
MsTimer2::set(2000, sleepTimer); // 中断设置函数,每 2000ms 进入一次中断
MsTimer2::start();
sleepNow();
}
void loop() {
if (digitalRead(2)) {
//sleepNow();
f_sleepButton++;
clearsleepTimer();
delay(50);
}
if (f_sleepButton == 24) { // 长按1.2秒关机
sleepNow();
}
if (f_sleepTimer == 10) { // 延时没有操作关机
sleepNow();
}
}
void sleepTimer() {
f_sleepTimer++;
}
void sleepNow() // here we put the arduino to sleep
{
//detachInterrupt(0);
digitalWrite(pin, HIGH);
//delay(1000);
//return;
//Serial.print("sleep_enable\n");
/* Now is the time to set the sleep mode. In the Atmega8 datasheet
http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf on page 35
there is a list of sleep modes which explains which clocks and
wake up sources are available in which sleep modus.
In the avr/sleep.h file, the call names of these sleep modus are to be found:
The 5 different modes are:
SLEEP_MODE_IDLE -the least power savings
SLEEP_MODE_ADC
SLEEP_MODE_PWR_SAVE
SLEEP_MODE_STANDBY
SLEEP_MODE_PWR_DOWN -the most power savings
For now, we want as much power savings as possible,
so we choose the according sleep modus: SLEEP_MODE_PWR_DOWN
*/
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
sleep_enable(); // enables the sleep bit in the mcucr register
// so sleep is possible. just a safety pin
/* Now is time to enable a interrupt. we do it here so an
accidentally pushed interrupt button doesn't interrupt
our running program. if you want to be able to run
interrupt code besides the sleep function, place it in
setup() for example.
In the function call attachInterrupt(A, B, C)
A can be either 0 or 1 for interrupts on pin 2 or 3.
B Name of a function you want to execute at interrupt for A.
C Trigger mode of the interrupt pin. can be:
LOW a low level triggers
CHANGE a change in level triggers
RISING a rising edge of a level triggers
FALLING a falling edge of a level triggers
In all but the IDLE sleep modes only LOW can be used.
*/
attachInterrupt(0, wakeUpNow, RISING ); // use interrupt 0 (pin 2) and run function
// wakeUpNow when pin 2 gets LOW
sleep_mode(); // here the device is actually put to sleep!!
//
sleep_disable(); // first thing after waking from sleep:
// disable sleep...
detachInterrupt(0); // disables interrupt 0 on pin 2 so the
// wakeUpNow code will not be executed
// during normal running time.
power_all_enable();/* Re-enable the peripherals. */
delay(100); // wat 2 sec. so humans can notice the
// interrupt.
// LED to show the interrupt is handled
digitalWrite (pin, LOW); // turn off the interrupt LED
}
void wakeUpNow()
{ //Serial.print("wakeUpNow\n");
f_sleepButton = 0;
//digitalWrite(pin, LOW);
//attachInterrupt(0,sleepNow, FALLING ); // 睡眠模式
}
void clearsleepTimer() {
f_sleepTimer = 0;
}
2018-10-5 今日为了中旬的上海展会在调试led拼接屏,备忘如下:
1、之前困扰许久的显示过亮问题可以通过将RgbColor转换为然后HslColor调低L(亮度)来实现,初步测试亮度为0.1~0.01区间即可。
arduino中的HslColor取值:
H:Hue(色调)。0~1,0表示红色,0.33表示绿色,0.67表示蓝色
S:Saturation(饱和度)。取值为:0.0% - 100.0%
L:Lightness(亮度)。取值为:0.0% - 100.0%
2、每个WS2812B的LED小灯珠0.3W,具体说明如下:
主要特点
- 智能反接保护,电源反接不会损坏IC。
- IC控制电路与LED点光源公用一个电源。
- 控制电路与RGB芯片集成在一个5050封装的元器件中,构成一个完整的外控像素点。
- 内置信号整形电路,任何一个像素点收到信号后经过波形整形再输出,保证线路波形畸变不会累加。
- 内置上电复位和掉电复位电路。
- 每个像素点的三基色颜色可实现256级亮度显示,完成16777216种颜色的全真色彩显示,扫描频率不低于400Hz/s。
- 串行级联接口,能通过一根信号线完成数据的接收与解码。
- 任意两点传传输距离在不超过5米时无需增加任何电路。
- 当刷新速率30帧/秒时,级联数不小于1024点。
- 数据发送速度可达800Kbps。
- 光的颜色高度一致,性价比高。
主要应用领域
- LED全彩发光字灯串,LED全彩模组, LED全彩软灯条硬灯条,LED护栏管。
- LED点光源,LED像素屏,LED异形屏,各种电子产品,电器设备跑马灯。
引用自:WS2812B电路与引脚图及规格书下载 RGB5050资料(出处: 单片机论坛)
原文引自:http://swf.com.tw/?p=525
根据Nick Gammon这位澳洲老兄,在Power saving techniques for microprocessors(微处理器省电技术)文章,於Arduino UNO Rev 3控制板执行底下的程式码:
void setup () {}
void loop () {}
所测量到的消耗电流量:
- 採用9V电池,接电源插孔供电,约消耗55 mA。
- 用5V电源供电,约消耗46.6 mA。
若用最精简的準系统(barebone)形式,例如,在麵包板上直接用ATmega828处理器和石英震盪器等少数零件组装的Arduino,仅消耗15.15 mA电流。
因為Arduino控制板上的USB序列埠转换晶片以及电压调节元件,都会消耗电力。
毕竟Arduino控制板是「原型开发板」,其用意是提供一个方便、好用的微电脑控制实验工具。实验成功之后,如果要长久保留作品或者需要节省电力,最好自製一个精简的Arduino板,或购买类似Arduino Pro Mini这种没有其他周边零件的板子。
Arduino的睡眠模式
Arduino像电脑和手机一样,也具备睡眠∕休眠∕待机功能。在睡眠状态下,系统几乎完全停止运作,只保留基本的侦测功能,因此只消耗少许电力。以电脑為例,在睡眠状态下,可被键盘按键或者网路讯息唤醒。
底下的程式一开始就让微控器进入睡眠状态,下文将採用名叫”Enerlib”的程式库,简化睡眠设定程式:
void setup ()
{
set_sleep_mode (SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_cpu ();
}
void loop () { }
这段程式在UNO R3控制板上,约消耗32.9 mA电流;但是在精简的「準系统」Arduino板,仅仅消耗0.36mA (360μA)。
ATMega328微控器具有六种睡眠模式,底下是依照「省电情况」排列的睡眠模式名称,以及Enerlib(註:Energy和Library,即:「能源」和「程式库」的缩写)程式库的五道函数指令对照表,排越后面越省电。「消耗电流」栏位指的是ATmega328处理器本身,而非整个控制板。
睡眠模式 |
Energy指令 |
中文直译 |
消耗电流 |
Idle |
Idle() |
閒置 |
15mA |
ADC Noise Reduction |
SleepADC() |
类比数位转换器降低杂讯 |
6.5mA |
Power-save |
PowerSave() |
省电 |
1.62mA |
Standby |
Standby() |
待机 |
1.62mA |
Extended Standby |
|
延长待机 |
0.84mA |
Power-down |
PowerDown() |
断电 |
0.36mA |
微控器内部除了中央处理器(CPU), 还有记忆体、类比数位转换器、序列通讯…等模组。越省电的模式,仍在运作中的模组就越少。
例如,在”Power-Down”(电源关闭)睡眠模式之下,微控器仅剩下外部中断和看门狗计时器(Watchdog Timer, 参阅下文说明)仍持续运作。而在Idle睡眠模式底下,SPI, UART(也就是序列埠)、计时器、类比数位转换器等,仍持续运作,只有中央处理器和快闪记忆体(Flash)时脉讯号被停止。
时脉讯号就像心跳一样,一旦停止时脉讯号,相关的元件也随之暂停。各种睡眠模式的详细说明,请参阅ATmega328微控器的资料手册,第39页,「Power Management and Sleep Modes(电源管理与睡眠模式)」单元。
採用Enerlib程式庫設定睡眠模式
Enerlib程式库可简化Arduino睡眠模式的程式设定,请先下载Enerlib程式库并解压缩到Arduino的libraries资料夹:
本实验程式的行为如下:
- 启动时,每隔0.5秒点、灭三次位于第13脚的LED。
- LED闪烁完毕后,进入“Power-down(断电)”睡眠模式。
- 当中断0(第2脚)的讯号改变时,唤醒Arduino,再次闪烁LED三次,接著再进入睡眠模式。
请先把Arduino的数位脚2接高电位(5V或3.3V插座):
反覆闪烁LED的基本程式码如下:
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
Serial.println("Running...");
}
void loop() {
digitalWrite(ledPin, !digitalRead(ledPin));
delay(500);
}
负责闪烁LED的关键叙述是这一行:
设定唤醒Arduino的中断服务常式
修改上一节的程式,建立Energy程式物件,并加入中断服务常式叙述(广告一下,中断服务常式的说明,请参阅《超图解Arduino互动设计入门》的D-3页):
若Arduino处于睡眠状态,只要中断0脚位的讯号改变,它就会被唤醒。然而,同一个程式其他叙述,也有可能需要接收中断0的讯息。为此,Energy提供一个用于判断Arduino是否处于睡眠状态的WasSleep()函数,若是,它将传回true。
底下是修改后的wakeISR中断处理常式,若Arduino之前处于睡眠状态,则state变数值将是1,若是在执行过程发生中断讯号,state值将是2:
透过state值,主程式将能得知中断的触发时机。补充说明,WasSleep()函数只能写在中断处理常式裡面。
让Arduino睡眠的主程式
主程式迴圈如下,它将在闪烁LED三次后进入最省电的「断电」睡眠模式:
完整的范例程式码如下:
#include <Enerlib.h>
Energy energy;
const byte swPin = 2;
const byte ledPin = 13;
byte times = 0;
volatile byte state = 0;
void wakeISR() {
if (energy.WasSleeping()) {
state = 1;
} else {
state = 2;
}
}
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
pinMode(swPin, INPUT);
digitalWrite(swPin, HIGH);
attachInterrupt(0, wakeISR, CHANGE);
Serial.println("Running...");
}
void loop()
{
if (state == 1) {
Serial.println("Was sleeping...");
} else if (state == 2) {
Serial.println("Was awake...");
}
state = 0;
digitalWrite(ledPin, !digitalRead(ledPin));
delay(500);
times ++;
Serial.println(times);
if (times > 5) {
times = 0;
Serial.println("Go to sleep...");
energy.PowerDown();
}
}
编译并上传程式到Arduino板之后,开启「序列埠监控视窗」,它将显示:
接著,把连接中断0的导线接到低电位(GND):
Arduino将被唤醒,并再次闪烁LED;笔者在LED闪烁的过程中,反覆将中断0接高、低电位,「序列埠监控视窗」因而呈现如下的内容:
看门狗计时器简介
看门狗计时器(Watchdog Timer, 简称WDT)是微控器内部的「当机」监控器,若微控器当掉了,它会自动重新启动微控器。其运作原理是,看门狗内部有个计时器,微处理器必须每隔一段时间,向看门狗发出一个讯号,重设计时器值。
若看门狗迟迟没有收到微处理器的讯号,计时器仍将继续倒数,直到计时值变成零,它就会认定微处理器已经当掉了,进而重新启动微处理器。
主程式可设定看门狗的计时器值,最短16ms,最长8s。Donal Morrissey写了一篇看门狗程式的介绍,以及沉睡8秒之后,切换LED状态的范例:Sleeping Arduino – Part 5 Wake Up Via The Watchdog Timer。
自从乐鑫esp8266出现后,其价格低廉的解决方案,引起了业界的广泛关注,堪称业界里程碑。但是很多人买来之后不知道怎么使用,今天在这里和大家讨论分享一下:
ESP8266简介,乐鑫的单芯片wifi 控制器
目前市面上有3种开发方式:
1:使用乐鑫AT 固件,使用时,单片机通过串口用AT指令来实现wifi连接、网络通迅,例如arduino uno+esp8266他们间使用AT指令来交互。
2:使用乐鑫SDK开发包,直接用C编程。例如果云esp8266 sdk开发之类。直接开发BIN文件
3:使用NODEMCU固件,这是国内大能 在SDK基础上,加入了LUA语言
现在,出现了第4种开发方式,arduino直接编程,原理还是在SDK基础上开发,不过已经封装为我们熟的Arduino语言了。(想想都有点小激动{:soso_e102:})
注意已经不需要ARDUINO硬件了,而是利用arduino软件平台来编译8266的源码。即利用arduino 语句开发8266的sdk,
下面的几篇帖子将分别介绍开发的一些教程。
第一篇,基于esp8266的智能家居控制系统-基础篇1介绍arduino ide for esp8266,介绍背景,及软件下载
第二篇,基于esp8266的智能家居控制系统-基础篇2硬件平台搭建 ,搭建硬件开发环境
第三篇,基于esp8266的智能家居控制系统-通用篇,常用的示例代码,非无线
第四篇,基于esp8266的智能家居控制系统-局域网篇1 TCP/UDP,tcp通讯的准备作为客户端与电脑通讯
第五篇,基于esp8266的智能家居控制系统-局域网篇1手机控制和透传 ,作为客户端与手机通讯及透传
第六篇,基于esp8266的智能家居控制系统-局域网篇2,tcpserver,作为服务端与其他作为客户端的设备通讯
楼楼将持续更新,么么哒
转载自:http://www.arduino.cn/forum.php?mod=viewthread&tid=18361&highlight=esp8266