我们每天都需要定好闹钟提醒自己起床,问题是每个人都在不同的时间以不同的方式这样做。大多数人使用声音来唤醒,许多人讨厌它。但是你知道吗:根据世界卫生组织的说法,世界上有5%的人口有某种听力障碍?(他们不能很好地听到声音)此外,声音不仅会留在您的房间内,还会穿过墙壁。(它可以无意中唤醒其他人)因此,我们可以用光代替声音……介绍“灯泡报警”。这是一种警报,以灯的形式出现,它会像日出一样逐渐打开灯光以唤醒您。您只需要配置4件事。在菜单上找到设置,然后:选择它应该完全打开的小时和分钟。(使用旋转编码器导航和配置)然后,它应该在多少分钟前开始点亮。最后,它会在几分钟后以全功率开启。这个项目将为你介绍一个LAMP-ALARM是如何制成的~补给品电子产品:1xArduinoNano1个TIP35C晶体管1x0.96''OLED显示屏1x旋转编码器+开关1xRTC时间模块1xMCP472512位DAC转换器1x穿孔板15x15cm2x2针螺丝蓝色PCB端子80x直针式接头10x90°排针4[米]2芯线1x12v-2A电源1x普通灯泡螺丝插座1x12v灯泡力学:木块螺丝金属支架(扁平和普通L型)U型钉白胶黑漆画笔工具:烙铁+锡钻头螺丝刀锯统治者钢丝钳砂纸万用表第1步:电子原理图电路非常简单。它没有太多组件,每个组件都有一个非常重要的功能:ArduinoNano:是大脑在指挥一切。OLED显示屏:此显示屏显示有关时间和闹钟的所有信息。RTC时间模块:有了这个,我们可以知道现在几点了,而不必担心Arduino的电源。旋转编码器:它可以帮助您配置警报并浏览菜单。DAC模块:它将PWM信号的分辨率从8位增加到12位。晶体管:它是我们在5V和12V之间的桥梁。多亏了它,我们才能控制LED灯泡。螺丝安装:它们使连接和断开电线变得容易。如果您注意到,所有连接都分布在Perfboard上,无需额外的电缆。没有交叉。第2步:Arduino代码因此,我们想要制作一盏逐渐亮起(如日出)并等待完全亮起一段时间然后必须关闭的灯。我们还必须能够就地配置警报。所以我们需要开始编程。首先,我们需要一些库:#include#include#include#include#include#include然后我们需要为0到4095之间的范围定义一些变量,其中晶体管用作可变电阻器:longminRes=400;longmaxRes=700;现在我们有了RTC变量://*RTCVariablesRTC_DS3231rtc;inta_hora=5;inta_minuto=00;intminutos_antes=5;intminutos_despues=5;现在有一些变量来编程警报://*AlarmVariablesinti_hora;inti_minuto;intf_hora;intf_minuto;intstart_alarm=0;longc;intsegundo_anterior;intrise=0;longsegundos_rise=minutos_antes*60;请记住,我们想就地配置警报。这意味着我们不需要将arduino插入我们的PC并上传程序。我们可以通过菜单来实现。在第一页上,我们将显示时间,在第二页上,我们可以开始使用旋转编码器更改警报参数。//*MenuVariablesintpagPrincipales=2;intposPaginas=5;intmaxPos=pagPrincipales*posPaginas;intpag1=0;intsubMenuPag2=0;现在我们有一些DAC的变量://*DACVariablesAdafruit_MCP4725dac;对于旋转编码器://*RotaryEncoderVariablesintxPos=0;volatileintpinA=4;intpinB=3;intswitchPin=2;intswitchState=HIGH;volatileintpinAstateCurrent=LOW;volatileintpinAStateLast=pinAstateCurrent;现在是OLED。警告!!!…………………………………………………………………………………………………………………………………………你必须小心这一点。验证(扫描)您的OLED的地址。这是有关如何执行此操作的教程。然后,如果不同,请更改它://*OLED变量#defineSCREEN_WIDTH128#defineSCREEN_HEIGHT64#defineOLED_RESET-1#defineSCREEN_ADDRESS0x3CAdafruit_SSD1306display(SCREEN_WIDTH,SCREEN_HEIGHT,&Wire,OLED_RESET);所以现在我们有了菜单,我们想让它更有吸引力。因此,我们插入了一个时钟的图像。我们遵循本教程使其成为可能。如果你想要不同的东西,你可以改变它。这是十六进制代码的图像:constunsignedcharclockAlarm[]PROGMEM={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0x00,0x01,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0x80,0x03,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xc0,0x07,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xe0,0x07,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xc0,0x07,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xfe,0x00,0x00,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xf8,0x1f,0xf8,0x3f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xf0,0xff,0xfe,0x0f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xc3,0xff,0xff,0x87,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x87,0xff,0xff,0xc3,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0xff,0xff,0xf1,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x1f,0xf0,0x1f,0xf8,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xc0,0x03,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x01,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x01,0x80,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x03,0x80,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x03,0x80,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xf8,0x03,0x80,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xf0,0x03,0x80,0x1f,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xf0,0x03,0x80,0x1f,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xf0,0x03,0x80,0x0f,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xf0,0x03,0x80,0x0f,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xe0,0x03,0xc0,0x0f,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xe0,0x07,0xe0,0x0f,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xe0,0x07,0xf0,0x0f,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xf0,0x03,0xfc,0x0f,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xf0,0x00,0x3e,0x0f,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xf0,0x00,0x1f,0x1f,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xf8,0x00,0x06,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xf8,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x80,0x01,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xe0,0x07,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xfc,0x7f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x7f,0xfc,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x07,0xe0,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};最后一个变量是减少旋转编码器对开关的误按。(去抖动)://*DebounceVariablelongstartTimeDeb=0;现在我们有了voidSetup,我们可以在其中打开和配置所有传感器,并计算正确打开警报的分钟数和小时数。我们还为开关和旋转编码器使用中断://****************SETUP****************//voidsetup(){Serial.begin(9600);//**DACConfigurationdac.begin(0x60);dac.setVoltage(0,false);//**OLEDConfigurationif(!display.begin(SSD1306_SWITCHCAPVCC,SCREEN_ADDRESS)){Serial.println(F("SSD1306allocationfailed"));for(;;);//Don'tproceed,loopforever}display.display();display.clearDisplay();//**RTCConfigurationif(!rtc.begin()){Serial.println("NohayunmóduloRTC");while(1);}//rtc.adjust(DateTime(2021,9,20,18,29,0));ToadjustRTCmoduledateandtime//**AlarmConfigurationif(a_minuto-minutos_antes59){f_hora=a_hora+1;f_minuto=minutos_despues+a_minuto-60;}else{f_hora=a_hora;f_minuto=a_minuto+minutos_despues;}segundos_rise=minutos_antes*60;//**RotaryEncoderConfigurationpinMode(switchPin,INPUT_PULLUP);pinMode(pinA,INPUT);pinMode(pinB,INPUT);attachInterrupt(digitalPinToInterrupt(pinB),update,CHANGE);attachInterrupt(digitalPinToInterrupt(switchPin),switchPressed,FALLING);}现在我们有了void循环,它配置屏幕上显示的内容,它还会检查是否到了启动警报的时间,它还配置了警报不同阶段的灯泡强度://****************LOOP****************//voidloop(){DateTimenow=rtc.now();intpag1Time=1;//Page1Timeif(xPos>=0&&xPos=1*posPaginas&&xPos当旋转编码器移动时,我们使用一个额外的函数来更新菜单和警报值:voidupdate(){//ROTATIONDIRECTIONpinAstateCurrent=digitalRead(pinA);//ReadthecurrentstateofPinA//Ifthereisaminimalmovementof1stepif((pinAStateLast==LOW)&&(pinAstateCurrent==HIGH)){if(digitalRead(pinB)==HIGH){//IfPinBisHIGHxPos++;if(subMenuPag2==0){if(xPos>maxPos){xPos=0;}}if(subMenuPag2==1){if(xPos>23){xPos=0;}a_hora=xPos;}if(subMenuPag2==2){if(xPos>59){xPos=0;}a_minuto=xPos;}if(subMenuPag2==3){if(xPos>59){xPos=0;}minutos_antes=xPos;}if(subMenuPag2==4){if(xPos>59){xPos=0;}minutos_despues=xPos;}}else{xPos--;if(subMenuPag2==0){if(xPosxPos=maxPos;}}if(subMenuPag2==1){if(xPosxPos=23;}a_hora=xPos;}if(subMenuPag2==2){if(xPosxPos=59;}a_minuto=xPos;}if(subMenuPag2==3){if(xPosxPos=59;}minutos_antes=xPos;}if(subMenuPag2==4){if(xPosxPos=59;}minutos_despues=xPos;}}}pinAStateLast=pinAstateCurrent;//Storethelatestreadvalueinthecurrectstatevariable}最后,我们使用另一个额外的函数来验证旋转编码器的按钮(开关)何时被按下。这将配置菜单和警报:voidswitchPressed(){Serial.println("Switchpressed");if(millis()-startTimeDeb>150){if(subMenuPag2==4){subMenuPag2=0;xPos=0;if(a_minuto-minutos_antesi_hora=a_hora-1;i_minuto=60-(minutos_antes-a_minuto);}else{i_hora=a_hora;i_minuto=a_minuto-minutos_antes;}if(a_minuto+minutos_despues>59){f_hora=a_hora+1;f_minuto=minutos_despues+a_minuto-60;}else{f_hora=a_hora;f_minuto=a_minuto+minutos_despues;}segundos_rise=minutos_antes*60;}if(subMenuPag2==3){subMenuPag2=4;xPos=minutos_despues;}if(subMenuPag2==2){subMenuPag2=3;xPos=minutos_antes;}if(subMenuPag2==1){subMenuPag2=2;xPos=a_minuto;}if(xPos>=5&&xPossubMenuPag2=1;xPos=a_hora;}startTimeDeb=millis();}}↓↓↓完整代码如下:日出警报.ino第3步:印刷电路板为了有一个好看的项目,我们认为电缆不是正确的路径,所以制作了PCB。我们按照原理图焊接路径。可选的:组件没有直接焊接到Perfboard。我们使用了标题,以便组件可以在未来的项目中使用。焊接时,使用万用表在途中检查连接。因为如果你一次焊接所有东西,以后就很难发现错误了。本教程对如何焊接非常有帮助。记住不要添加太多锡,还要等到你的连接变冷才能继续。第4步:灯具设计此部分我使用的CAD源文件见下方:日出警报.f3d第5步:灯的构造这里有一个关于如何用木块组装螺丝的GIF。您可以在放置螺钉之前使用胶水以获得更好的密封效果。该项目中使用的木材是木工的剩余物(垃圾)。使用应该:得到你喜欢的木块购买适合木材尺寸的螺丝建议是在安装螺钉之前钻孔。孔的直径必须小于螺钉的直径。你应该让它干燥12小时。正如我们之前告诉您的,这一步完全取决于您和最终用户的需求。所以是自由设计您想要的任何类型的灯。让你的创造力流动!第6步:最终装饰这个项目的要求是看起来很酷!为了实现它,我们做了一些事情:将LightBlub插座涂成黑色。它与黑色和弦相结合。将PCB漆成黑色。它结合了木材和金属部件。我们用砂纸打磨木头以获得漂亮的饰面。将PCB拧到基木上。使用金属支架(L型、普通和扁平)打造复古/工业风格。我们用U形钉将电缆固定在一侧。它看起来更有条理。如果您找到更好的方法让它变酷,请不要犹豫使用它!第7步:恭喜!你完成了!如果你到了这部分,恭喜,现在你有了一个很酷的报警灯!第8步:警告与往常一样,您应该小心并向成人寻求帮助!:电不是玩笑。小心你的连接。您可能会对您自己或您附近的人造成严重伤害。使用工具时,务必使用防护装备(眼睛、脸、嘴、手、身体)。先设计然后构建更容易。你减少了即兴创作的时间。焊接PCB时,请随时检查您的连接。使用万用表验证导通性。在PCB中使用排针。这将让您重用组件。打磨木材以获得更好的光洁度。扫描每个组件的I2C地址(特别是针对OLED显示器)以避免错误。如果您有任何问题,我们在这里为您解答!