Arduino怎么屏幕进入省电模式方式

查看: 49034|回复: 100
2月2号-外置采集温度_让arduino用2颗5号电池运行1年以上
本帖最后由 mylife1213 于
21:27 编辑
& && & 这次讲功耗.
& && &如果你想把arduino avr类的开发项目用来便携式设置上,不管商业还是个人DIY,那么你头一个要对付的问题就是设备功耗!
我测试atmega328p(大部分arduino 都是基于这个处理器) 最小系统下(16Mhz)运行功耗是10ma,那么如果不对处理器进行任何节电处理的话一块手机1500mah的电池只能不间断运行&&=6.5天 ,这个还是在没有任何外围元器件的情况下的运行时间!
& & 现在物联网非常火,那么物联网正常情况是需要多个节点进行数据采集,然后上报给主机进行联网操作,或者接收主机命令进行对其他电器的操作. 那个问题就出现了,很多时候数据采集的地方是没有电源的,比如外置气象数据采集,这个时候就需要采集设备可以使用电池来驱动,而且不能频繁的更换电池!这就需要用到处理器的节电方案!
& & 下面我将介绍ATMEGA328P的节电解决方案.
& &&&328P有8种节电设置,分别是:
当SM2..0 为000 时, SLEEP 指令将使MCU 进入空闲模式。在此模式下,CPU 停止运
行,而SPI、USART、模拟比较器、ADC、两线串行接口、定时器/ 计数器、看门狗和
中断系统继续工作。这个睡眠模式只停止了clkCPU 和clkFLASH,其他时钟则继续工作。
象定时器溢出与USART 传输完成等内外部中断都可以唤醒MCU。如果不需要从模拟比
较器中断唤醒MCU,为了减少功耗,可以切断比较器的电源。方法是置位模拟比较器控
制和状态寄存器ACSR 的ACD。如果ADC 使能,进入此模式后将自动启动一次转换。
ADC 噪声抑制模式
当SM2..0 为001 时, SLEEP 指令将使MCU 进入噪声抑制模式。在此模式下,CPU 停
止运行,而ADC、外部中断、两线接口地址配置、定时器/ 计数器2 和看门狗继续工作。
这个睡眠模式只停止了clkI/O、clkCPU 和clkFLASH,其他时钟则继续工作。
此模式提高了ADC 的噪声环境,使得转换精度更高。ADC 使能的时候,进入此模式将
自动启动一次AD 转换。ADC 转换结束中断、外部复位、看门狗复位、BOD 复位、两线
接口地址匹配中断、定时器/ 计数器2 中断、SPM/EEPROM 准备好中断、外部电平中断
INT0 或INT1,或外部中断INT2 可以将MCU 从ADC 噪声抑制模式唤醒。
当SM2..0 为010 时, SLEEP 指令将使MCU 进入掉电模式。在此模式下,外部晶体停
振,而外部中断、两线接口地址匹配及看门狗(如果使能的话)继续工作。只有外部复
位、看门狗复位、BOD 复位、两线接口地址匹配中断、外部电平中断INT0 或INT1,或
外部中断INT2 可以使MCU 脱离掉电模式。这个睡眠模式停止了所有的时钟,只有异步
模块可以继续工作。
当SM2..0 为011 时, SLEEP 指令将使MCU 进入省电模式。这一模式与掉电模式只有
一点不同:
如果定时器/ 计数器2 为异步驱动,即寄存器ASSR 的AS2 置位,则定时器/ 计数器2 在
睡眠时继续运行。除了掉电模式的唤醒方式,定时器/ 计数器2 的溢出中断和比较匹配中
断也可以将MCU 从休眠方式唤醒,只要TIMSK 使能了这些中断,而且SREG 的全局中
断使能位I 置位。
如果异步定时器不是异步驱动的,建议使用掉电模式,而不是省电模式。因为在省电模式
下,若AS2 为0,则MCU 唤醒后异步定时器的寄存器数值是没有定义的。
这个睡眠模式停止了除clkASY 以外所有的时钟,只有异步模块可以继续工作。
Standby 模式
当SM2..0 为110 时, SLEEP 指令将使MCU 进入Standby 模式。这一模式与掉电模式
唯一的不同之处在于振荡器继续工作。其唤醒时间只需要6 个时钟周期。
扩展Standby 模式
当SM2..0 为111 时, SLEEP 指令将使MCU 进入扩展的Standby 模式。这一模式与省
掉电模式唯一的不同之处在于振荡器继续工作。其唤醒时间只需要6 个时钟周期。
下图是各个模式下关闭的模块
QQ截图14.png (53.11 KB, 下载次数: 162)
18:45 上传
那么我们正常使用的是掉电模式,在掉电模式下328p测试耗电1ua,这是什么概念,2颗5号电池在处理器没有进行其他操作的情况下可以工作79年!
当然了,我们不可能让处理器就这样一直待机不做其他事情,我们需要定期唤醒328P,让他处理事情,比如采集温湿度,PM2.5数据发送给主机.那么如何唤醒呢? 答案是在掉电模式下你只能通过外部中断和看门狗来唤醒328P,外部中断唤醒需要外围电路,我们优先选择WDT看门狗进行唤醒.这里的看门狗不是你们知道的只有重启328P的功能!他也可以配置成中断事件! & ISR(WDT_vect) &中断函数,通过看门狗我们就可以在不添加外围元件的情况设置唤醒时间了!
下面看实例:
#include &avr/sleep.h&
#include &avr/wdt.h&
volatile byte data=0;
void setup() {
&&pinMode(13,OUTPUT);
&&setup_watchdog(9);
// 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms
// 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec
&&ACSR |=_BV(ACD);//OFF ACD
&&ADCSRA=0;//OFF ADC
&&Sleep_avr();//Sleep_Mode
}
void loop() {
&&
if(data&=7){
&&data=0;
//-------------------------------
& &digitalWrite(13,HIGH);
&&delay(100);& && && && && && && & //此处是到达设置唤醒时间允许的程序
&&digitalWrite(13,LOW);
//--------------------------------& &
Sleep_avr();
else {
&&Sleep_avr();&&//Continue Sleep
//Sleep mode is activated
void setup_watchdog(int ii) {
&&if (ii & 9 ) ii=9;
&&bb=ii & 7;
&&if (ii & 7) bb|= (1&&5);
&&bb|= (1&&WDCE);
&&MCUSR &= ~(1&&WDRF);
&&// start timed sequence
&&WDTCSR |= (1&&WDCE) | (1&&WDE);
&&// set new watchdog timeout value
&&WDTCSR =
&&WDTCSR |= _BV(WDIE);
}
//WDT interrupt
ISR(WDT_vect) {
// wdt_reset();
void Sleep_avr(){
&&set_sleep_mode(SLEEP_MODE_PWR_DOWN&&); // sleep mode is set here
&&sleep_enable();
&&sleep_mode();& && && && && && && && &// System sleeps here
}复制代码
这是一个配置成56秒唤醒一次对5号端口设置高电平100ms的程序,其中if(data&=7)是data(看门狗)超时大于7次就唤醒CPU进行高电平100ms的函数,看门狗超时时间已设置成8秒,你可以调节if(data&=7)设置成你想要的唤醒时间!
通过这样的节电设置以后这个程序可以运行至少几年!
代码用arduino IDE写的,IDE不支持中文注释,英文注释将就看吧,不理解的代码留言解答.
& &&&要改变唤醒时间是改这个函数:
& & if(data&=7)
& & 函数里面7的意思是有7次看门狗8秒超时复位.比如你要设置24秒那就写if(data&=3)
& &公式是:3*8=24
使用休眠模式制作了一个外置气象站,使用amtega328P用nrf24l01发送ds18b20采集的数据,每2分钟发生一次,平时待机功耗控制在10ua左右,设计可以使用2颗南孚电池工作超过1年时间
EC9B17FADAC1D02D5AD84.png (209.03 KB, 下载次数: 67)
21:15 上传
外置发送硬件先按照328P最小系统搭建,然后连接nrf24l01p与ds1820b.
按照arduino 引脚连接如下表
arduino& &&&nrf24l01p
13-&& && && &SCK
12-&& && && &MISO& &&&
11-&& && && &MOSI
8-&& && && &&&CE
7-&& && && &&&CSN
arduino& &&&ds1820b
4-&& && && && &数据引脚,其他连接GND&&VCC
室内接收机可以使用pro mini 和uno
接线方式如下:
arduino& &&&nrf24l01p
13-&& && && &SCK
12-&& && && &MISO& &&&
11-&& && && &MOSI
9-&& && && &&&CE
8-&& && && &&&CSN
2-&& && && && && & IRQ
注意nrf24l01电源要接3.3v
提供代码下载
(13.01 KB, 下载次数: 651)
21:22 上传
点击文件名下载附件
read_WDT是接收机
WDT_2是室外机
感谢分享,收藏学习。
谢谢分享,学习一下
设置看门狗需要你用JATG进行程序烧写
这句可以顺带说明一下吗?
openmmoo 发表于
设置看门狗需要你用JATG进行程序烧写
这句可以顺带说明一下吗?
arduino 的Bootloader是不支持设置看门狗的,Bootloader就是能让你用串口下载的代码,JATG是AVR开发的标准调试与下载接口,可以完全进行硬件烧写与控制
可能我没说清楚,我是希望你能讲解一下具体么操作,我们一直都用arduino还没使用过以外的东西。
我具体想知道:
1、JATG的烧写是否是增加新的烧写硬件。
2、是不是编译下载不能再arduino ide下进行,要换到avr下编译下载。
小白一个,问的不对莫笑。
openmmoo 发表于
设置看门狗需要你用JATG进行程序烧写
这句可以顺带说明一下吗?
不用JATG烧写了,你试一下
openmmoo 发表于
设置看门狗需要你用JATG进行程序烧写
这句可以顺带说明一下吗?
已经更新,在我的arduino mini pro 普通下载测试通过,不再需要JATG
LZ 可否找个超级电容试试能抗多久呢?
其实可以换个思路 ,节流不行就开源嘛。装个太阳能板解决很多问题!软的不行来硬的。软硬兼施才是好策略!&
zoologist 发表于
LZ 可否找个超级电容试试能抗多久呢?
如果一直是掉电模式,不唤醒的话估计得等够呛
其实可以换个思路 ,节流不行就开源嘛。装个太阳能板解决很多问题!软的不行来硬的。软硬兼施才是好策略!&
zoologist 发表于
LZ 可否找个超级电容试试能抗多久呢?
2节南孚电池大概700mah ,光掉电不唤醒就要700/0.001=79年
问题是普通5五号电池有效期才几年
davidce 发表于
问题是普通5五号电池有效期才几年
真正有用的程序不可能一直待机的,看唤醒间隔和唤醒运行的时间,如果十几分钟用无线发送一次采集的数据还是可以用几年的
谢谢楼主,学习并收藏了。
2节电池才3V,可是ARDUINO需要的最低电压是3.3V或者5V啊,3V能带动5V的ARDUINO,正常运行吗?
Powered by【arduino】如何通过程序关机_arduino吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:56,220贴子:
【arduino】如何通过程序关机收藏
【arduino】如何通过程序关机?也就是结束LOOP(),如果可以的话最好能掉电。不知道怎么用C实现
用个舵机,想关机的时候就使得舵机旋转把电源关了
atmega328p有六种睡眠模式,最省电的叫power down断电模式,仅消耗360μA电流,其他的依次电流减少的模式分别叫闲置, ADCSLEEP ,省电,待机,延长待机,都是由代码实现,不过这都只是最简系统效果明显,像UNO这种怎么也要30多ma,以前看到篇帖子讲这个,我找找看。。。
登录百度帐号STC12LE5612AD芯片使用心得(二)省电模式
通常情况下一个我们要求硬件系统可以独立工作很久,但如果单片机始终高速运行,假设单片机运行电流为5mA,加上外围电路20mA,那么一节5600mAh的电池也只能用几天,这就要求我们需要在单片机需要运行的时候开启,不需要的时候关闭或者进入省电模式。
省电有多种方式,可以降低时钟频率,也可以进入省电模式。
时钟频率:一般我们会选择外部晶体时钟,具体选择方法为在烧录程序时不勾选“选择使用内部IRC时钟(不选为外部时钟)”选项。
时钟分配:如果希望降低功耗,可对时钟进行分频,利用时钟分频控制寄存器CLK_DIV可进行时钟分频,从而使单片机在较低频率下工作。
CLK_DIV = 0x03;
//使单片机工作在8T模式
可编程时钟输出:可编程时钟输出功能有很多,比如可以提供占空比50%的脉冲、输出时钟等。
相关寄存器如下:
PCAWAKEUP位表示在掉电模式下允许PCA上升沿或者下降沿中断唤醒单片机;
RXD_PIN_IE表示在掉电模式下允许PxD下降沿唤醒单片机;
T1_PIN_IE和T0_PIN_IE表示在掉电模式下允许T1和T0的溢出中断唤醒单片机;
CLKOUT0/P1.0与CLKOUT1/P1.1分别受T0和T1的控制,相应的定时器应该工作在模式2(8位自动重载),不要允许相应的中断位。
T1CLKO与T0CLKO置位时,允许相应的引脚作为时钟输出,输出时钟频率的计算公式为Tx溢出率/2,此时应区分C/T位。
T0x12和T1x12位为T0和T1的速度控制位,置位时为不分频,清零表示12分频。
软件复位:IAP_CONTR寄存器可以实现软件复位
内部低压检测复位:
中断:打开EPCA_LVD(PCA和LVD中断共同允许位),ELVDI(低压检测单独允许位),EA总中断。LVDF为中断标志位,软件清零。
在stc-isp软件中有相应的计算软件。
省电模式:正常模式下,典型功耗为2.7~5mA,掉电模式下典型功耗为0.1uA,空闲模式下典型功耗为1.8mA。
PD置位时进入Power Down模式,可由外部中断低电平触发或下降沿触发,在此模式下,内部时钟停振,此时CPU、串行口、定时器停止工作,只有外部中断工作,RxD可以唤醒,所以单片机来不及接收串行数据,应先发送唤醒帧,延时一定时间后再发送数据帧,以免数据帧丢失。低压检测可以工作在Power Down模式下。
IDL置位时进入空闲模式。此时外部中断,外部低压检测电路,定时器、A/D转换,串行口都在工作,看门狗是否工作取决于其控制位的选择。
以上图片截取自。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!下一篇: 没有了
该模块采用了通用的ML8511 UV传感器原件,可以用来检测室内或室外的紫外线密度。
通过将光电流转化成电压的原理来检测UV强度,同时非常适合被被外部电路所采用。
该模快还具备省电模式可达0.1uA,适合在智能可穿戴和手机等设备上使用。
紫外线等级监视器
环境监测仪、气象站
DIY紫外线互动装置
工作电压:DC 5V
工作温度:-20~70°C
敏感区域:UV-A,UV-B
敏感波长: 280-390nm
模块尺寸:30 x 22mm
连接示意图
紫外线传感器连接示意图
ML8511 UV等级图表
ML8511 UV等级图表
从图表上可以看到紫外线输出电压映射到等级是一条直线,从1.0V开始,最大是2.8V(15mW/cm2)。
Arduino虽然有一个内置的函数map() function,但是map()是不能工作在浮点型的。这里要感谢Arduino社区开源奉献者才有了下面的一个简单的mapfloat()函数,方便我们使用。
//The Arduino Map function but for floats
//From: http://forum.arduino.cc/index.php?topic=3922.0
float mapfloat(float x, float in_min, float in_max, float out_min, float out_max)
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_
下面是将传感器读到的电压值转换成mW/cm2等级:
float uvIntensity = mapfloat(outputVoltage, 0.99, 2.8, 0.0, 15.0); //Convert the voltage to a UV intensity level
/***************************************************
* UV Sensor v1.0-ML8511
***************************************************
* This example reads UV intensity from UV Sensor v1.0-ML8511.
* By Phoebe &phoebe.&
* Modified
* By Phoebe phoebe.&
* GNU Lesser General Public License.
* See &http://www.gnu.org/licenses/& for details.
* All above must be included in any redistribution
****************************************************/
/***********Notice and Trouble shooting***************
* 1.Connect ML8511 UV Sensor to Arduino A0
&http://wiki.dfrobot.com.cn/index.php/%E6%96%87%E4%BB%B6:SEN0175_Diagram.png&
* 2.This code is tested on Arduino Uno, Leonardo, Mega boards.
****************************************************/
int ReadUVintensityPin = A0; //Output from the sensor
void setup()
pinMode(ReadUVintensityPin, INPUT);
Serial.begin(9600); //open serial port, set the baud rate to 9600 bps
Serial.println(&Starting up...&);
void loop()
int uvLevel = averageAnalogRead(ReadUVintensityPin);
float outputVoltage = 5.0 * uvLevel/1024;
float uvIntensity = mapfloat(outputVoltage, 0.99, 2.9, 0.0, 15.0);
Serial.print(&UVAnalogOutput: &);
Serial.print(uvLevel);
Serial.print(& OutputVoltage: &);
Serial.print(outputVoltage);
Serial.print(& UV Intensity: &);
Serial.print(uvIntensity);
Serial.print(& mW/cm^2&);
Serial.println();
delay(100);
//Takes an average of readings on a given pin
//Returns the average
int averageAnalogRead(int pinToRead)
byte numberOfReadings = 8;
unsigned int runningValue = 0;
for(int x = 0 ; x & numberOfR x++)
runningValue += analogRead(pinToRead);
runningValue /= numberOfR
return(runningValue);
//The Arduino Map function but for floats
//From: http://forum.arduino.cc/index.php?topic=3922.0
float mapfloat(float x, float in_min, float in_max, float out_min, float out_max)
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_
你可以用一个紫外LED灯或者在阳光下测试你的传感器,赶紧来测试看看你的周围的紫外线等级吧~
本文整理于DFRobot wiki
纠错,疑问,交流:
获取最新文章:
扫一扫右上角的二维码加入“创客智造”公众号
下一篇: 没有了【arduino】【u8g2库】OLED屏-U8glib库 增强版 U8G2库
转载请注明:
及出处 :以下的函数描述是源自原文:自己再通过测试后才发布,采用一个更新方式(精力有限,学习为主),客官觉得不错,就打赏一下呗~U8G2是U8GLIB的增强版,相对旧版更加好用,强大,兼容板子多。U8G2有两种模式:U8g2是增强版模式,U8X8是简便模式省内存,在setup()里必须设定模式.函数开始前,先讲一个东西。arduino 和OLED连接的方法(示例NANO和128X64 API OLED) 颜色对颜色线连接。nano的板子上的D4567脚可以修改。不修改也行。SCL=S&COLCK
SDA=S&DATA //数据
RES/RST = Reset //复位
D/C = DCAPI连接这4条交互线就行了,和另外供电。 那么在代码中一开始必须定义好脚: (D3号脚可以不接)U8G2_SSD_NONAME_1_4W_SW_SPI u8g2(U8G2_R0,/*
clock=*/4, /* data=*/ 5, /* cs=*/ 3, /* dc=*/ 6, /* reset=*/ 7);
//这个定义脚代码细心看就懂了。//U8G2支持的OLED控制芯片://不同芯片的不同脚定义代码:例子:
#include &Arduino.h&
#include &SPI.h&
#include &U8g2lib.h&
U8G2_SSD_NONAME_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 4, /* data=*/ 5, /* cs=*/ 3, /* dc=*/ 6, /* reset=*/ 7);
void setup(void) {
u8g2.begin();
//选择U8G2模式,或者U8X8模式
void loop(void) {
u8g2.firstPage();
u8g2.setFont(u8g2_font_ncenB14_tr);
u8g2.drawStr(0,15,"Hello World!");
} while ( u8g2.nextPage() );
delay(1000);
U8G2_R0是一个参数:指定大局显示的基本布局:
90度顺时针旋转
180度顺时针旋转
270度顺时针旋转
U8G2_MIRROR
正常显示镜像内容(v2.6.x版本以上使用)
注意:U8G2_MIRROR需要与setFlipMode()配搭使用.
-------------------------------------------------屏幕基本函数-------------------------------------------u8g2.begin(
//开始构造U8G2, 在setup()内使用。
特别说明:初始化在Arduino的环境。
配置OLED的显示模式initDiplay或者省电模式setPowerSave,或者重置(清屏)clearDisplay 。同时检测六个按钮程序(比如前进、后退、确认、上一级...)。如果没有,可以在里定义按钮事件的引脚,用GetMenuEvent函数来定义,来进入到用户想要的界面,详情就看userInterfaceMessage和GetMenuEvent函数。无返回值。
关联使用函数:initDispaly
、setPowersave、clearDisplay、u8g2.clear()
清除缓冲区"Buffer"内的所有像素点
关联使用函数:print、home、clearBufferu8g2.clearBuffer()
//清除内存中的所有缓冲区内的像素,而后可以用sendBuffer函数来把缓冲区“Buffer”在屏幕上显示出来,以便清屏。因这个过程是在微处理器中RAM里的副本"Buffer"中进行,标志“F”,所以sendBuffer也就是直接操作副本“Buffer”。
关联使用函数:sendBuffer例子:
void loop(void) {
u8g2.clearBuffer();
//清除当前Buffer内的像素
// 在Buffer内一些操作
u8g2.sendBuffer();
//发送Buffer内容到屏上
delay(1000);
u8g2.clearDisplay()
//清除显示中所有像素。此过程在begin()中调用。在程序中一般用不上,也是通过sendBuffer和clearBuffer函数显示出来,一样的处理方式。关联使用函数:beginu8g2.disableUTF8Print() //禁用
UTF8字集 (万国语字库),默认是开启的。关联使用函数:print 、enableUTF8Print u8g2.enableUTF8Print
//启用 UTF8字集,许可UniCode向print发送字符串。这个函数通常在begin()后调用。关联使用函数:print、disableUTF8Print例子:
void setup(void) {
u8g2.begin();
u8g2.enableUTF8Print();
// 使print支持UTF8字集
u8g2.Print()
//在入当前光标位置用当前设置的字体,来打印出(内容)。光标位置可以用setCursor函数。字体可以用setFont函数。关联使用函数:print(U8x8)、enableUTF8Print、setFont、setCursor、例子:
u8g2.setFont(u8g2_font_ncenB14_tr); //设置字体
u8g2.setCursor(0, 15);
//设置光标处
u8g2.print("Hello World!");
//输出内容
U8x8:一个自带字库,详情见setFont函数-------------------------------------------------绘图显示函数-------------------------------------------u8g2.drawBitMap()
//在指定的x
/ y位置(位图左上角)绘制位图.。位图的部分可能位于显示边界之外。位图由数组位图指定。清除位意味着:不绘制像素。数组内的一个置位意味着:用当前颜色索引写像素。对于单色显示器,颜色索引0通常会清除一个像素,并且颜色索引1将设置一个像素。因为复杂耗内存,此函数在U8G2中被停用!格式:u8g2.drawBitMap
(x,y,cnt,h)参数: x是水平线位置
y是垂直线位置
cnt是点阵图字节数,宽是1字节*8(这个字节数必须控制好,否则点阵图会出现扭曲)
h是点阵图高度u8g2.drawBox()
//画个实心方形格式:u8g2.drawBitMap (x,y,w,h)参数: x是水平线起始位置
y是垂直线起始位置
w是方形的宽
h是方形的高例子:
#include &Arduino.h&
#include &SPI.h&
#include &U8g2lib.h&
U8G2_SSD_NONAME_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 4, /* data=*/ 5, /* cs=*/ 3, /* dc=*/ 6, /* reset=*/ 7);
void setup(void) {
u8g2.begin();
void loop(void) {
u8g2.firstPage();
u8g2.drawBox(48,20,25,15);
//(起始X,起始Y,方形的宽W,方形的高H)
} while ( u8g2.nextPage() );
delay(1000);
u8g2.drawCircle()
//画个空心圆,可选四个方向的半圆类似与关联函数:drawDisc 、setDrawColor格式:u8g2.drawCircle(x, y ,rad,opt);
// X,YS是绘图起始位置(圆的中心点),rad是圆的四分之一弧度。opt是选项:
U8G2_DRAW_UPPER_RIGHT
//左上角弧度
U8G2_DRAW_UPPER_LEFT
//右上角弧度
U8G2_DRAW_LOWER_LEFT
//左下角幅度
U8G2_DRAW_LOWER_RIGHT
//右下角幅度
U8G2_DRAW_ALL
void loop(void) {
u8g2.firstPage();
u8g2.drawCircle(48, 30, 10, U8G2_DRAW_LOWER_LEFT);
} while ( u8g2.nextPage() );
delay(1000);
u8g2.drawDisc()
//画个实心圆,使用法跟drawCircle
一个饼样。多普达手机不好使,图片将就看。 U8G2.drawEllipse()
//画一个空心椭圆形,实际上,和画圆是非常相似的用法。格式:u8g2.drawEllipse(X,Y, RX, RY, OPT);
参数:X,Y是椭圆形中心坐标
RX是椭圆形水平线的RAD,RY是垂直线的RAD
opt是选项:
U8G2_DRAW_UPPER_RIGHT
//左上角弧度
U8G2_DRAW_UPPER_LEFT
//右上角弧度
U8G2_DRAW_LOWER_LEFT
//左下角幅度
U8G2_DRAW_LOWER_RIGHT
//右下角幅度
U8G2_DRAW_ALL
void loop(void) {
u8g2.firstPage();
u8g2.drawEllipse(48, 30, 15, 10, U8G2_DRAW_ALL);
} while ( u8g2.nextPage() );
delay(1000);
u8g2.drawFilledEllipse()
//画一个实心椭圆形,与u8g2.drawEllipse用法也是一个饼样 u8g2.DrawFrame
//画一个空心方框格式:u8g2.drawFrame(X,Y,W,H);
// X,Y是方框的左上角坐标,W,H是宽和高,注意,如果方框比屏大,则多出部分不绘画,也就是说不耗内存和出现错图。例子:void loop(void) {u8g2.firstPage();do {u8g2.drawFrame(48,30,25,15);} while ( u8g2.nextPage() );delay(1000);}
u8g2.drawGlyph()
//绘制字集里的符号,这个功能很帅。
格式:u8g2.drawGlyph(X,
字集代码);
// XY依然是坐标,字集需要先设置字体,然后参考示图选择符号输出,如下图
void loop(void) {
u8g2.firstPage();
u8g2.setFont(u8g2_font_unifont_t_symbols);
//先设置字体字集
u8g2.drawGlyph(48, 40, 0x2603);
//输出代码
} while ( u8g2.nextPage() );
delay(1000);
u8g.drawLine()
//画一条平面直线格式:u8g.drawLine(x0, y0, x1, y1);
//x0,y0是直线起始位置, x1,y1是直线终止位置。例子:u8g.drawLine(20, 5, 5, 32); drawPixel()
//画一个点,一个点的像素。格式:drawPixel(x,y)
//x,y是画点的位置。(宽,高)u8g2.drawRFrame()
//画一个圆角空心方形 u8g2.drawRBox()
//画一个圆角实心方形特别说明:关于这两个代码,综合一下U8G2里面关于画四边形的函数:drawBox(实心),drawFrame(空心)这两个是直角四边形。然而drawRBox(实心),drawRFrame(空心) 这两个带R的是圆角四边形的。Box是实心,Frame是空心,带R的都是圆角。参数:两个函数的参数排放一样:
(X起始位,Y起始位,W宽度,H高度,R圆角的半径(至少R&XY))
void loop() {
u8g2.firstPage();
u8g2.drawRFrame(20,17,30,22,7);
u8g2.drawRBox(80,25,20,25,5);
} while( u8g2.nextPage());
ps:任何一个形状如果XY初始位置放不好(至少没有位置能全部绘制出W*H),就会出现一下图。多出的图形不会绘制,也就是说不会浪费内存。 u8g2.drawStr()
//绘制字符串,可以想象字符串是一串符号,它能输出什么“字符串”在屏上。取决于它的setFont被设置的字体集。说明:一般都配搭着setFont函数使用,当然,如果不需要其它的字体集,在一开始begin()后设置,全局。字体集详情看setFont函数。一下是三个实例图。格式:u8g2.drawStr(X, Y,
//S记得加“”。 特别注意,它的初始点XY是在左下角: u8g.drawTriangle() //绘制实体三角形格式:u8g.drawTriangle(X0,Y0, X1,Y1, X2,Y2);
X0,Y0 :第一个角位置
X1,Y1 :第二个角位置
:第三个脚位置
u8g.drawTriangle(20,5, 27,50, 5,32);
//至于如何控制显示要预想的位置,看多几次图片就明白了,很简单。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 华为手机省电方式 的文章

 

随机推荐