极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16872|回复: 11

如何解决LED快速频闪?

[复制链接]
发表于 2014-11-28 10:26:44 | 显示全部楼层 |阅读模式
简单自我介绍下,我是电气工程师,搞强电的,对电子也比较感兴趣,最近在自学Arduino,做了一个用LED显示温度的小程序,是用DHT11和4位数码管,程序如下:(调用的"SevSeg.h" "dht11.h"库文件)

#include "SevSeg.h"
#include "dht11.h"
SevSeg sevseg;
char ch;

dht11 DHT11;
#define DHT11PIN A2 //DHT11 PIN 2 连接UNO

void setup()

{
  sevseg.Begin(0,2,3,4,5,6,7,8,9,10,11,12,13);

}

void loop()
{
int chk = DHT11.read(DHT11PIN);

      
       sevseg.NewNum(DHT11.temperature, 0);     

    sevseg.PrintOutput();
   
     
}


程序跑起来没问题,能显示温度,但是LED闪烁比较明显,请问大家这个如何解决比较好?
回复

使用道具 举报

发表于 2014-11-28 10:57:58 | 显示全部楼层
闪烁肯定是刷新的问题!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-28 11:15:10 | 显示全部楼层
是啊,学习的时候,直接点亮LED,那时刷新快,根本看不出来,现在因为调用了2个库,是不是程序大了,刷新慢了?有没有好的办法?
回复 支持 反对

使用道具 举报

发表于 2014-11-28 11:48:36 | 显示全部楼层
沒用過 sevseg 的庫, 不太肯定.  
但我猜測可能是每次顯示都需要先清除原來的顯示, 會出現一次閃爍.

基本上, 如果沒溫度變化, 就不再輸出 (反正也沒分別), 又或加入 delay 減少輸出次數 (一秒一次也很足夠了吧), 應該可以解決問題.
回复 支持 反对

使用道具 举报

发表于 2014-11-28 11:58:50 | 显示全部楼层
在loop里面加延时  可以吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-28 11:59:10 | 显示全部楼层
如果加入delay,比如1S,那么就是1S闪一下
回复 支持 反对

使用道具 举报

发表于 2014-11-28 12:19:45 | 显示全部楼层
kagetang 发表于 2014-11-28 11:59
如果加入delay,比如1S,那么就是1S闪一下

對, 因為每次輸出一次, 就閃一次了.

最好的方法, 是把之前的溫度記下來, 如果沒變化, 就不需要輸出了.
這樣, 除非你那裡的溫度變化得很厲害, 又或是溫度探頭不穩定, 否則應該很久才會閃一次.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-28 14:19:28 | 显示全部楼层
Super169 发表于 2014-11-28 12:19
對, 因為每次輸出一次, 就閃一次了.

最好的方法, 是把之前的溫度記下來, 如果沒變化, 就不需要輸出了. ...

那这样的话,那个SevSeg.h的库就不能用了吧,我倒是想找个拿来就能用的库,没想去深究里面的东西
回复 支持 反对

使用道具 举报

发表于 2014-11-28 14:48:46 | 显示全部楼层
kagetang 发表于 2014-11-28 14:19
那这样的话,那个SevSeg.h的库就不能用了吧,我倒是想找个拿来就能用的库,没想去深究里面的东西

為什麼不能用?  是否要輸出, 是你控制的.

每次先讀取溫度, 當溫度沒變化時, 就不要執行:
  1.       
  2. sevseg.NewNum(DHT11.temperature, 0);     
  3. sevseg.PrintOutput();
复制代码


不就可以了嗎?  
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-28 15:49:30 | 显示全部楼层
Super169 发表于 2014-11-28 14:48
為什麼不能用?  是否要輸出, 是你控制的.

每次先讀取溫度, 當溫度沒變化時, 就不要執行:

能直接告诉我吗,刚开始接触找个东西,不太会啊
回复 支持 反对

使用道具 举报

发表于 2014-11-28 16:45:16 | 显示全部楼层
建议的办法就是 加 if 判断,本次数值与上一次比较,如果没有变化则不刷新 led
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-28 17:27:58 | 显示全部楼层
http://www.geek-workshop.com/thread-3168-1-1.html
同样是调用

#include "SevSeg.h"
SevSeg sevseg;
void setup() {
//定义需要使用的引脚
  sevseg.Begin(1,2,3,4,5,6,7,8,9,10,11,12,13);

}

void loop() {
  //激活输出功能
  sevseg.PrintOutput();
int val = analogRead(A0);
val = map(val,0,1023,0,9);    //使用map函数来做数值映射

    sevseg.NewNum(val, 4);     //数码管函数输出数字,其中数值为小数点所在位置,我放在第四格所以效果就是不显示小数点
  }

这个程序就没有闪烁的效果,不知道为什么?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 17:17 , Processed in 0.035476 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表