目录
简介
视觉持久性(POV)显示器通常是LED显示器,其通过在给定时间内快速、连续地显示图像的一部分来,从而形成一幅完成的图像。
在“趣讨教”网站上展示了这个是结构相对简单,但视觉上有明显冲击的面部时钟。组成部件包含Arduino Nano 17个LED二极管 、霍尔效应传感器、电阻,升压转化器、锂电池。LED二极管组d1-d11,d12-d16和d17具有不同的颜色,以获得更好的视觉效果。该设备由锂电池通过升压转换器供电。
步骤一 材料准备
硬件准备:
Arduino Nano * 1
个LED二极管 * 17
霍尔效应传感器 * 1
电阻
升压转化器
锂电池。
软件准备:
arduino IDE
步骤二 原理说明
视觉暂留(POV)即视觉的短暂停留。人眼观看物体时,物体的像会成到视网膜上。视网膜上的光感细胞将光信号转换为生物电信号通过视神经传给大脑。然而,当物体移去后,视神经对物体的印象不会立刻消失。现代医学已经证明,人眼看到一个物体后,在1/24秒内不会消失。这种现象叫做视觉暂留,也叫人眼的惰性。这种惰性会使人的视觉产生重叠,使物体“变静为动”.所以,以每秒超过24帧画面以上连续呈现静态画面时,我们会看到平滑连续的动态画面。
步骤三 电路搭建
首先我们先来看一下原理图部分

从上面我们可以看到连接的线还是比较繁琐的,要小心不要连接错了。根据原理图组装是个有挑战的事,中间可能遇到很多问题。对我来说,项目中最困难的部分是机械稳定性。在第一次尝试中,电池被设置为偏心并且以更高的旋转速度产生巨大的振动。然后我做了一个修改,把电池放在旋转中心。
为了旋转,我使用连接到可变电源的12V电动机,因此可以容易地控制设备的旋转速度。根据设备的旋转速度,在代码中需要将“delayMicroseconds”的值设置为确定的值。下面给出来我的连接图以供参考。

