本文要介绍的是一个由Arduino驱动的数字时钟,同时也是一个非常有趣的四冲程发动机模拟器,通过小时和分钟处的数字模拟汽车发动机的活塞运动。介绍由Arduino驱动的“四冲程数字时钟”是一个有趣的数字时钟内燃机模拟器。小时和分钟数字代表活塞移动并具有精确的RPM控制(100到800),RPM由显示屏中心的两列显示。另一个有趣的视觉信息是气缸的点火顺序“1-3-4-2”。当活塞在压缩循环中位于气缸顶部时,火花开始。该项目可以作为学习管理点阵像素和引入简单动画功能的一个很好的练习。四冲程内燃机该项目中使用的发动机型号是四冲程循环的I4(直列四缸)。四冲程内燃机分为四个步骤(进气-压缩-燃烧-排气),其中一步如下图所示:注意:更多内燃机的基本信息可以在维基百科上找到。时钟在这个项目中,小时和分钟的数字模拟了活塞的运动,并且所有气缸的火花在正确的时间突出显示。精确计算旋转以表示实际速度,并通过旋转电位计在100至800RPM(每分钟转数)之间调整该值。材料清单ArduinoUNOR3LED点阵与MAX7219DS1307RTC(实时时钟)旋转电位器-10KOhms面包板打印模板跳线3D打印文件:示意图:本文所用到代码:#include//LED矩阵库-MAX72XX#include//DS1307RTC库-ArduinoUNO的引脚:A4(SDA),A5(SCL)#include//实时时钟库#include//时间库#include//全局变量字节hh,mm;//小时,分钟字节uH,uM,dH,dM;//单位小时,单位分钟,青少年小时,青少年分钟字节p=0;//绘图模式(数字位置:上/下)intRPM=0,lastRPM=0,pinRPM=0;//RPM,RPM的最后值,RPM的模拟引脚字节序列=1;//开始火序列/*用于连接MAX72XX的Arduino引脚号(带MAX72XX控制器的LED阵列)引脚5连接到DataIn(DIN)引脚6连接到负载(CS)引脚7连接到CLK(CLK)*/LedControllc=LedControl(5,7,6,2);//LedControl(intDIN,intCLK,intCS,intnumDevices)//数字数组-(0到9)-大小5x3字节数[10][3]={{0xF8,0x88,0xF8},//0{0x00,0xF8,0x40},//1{0xE8,0xA8,0xB8},//2{0xF8,0xA8,0x88},//3{0x78,0x20,0xE0},//4{0xB8,0xA8,0xE8},//5{0xB8,0xA8,0xF8},//6{0xC0,0xB8,0x80},//7{0xF8,0xA8,0xF8},//8{0xF8,0xA0,0xE0},//9};无效设置(){setSyncProvider(RTC.get);//FunctiontoreadRTC(RealTimeClock)setSyncInterval(60);//Setthenumberofsecondsbetweenre-sync//setTime(8,19,30,10,02,2018);//SettheTimeandDate(hour,minute,second,day,month,year)//RTC.set(now());//SettheRTCtime//SetupofDisplay"0"lc.shutdown(0,false);//WakeupDisplay"0"lc.setIntensity(0,4);//SettheBrightnessofDisplay(0to15)lc.clearDisplay(0);//ClearDisplay"0"//SetupofDisplay"1"lc.shutdown(1,false);//WakeupDisplay"1"lc.setIntensity(1,4);//SettheBrightnessofDisplay(0to15)lc.clearDisplay(1);//ClearDisplay"1"}voidloop(){hh=hour();mm=minute();uH=hh%10;dH=hh/10;uM=mm%10;dM=mm/10;//PlotHoursfor(bytek=0;klc.setRow(0,k+5,num[dH][k]>>(p+2));lc.setRow(0,k+1,num[uH][k]>>(3-p));}//PlotMinutesfor(bytek=0;klc.setRow(1,k+4,num[dM][k]>>(3-p));lc.setRow(1,k,num[uM][k]>>(p+2));}//PlotFireSequence:1-3-4-2(4cyl:1-3-4-2or1-2-4-3or1-4-3-2)if(seq==1){//FireCyl#1lc.setLed(0,6,0,true);}if(seq==2){//FireCyl#3lc.setLed(1,5,0,true);}if(seq==3){//FireCyl#4lc.setLed(1,1,0,true);}if(seq==4){//FireCyl#2lc.setLed(0,2,0,true);}seq=seq%4+1;//RPMreadingRPM=analogRead(pinRPM);//PotentiometerreadingRPM=map(RPM,0,1023,1,9);if(RPMlc.setLed(1,7,8-RPM,true);lc.setLed(0,0,8-RPM,true);delay(300/RPM);//Speedsetupbypotentiometer(100-800RPM)if(lastRPM!=RPM){lc.setRow(0,0,0);lc.setRow(1,7,0);最后转数=转数;}}p=!p;//切换数字位置(上x下)}如果您对此项目有任何想法、意见或问题,请在下方留言。*以上内容翻译自网络,原作者:LAGSILVA,如涉及侵权,可联系删除。