鳕鱼天空

This is Mr Wang's Tech Blog.

Arduino学习索引贴

DS3231的简易时钟,1602液晶显示、串口修改时间 极客工坊

I2C器件之PCF8574TS调试记录(i2c to io8) csdn 琉球主

休眠相关:

Arduino UNO 睡眠模式以及关键代码

更新外置气象应用_让arduino用2颗5号电池运行1年以上 

Arduino pro mini 休眠与看门狗唤醒

rduino的详细介绍(基于Mega2560)(分文)——外部中断attachInterrupt()

關於中断(Interrupt)的一些五四三... 中斷 . .

Arduino - 看门狗定时器(WDT:Watch Dog Timer)

arduino pro mini 烧录 :rts -> dtr,烧录时不需要重启 

参考1:说说流控制(RTS/CTS/DTR/DSR 你都明白了吗?)【转】

参考2:UART的RTS,CTS,DTR,DSR这类不常用的特殊信号

OLED中文取模:PCtoLCD

 

Arduino公开课

第15课 端口内部的上拉功能

arduino可用的标准c++库

Ardino节电模式、自动休眠、按钮打开和关闭

#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;
}

 

arduino学习备忘——WS2812B柔性拼接屏

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资料(出处: 单片机论坛)

转:认识与实验Arduino的睡眠模式

原文引自: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 () 
{
  
// 設定採用“Power-down”睡眠模式
  
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;             // 宣告"Energy"程式物件

const byte swPin = 2;      // 開關腳位
const byte ledPin = 13;    // LED腳位
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的开发导航帖arduino ide for esp8266

自从乐鑫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