:(i)使用Arduino控制OLED显示屏ili9341,在屏幕上显示一个尽可能大的时钟表盘,包含12个刻度和对应的1~12数字,以及一个秒针。秒针最初向上指向数字12。 (ii)Arduino上连接1个按钮。按钮第一次按下,秒表开始计时,秒针要准确地转动。按钮第二次按下,秒针暂停,在时钟表盘旁边用数字显示过去了多少秒(精确到0.01秒)。按钮第三次按下,秒针接着继续转动。第四次按下,秒针再次暂停,在时钟表盘旁边换行用数字显示过去了多少秒(精确到0.01秒)。第五次按下,同第三次……如此重复。 (iii)使用定时器进行准确的计时。Arduino上再加1个按钮,此按钮按下时,秒针归零。全部重新开始。
时间: 2023-07-15 20:12:04 浏览: 197
只需使用Arduino即可获得准确的时钟
好的,这个任务需要使用Arduino控制OLED显示屏ili9341和一个按钮,同时需要使用定时器进行准确的计时。我将分步骤地为您解释如何实现这个任务。
步骤1:连接硬件
首先,您需要将OLED显示屏ili9341连接到Arduino板上。可以参考ili9341库中的示例代码,该代码提供了连接说明和示例程序。
接下来,您需要将按钮连接到Arduino板上。将一个按钮的一个引脚连接到数字引脚2,另一个引脚连接到地线。
步骤2:编写代码
接下来,您需要编写代码来控制OLED显示屏ili9341和按钮。以下是一个样例代码,包括时钟表盘、秒针、按钮和定时器的实现。
```
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <SPI.h>
#include <TimerOne.h>
#define TFT_DC 9
#define TFT_CS 10
#define TFT_RST 8
#define BTN_PIN 2
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
volatile int second_counter = 0;
volatile bool is_running = false;
volatile bool is_paused = false;
void setup() {
Serial.begin(9600);
tft.begin();
tft.setRotation(3); // Rotate screen 90 degrees
tft.fillScreen(ILI9341_BLACK);
tft.setTextSize(2);
tft.setTextColor(ILI9341_WHITE);
tft.setCursor(30, 50);
tft.print("12");
tft.setCursor(138, 110);
tft.print("3");
tft.setCursor(30, 170);
tft.print("6");
tft.setCursor(2, 110);
tft.print("9");
tft.drawCircle(120, 120, 90, ILI9341_WHITE);
pinMode(BTN_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(BTN_PIN), button_pressed, FALLING);
Timer1.initialize(1000000); // 1 second
Timer1.attachInterrupt(timer_tick);
}
void loop() {
if (is_running) {
int seconds = second_counter % 60;
int minutes = (second_counter / 60) % 60;
int hours = (second_counter / 3600) % 12;
int x1 = 120 - 80 * cos((hours * 30 + minutes * 0.5) * PI / 180);
int y1 = 120 - 80 * sin((hours * 30 + minutes * 0.5) * PI / 180);
int x2 = 120 - 90 * cos((minutes * 6 + seconds * 0.1) * PI / 180);
int y2 = 120 - 90 * sin((minutes * 6 + seconds * 0.1) * PI / 180);
tft.drawLine(120, 120, x1, y1, ILI9341_WHITE);
tft.drawLine(120, 120, x2, y2, ILI9341_WHITE);
}
}
void button_pressed() {
if (!is_running) {
second_counter = 0;
is_running = true;
} else {
if (!is_paused) {
is_paused = true;
Timer1.stop();
int seconds = second_counter % 60;
int milliseconds = (second_counter % 1) * 100;
tft.setCursor(260, 50);
tft.print("Time:");
tft.setCursor(260, 80);
tft.print(seconds);
tft.print(".");
if (milliseconds < 10) {
tft.print("0");
}
tft.print(milliseconds);
} else {
is_paused = false;
Timer1.resume();
tft.fillRect(260, 50, 80, 40, ILI9341_BLACK);
}
}
}
void timer_tick() {
if (is_running && !is_paused) {
second_counter++;
}
}
```
步骤3:测试代码
将代码上传到Arduino板上,打开串口监视器,然后按下按钮,测试代码是否正常工作。当您按下按钮时,秒表应该开始计时,并且秒针应该准确地转动。当您再次按下按钮时,秒针应该暂停,并在时钟表盘旁边用数字显示过去了多少秒。当您再次按下按钮时,秒针应该接着继续转动。当您第四次按下按钮时,秒针应该再次暂停,在时钟表盘旁边换行用数字显示过去了多少秒。当您第五次按下按钮时,同第三次,如此重复。当您按下第六个按钮时,秒针应该归零,全部重新开始。
希望这个步骤能够为您提供帮助,祝您好运!
阅读全文