模拟式 LED POV 时钟
组件和用品
| | × | 1 | |
| | × | 17 | |
| | × | 1 | |
| | × | 17 | |
| | × | 1 | |
| | × | 1 | |
关于这个项目
视觉暂留 (POV) 显示器通常是 LED 显示器,它通过在给定时间快速连续显示图像的一部分来“显示”图像。人脑将此视为连续图像的显示。
在“爱好项目”网站上展示了这种相对简单但视觉上有效的模拟风格面钟。电子部分包含 Arduino Nano 17 LED 二极管和霍尔效应传感器。 LED二极管组d1-d11、d12-d16、d17颜色不同,视觉效果更佳。该装置由锂离子电池通过升压转换器供电。
对我来说,项目中最困难的部分是机械稳定性。在第一次尝试中,电池偏心放置,并且在更高的旋转速度下会产生巨大的振动。然后我做了个修改,把电池放在旋转的中心。
对于旋转,我使用连接到可变电源的 12V 电动机,因此可以轻松控制设备的旋转速度。根据设备的旋转速度,在代码中需要将“delayMicroseconds”的值设置为一个确定的值。
呈现的视频不够清晰,因为为此我需要一个每秒帧数更好的相机。
代码
代码Arduino
// hobbyprojects// ArduinoNanoPropellerLEDAnalogClock20190403Aint 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; // 设置 hoursbyte 分钟 =15; // 设置分字节秒 =00; // set secondsint val;void setup() { pinMode(LED1,OUTPUT); pinMode(LED2,输出); pinMode(LED3,输出); pinMode(LED4,输出); pinMode(LED5,输出); pinMode(LED6,输出); pinMode(LED7,输出); pinMode(LED8,输出); pinMode(LED9,输出); pinMode(LED10,输出); pinMode(LED11,输出); pinMode(LED12,输出); pinMode(LED13,输出); pinMode(LED14,输出); pinMode(LED15,输出); pinMode(LED16,输出); 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;秒 =秒+1;如果(秒 ==60){ 秒 =0;分钟=分钟+1; } 如果(分钟 ==60){ 分钟 =0;小时=小时+1; } 如果(小时 ==12){ 小时 =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 ==分钟) drawMinutesHand(); if(propeller_posn ==seconds) drawSecondsHand();延迟微秒(140); // LED像素宽度(根据电机速度改变值。低速增加,高速电机减少) displayClear(); drawInner_Circle();延迟微秒(600); // LED像素/分钟标记之间的间隙(根据电机速度改变值。低速增加,高速电机减少)n++; propeller_posn++; if(propeller_posn ==60) propeller_posn=0; val =digitalRead(sensorPin); while (val ==HIGH) { val =digitalRead(sensorPin); }//==========================void displayClear() { digitalWrite(LED1,LOW);数字写入(LED2,低);数字写入(LED3,低);数字写入(LED4,低);数字写入(LED5,低);数字写入(LED6,低);数字写入(LED7,低);数字写入(LED8,低);数字写入(LED9,低);数字写入(LED10,低);数字写入(LED11,低);数字写入(LED12,低);数字写入(LED13,低);数字写入(LED14,低);数字写入(LED15,低);数字写入(LED16,低); } void drawMinuteMarker() { digitalWrite(LED16,HIGH); } void drawHourMarker() { digitalWrite(LED15,HIGH);数字写入(LED14,高); } void drawQuarterMarker() { digitalWrite(LED13,HIGH);数字写入(LED12,高); } void drawHoursHand() { digitalWrite(LED1,HIGH);数字写入(LED2,高);数字写入(LED3,高);数字写入(LED4,高);数字写入(LED5,高);数字写入(LED6,高);数字写入(LED7,高); } void drawMinutesHand() { digitalWrite(LED1,HIGH);数字写入(LED2,高);数字写入(LED3,高);数字写入(LED4,高);数字写入(LED5,高);数字写入(LED6,高);数字写入(LED7,高);数字写入(LED8,高);数字写入(LED9,高); } void drawSecondsHand() { digitalWrite(LED1,HIGH);数字写入(LED2,高);数字写入(LED3,高);数字写入(LED4,高);数字写入(LED5,高);数字写入(LED6,高);数字写入(LED7,高);数字写入(LED8,高);数字写入(LED9,高);数字写入(LED10,高);数字写入(LED11,高); } void drawInner_Circle() { digitalWrite(LED1,HIGH);延迟微秒(30);数字写入(LED1,低); }
示意图