步骤四 编写程序
// hobbyprojects
// ArduinoNanoPropellerLEDAnalogClock20190403A
int LED1 = 2;
int LED2 = 3;
int LED3 = 4;
int LED4 = 5;
int LED5 = 6;
int LED6 = 7;
int LED7 = 8;
int LED8 = 9;
int LED9 = 10;
int LED10 = 11;
int LED11 = 12;
int LED12 = A1;
int LED13 = A2;
int LED14 = A3;
int LED15 = A4;
int LED16 = A5;
int sensorPin = A0;
unsigned int n,ADCvalue,propeller_posn;
unsigned long previousTime = 0;
byte hours = 12; // set hours
byte minutes = 15; // set minutes
byte seconds = 00; // set seconds
int val;
void setup()
{
pinMode(LED1,OUTPUT);
pinMode(LED2,OUTPUT);
pinMode(LED3,OUTPUT);
pinMode(LED4,OUTPUT);
pinMode(LED5,OUTPUT);
pinMode(LED6,OUTPUT);
pinMode(LED7,OUTPUT);
pinMode(LED8,OUTPUT);
pinMode(LED9,OUTPUT);
pinMode(LED10,OUTPUT);
pinMode(LED11,OUTPUT);
pinMode(LED12,OUTPUT);
pinMode(LED13,OUTPUT);
pinMode(LED14,OUTPUT);
pinMode(LED15,OUTPUT);
pinMode(LED16,OUTPUT);
pinMode(sensorPin,INPUT_PULLUP);
if(hours == 12)
hours = 0;
}
void loop()
{
val = digitalRead(sensorPin);
while (val == LOW)
{
val = digitalRead(sensorPin);
}
if (millis() >= (previousTime))
{
previousTime = previousTime + 1000;
seconds = seconds+1;
if (seconds == 60)
{
seconds = 0;
minutes = minutes+1;
}
if (minutes == 60)
{
minutes = 0;
hours = hours+1;
}
if (hours == 12)
{
hours = 0;
}
}
propeller_posn=30;
n=0;
while(n < 60)
{
drawMinuteMarker();
if ((propeller_posn==0) || (propeller_posn==5) || (propeller_posn==10) || (propeller_posn==15) || (propeller_posn==20) || (propeller_posn==25) || (propeller_posn==30) || (propeller_posn==35) || (propeller_posn==40) || (propeller_posn==45) || (propeller_posn==50) || (propeller_posn==55))
drawHourMarker();
if ((propeller_posn==0) || (propeller_posn==15) || (propeller_posn==30) || (propeller_posn==45))
drawQuarterMarker();
if((propeller_posn == hours*5) || (( propeller_posn == 0 ) && (hours == 0)))
drawHoursHand();
if(propeller_posn == minutes)
drawMinutesHand();
if(propeller_posn == seconds)
drawSecondsHand();
delayMicroseconds(140); // for LED pixel width (change the value according to motor speed. Increase for low speed, decrease for high speed motor)
displayClear();
drawInner_Circle();
delayMicroseconds(600); // for the gap between LED pixels/minutes markers (change the value according to motor speed. Increase for low speed, decrease for high speed motor)
n++;
propeller_posn++;
if(propeller_posn == 60)
propeller_posn=0;
}
val = digitalRead(sensorPin);
while (val == HIGH)
{
val = digitalRead(sensorPin);
}
}
//=========================
void displayClear()
{
digitalWrite(LED1,LOW);
digitalWrite(LED2,LOW);
digitalWrite(LED3,LOW);
digitalWrite(LED4,LOW);
digitalWrite(LED5,LOW);
digitalWrite(LED6,LOW);
digitalWrite(LED7,LOW);
digitalWrite(LED8,LOW);
digitalWrite(LED9,LOW);
digitalWrite(LED10,LOW);
digitalWrite(LED11,LOW);
digitalWrite(LED12,LOW);
digitalWrite(LED13,LOW);
digitalWrite(LED14,LOW);
digitalWrite(LED15,LOW);
digitalWrite(LED16,LOW);
}
void drawMinuteMarker()
{
digitalWrite(LED16,HIGH);
}
void drawHourMarker()
{
digitalWrite(LED15,HIGH);
digitalWrite(LED14,HIGH);
}
void drawQuarterMarker()
{
digitalWrite(LED13,HIGH);
digitalWrite(LED12,HIGH);
}
void drawHoursHand()
{
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
digitalWrite(LED4,HIGH);
digitalWrite(LED5,HIGH);
digitalWrite(LED6,HIGH);
digitalWrite(LED7,HIGH);
}
void drawMinutesHand()
{
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
digitalWrite(LED4,HIGH);
digitalWrite(LED5,HIGH);
digitalWrite(LED6,HIGH);
digitalWrite(LED7,HIGH);
digitalWrite(LED8,HIGH);
digitalWrite(LED9,HIGH);
}
void drawSecondsHand()
{
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
digitalWrite(LED4,HIGH);
digitalWrite(LED5,HIGH);
digitalWrite(LED6,HIGH);
digitalWrite(LED7,HIGH);
digitalWrite(LED8,HIGH);
digitalWrite(LED9,HIGH);
digitalWrite(LED10,HIGH);
digitalWrite(LED11,HIGH);
}
void drawInner_Circle()
{
digitalWrite(LED1,HIGH);
delayMicroseconds(30);
digitalWrite(LED1,LOW);
}
步骤五 验证结果
最后我们来亲眼验证我们的成果吧!


















請問霍爾效應傳感器是哪顆?
你好,原理图上没有画上去,这里用霍尔传感器充当开关,我把它安装到了led所在安装板的最外缘,至于为什么采用它,为什么安装在那里,以及它的工作原理和控制过程,我想你可以思考一下。
感謝您的回覆,我想請教下是否有霍爾傳感器之編號?
你是想问霍尔传感器的型号吗
是的,我試過幾種都達不到效果,請教型號?