简单的 Arduino 天文钟
组件和用品
![]() |
| × | 1 | |||
| × | 1 | ||||
![]() |
| × | 1 |
应用和在线服务
![]() |
|
关于这个项目
我正在做一个有趣的项目,我需要一个 Arduino 天文钟,只要我按下按钮就可以工作。这不是一件复杂的事情,但我认为这段代码对于其他人的项目会很方便。
我可能为您节省了 1 小时的编码时间。
EEPROM:

当您断开电源或重置电路板时,Arduino 的内存不会丢失其信息。(信息)。我正在使用 #include
库基本上可以完成所有事情,并且默认情况下已经安装。
中断:

我们的 Arduino 内部正在发生一些事情,但我们希望它停止做任何事情,并在例如某个引脚被拉高时处理我们的 ISR 功能。这里不需要额外的库:


项目代码:
- 定义并包括:
#include #define interruptPin 2 #define eeAddress 0 //ARDUINO 的 EEPROM(内部非易失性存储器)的地址 float starttime =0; //做数学运算的变量 float endtime=0;浮动结果时间=0,旧结果时间=0;
这里没有什么新东西,我们包含了 EEPROM 库,我们决定按钮将被连接到(pin2)的哪个位置。
然后我决定使用 EEPROM 存储器的地址 0 来存储我们的时间(浮点数 =4 字节)。 Arduino UNO 有 1024 字节(芯片 ATmega328),但我选择地址 0,因为我试图在我的生活中组织一次。
- 设置()
void setup() { Serial.begin(9600); while (!Serial) {; // 等待串口连接。仅适用于本机 USB 端口 } Serial.println("串行通信已准备就绪,先生!:.. bip bip"); attachInterrupt(digitalPinToInterrupt(interruptPin), refreshTime, CHANGE);}
通常,我们在 Arduino 和我们的 PC 之间启动串行通信(9600 波特):
attachInterrupt(digitalPinToInterrupt(interruptPin), refreshTime, CHANGE);
当interruptPin的逻辑电平发生变化时Attachinterrupt激活该函数:(____________-HERE------------------_HERE____________).
这样它会在我们按下的开始和结束时触发两次。如果没有任何反应,我们的中断引脚值将保持低电平,因为我们的下拉电阻“迫使”它保持低电平。
- 循环()
void loop() { }
没有什么。把你的东西放在那里!
- 其他功能:
void refreshTime(){ if(digitalRead(interruptPin)){ starttime=millis(); Serial.print("开始时间:"); Serial.println(开始时间); }else if(digitalRead(interruptPin)==LOW){ endtime=millis();结果时间=结束时间-开始时间; Serial.print("结束时间:"); Serial.println(结束时间); Serial.print("结果时间:"); Serial.println(结果时间); WhatsNewEeprom();//存储eeprom }
这是pin(interruptPin)发生中断时将要执行的函数。
每次中断引脚中的状态发生变化(HIGH 到 LOW 或 LOW 到 HIGH)时都会触发中断,那些 if(...) 用于检测它的 HIGH->LOW 或 LOW->high 变化。
存储由 Arduino millis() 的内部时钟记录的时间,并为我们准备好结果时间做差异。最后,它将新信息存储在 eeprom 中:
void WhatsNewEeprom(){ Serial.println("-----------检查 eeprom"); EEPROM.get(eeAddress, oldresulttime); Serial.print("oldresulttime");Serial.println(oldresulttime); Serial.print("resulttime");Serial.println(resulttime); if(resulttime!=oldresulttime){ EEPROM.put(eeAddress, resulttime); Serial.print("-----叮!eeprom记录新时间:");Serial.println(resulttime); }else{ Serial.println("没有找到新的时间,eeprom 没有受到干扰"); } 代码>
这个检查存储在 eeprom 中的时间值是否与我们在变量“resulttime”中的值相同,如果是,我们没有改变它,所以什么都不做。
额外的!去抖动我们的按钮:

我们人类对于 Arduino 的处理时间非常慢,按一下按钮对我们来说似乎很快,但对于 Arduino 来说真的很慢,这使得信号“反弹”,就像在确定真实状态之前切换 highlowhighlowhighlow 几次一样。
如果我们想要(我没有),我们可以通过硬件或软件修复它:
- 通过软件去抖动
- 通过硬件去抖动,使用电容!!! :D


我只是要添加一个 220nF 的并联(从 sensepin 到 GND)
电容器“吃掉”电压的快速变化。
代码
- arduino 计时器
arduino 计时器Arduino
使用 eeprom 和中断,很容易破解//由 Javier Muñoz 编码 23/10/2017//问题和烧毁的电报 [email protected]#include#define interruptPin 2#define eeAddress 0 // ARDUINO 的 EEPROM(内部非易失性存储器)的地址 float starttime =0; //做数学运算的变量 float endtime=0;浮动结果时间=0,旧结果时间=0;无效设置(){ Serial.begin(9600); while (!Serial) {; // 等待串口连接。仅适用于本机 USB 端口 } Serial.println("串行通信已准备就绪,先生!:.. bip bip"); attachInterrupt(digitalPinToInterrupt(interruptPin), refreshTime, CHANGE);//当interruptPin的逻辑电平发生变化时激活该函数,所以:(__-HERE------------------_HERE____)这样它存储了我们的手指按下按钮的时间}void loop() {//你的东西在这里//(eeprom存储)上次以毫秒为单位测量的“浮动结果时间”}void refreshTime(){ if(digitalRead(interruptPin) ){ 开始时间=毫秒(); Serial.print("开始时间:"); Serial.println(开始时间); }else if(digitalRead(interruptPin)==LOW){ endtime=millis();结果时间=结束时间-开始时间; Serial.print("结束时间:"); Serial.println(结束时间); Serial.print("结果时间:"); Serial.println(resulttime);WhatsNewEeprom(); }}void WhatsNewEeprom(){ Serial.println("-----------检查 eeprom"); EEPROM.get(eeAddress, oldresulttime); Serial.print("oldresulttime");Serial.println(oldresulttime); Serial.print("resulttime");Serial.println(resulttime); if(resulttime!=oldresulttime){ EEPROM.put(eeAddress, resulttime); Serial.print("-----叮!eeprom记录新时间:");Serial.println(resulttime); }else{ Serial.println("没有找到新的时间,eeprom 没有受到干扰"); }}
示意图
带有下拉电阻的按钮的简单连接 天文台_APM32Y9FoM.fzz
制造工艺