i)使用Arduino控制LCD显示屏ili9341在屏幕上显示一个尽可能大的时钟表盘,包含12个刻度和对应的1~12数字,以及一个秒针。秒针最初向上指向数字12。 (ii)Arduino上连接1个按钮。按钮第一次按下,秒表开始计时,秒针要准确地转动。按钮第二次按下,秒针暂停,在时钟表盘旁边用数字显示过去了多少秒(精确到0.01秒)。按钮第三次按下,秒针接着继续转动。第四次按下,秒针再次暂停,在时钟表盘旁边换行用数字显示过去了多少秒(精确到0.01秒)。第五次按下,同第三次……如此重复。 (iii)使用定时器进行准确的计时。Arduino上再加1个按钮,此按钮按下时,秒针归零。全部重新开始。
时间: 2023-12-10 21:42:56 浏览: 130
只需使用Arduino即可获得准确的时钟
好的,这个任务可以分为几个步骤来完成:
1. 连接LCD显示屏ili9341到Arduino,确保能够正常控制屏幕显示。
2. 编写程序,在屏幕上显示一个时钟表盘,包含12个刻度和对应的1~12数字,以及一个秒针。
3. 连接按钮到Arduino,编写程序实现按下按钮后开始计时、暂停计时、继续计时、归零等功能。
4. 使用定时器进行准确的计时。
下面我将逐步介绍如何完成这个任务。
1. 连接LCD显示屏ili9341到Arduino
首先,要连接LCD显示屏ili9341到Arduino,需要按照ili9341的引脚定义来连接。具体的连接方式可以参考一些教程或者数据手册。
连接完成后,可以通过在Arduino上运行一些LCD测试示例程序来测试LCD显示屏是否能够正常工作。
2. 编写程序,在屏幕上显示一个时钟表盘
要实现在屏幕上显示一个时钟表盘,可以通过在屏幕上绘制直线、圆形和数字来实现。具体的代码可以参考以下示例:
```C++
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#define TFT_DC 9
#define TFT_CS 10
#define TFT_RST 8
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
void setup() {
tft.begin();
tft.setRotation(3);
}
void loop() {
// 绘制表盘
tft.fillScreen(ILI9341_BLACK);
tft.fillCircle(120, 120, 110, ILI9341_WHITE);
for (int i = 0; i < 12; i++) {
float angle = i * 30.0;
int x1 = 120 + sin(angle * PI / 180.0) * 100;
int y1 = 120 - cos(angle * PI / 180.0) * 100;
int x2 = 120 + sin(angle * PI / 180.0) * 90;
int y2 = 120 - cos(angle * PI / 180.0) * 90;
tft.drawLine(x1, y1, x2, y2, ILI9341_WHITE);
}
for (int i = 1; i <= 12; i++) {
float angle = (i - 3) * 30.0;
int x = 120 + sin(angle * PI / 180.0) * 80;
int y = 120 - cos(angle * PI / 180.0) * 80;
tft.setCursor(x - 5, y - 5);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.print(i);
}
// 绘制秒针
float angle = 270.0;
int x1 = 120 + sin(angle * PI / 180.0) * 80;
int y1 = 120 - cos(angle * PI / 180.0) * 80;
int x2 = 120 + sin(angle * PI / 180.0) * 70;
int y2 = 120 - cos(angle * PI / 180.0) * 70;
tft.drawLine(x1, y1, x2, y2, ILI9341_RED);
delay(1000);
}
```
这段代码可以实现在屏幕上显示一个时钟表盘,并且秒针每隔一秒钟会转动一下。
3. 连接按钮到Arduino,编写程序实现按下按钮后开始计时、暂停计时、继续计时、归零等功能
要实现按下按钮后开始计时、暂停计时、继续计时、归零等功能,可以使用Arduino中的中断来实现。具体的代码可以参考以下示例:
```C++
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#define TFT_DC 9
#define TFT_CS 10
#define TFT_RST 8
#define BUTTON_PIN 2
volatile boolean start_timing = false;
volatile boolean pause_timing = false;
volatile unsigned long elapsed_time = 0;
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
void setup() {
tft.begin();
tft.setRotation(3);
pinMode(BUTTON_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), button_interrupt, CHANGE);
}
void loop() {
// 绘制表盘
tft.fillScreen(ILI9341_BLACK);
tft.fillCircle(120, 120, 110, ILI9341_WHITE);
for (int i = 0; i < 12; i++) {
float angle = i * 30.0;
int x1 = 120 + sin(angle * PI / 180.0) * 100;
int y1 = 120 - cos(angle * PI / 180.0) * 100;
int x2 = 120 + sin(angle * PI / 180.0) * 90;
int y2 = 120 - cos(angle * PI / 180.0) * 90;
tft.drawLine(x1, y1, x2, y2, ILI9341_WHITE);
}
for (int i = 1; i <= 12; i++) {
float angle = (i - 3) * 30.0;
int x = 120 + sin(angle * PI / 180.0) * 80;
int y = 120 - cos(angle * PI / 180.0) * 80;
tft.setCursor(x - 5, y - 5);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.print(i);
}
// 绘制秒针
float angle = 270.0;
int x1 = 120 + sin(angle * PI / 180.0) * 80;
int y1 = 120 - cos(angle * PI / 180.0) * 80;
int x2 = 120 + sin(angle * PI / 180.0) * 70;
int y2 = 120 - cos(angle * PI / 180.0) * 70;
tft.drawLine(x1, y1, x2, y2, ILI9341_RED);
// 计时
if (start_timing) {
if (!pause_timing) {
elapsed_time += 1000;
}
int seconds = elapsed_time / 1000;
int milliseconds = (elapsed_time % 1000) / 10;
tft.setCursor(10, 240);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.print("Elapsed Time: ");
tft.print(seconds);
tft.print(".");
if (milliseconds < 10) {
tft.print("0");
}
tft.print(milliseconds);
}
delay(1000);
}
void button_interrupt() {
static unsigned long last_interrupt_time = 0;
unsigned long interrupt_time = millis();
if (interrupt_time - last_interrupt_time > 200) {
if (digitalRead(BUTTON_PIN) == LOW) {
// 按钮按下
if (!start_timing) {
start_timing = true;
pause_timing = false;
elapsed_time = 0;
} else {
pause_timing = !pause_timing;
}
}
}
last_interrupt_time = interrupt_time;
}
```
这段代码可以实现在屏幕上显示一个时钟表盘,并且在按钮按下后开始计时、暂停计时、继续计时、归零等功能。
4. 使用定时器进行准确的计时
要使用定时器进行准确的计时,可以使用Arduino的计时器库。具体的代码可以参考以下示例:
```C++
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <TimerOne.h>
#define TFT_DC 9
#define TFT_CS 10
#define TFT_RST 8
#define BUTTON_PIN 2
volatile boolean start_timing = false;
volatile boolean pause_timing = false;
volatile unsigned long elapsed_time = 0;
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
void setup() {
tft.begin();
tft.setRotation(3);
pinMode(BUTTON_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), button_interrupt, CHANGE);
Timer1.initialize(10000);
Timer1.attachInterrupt(timer_interrupt);
}
void loop() {
// 绘制表盘
tft.fillScreen(ILI9341_BLACK);
tft.fillCircle(120, 120, 110, ILI9341_WHITE);
for (int i = 0; i < 12; i++) {
float angle = i * 30.0;
int x1 = 120 + sin(angle * PI / 180.0) * 100;
int y1 = 120 - cos(angle * PI / 180.0) * 100;
int x2 = 120 + sin(angle * PI / 180.0) * 90;
int y2 = 120 - cos(angle * PI / 180.0) * 90;
tft.drawLine(x1, y1, x2, y2, ILI9341_WHITE);
}
for (int i = 1; i <= 12; i++) {
float angle = (i - 3) * 30.0;
int x = 120 + sin(angle * PI / 180.0) * 80;
int y = 120 - cos(angle * PI / 180.0) * 80;
tft.setCursor(x - 5, y - 5);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.print(i);
}
// 绘制秒针
float angle = 270.0;
int x1 = 120 + sin(angle * PI / 180.0) * 80;
int y1 = 120 - cos(angle * PI / 180.0) * 80;
int x2 = 120 + sin(angle * PI / 180.0) * 70;
int y2 = 120 - cos(angle * PI / 180.0) * 70;
tft.drawLine(x1, y1, x2, y2, ILI9341_RED);
// 计时
if (start_timing) {
if (!pause_timing) {
elapsed_time += 10000;
}
int seconds = elapsed_time / 1000000;
int milliseconds = (elapsed_time % 1000000) / 10000;
tft.setCursor(10, 240);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.print("Elapsed Time: ");
tft.print(seconds);
tft.print(".");
if (milliseconds < 10) {
tft.print("0");
}
tft.print(milliseconds);
}
delay(1000);
}
void button_interrupt() {
static unsigned long last_interrupt_time = 0;
unsigned long interrupt_time = millis();
if (interrupt_time - last_interrupt_time > 200) {
if (digitalRead(BUTTON_PIN) == LOW) {
// 按钮按下
if (!start_timing) {
start_timing = true;
pause_timing = false;
elapsed_time = 0;
} else {
pause_timing = !pause_timing;
}
}
}
last_interrupt_time = interrupt_time;
}
void timer_interrupt() {
if (start_timing && !pause_timing) {
elapsed_time += 10000;
}
}
```
这段代码可以实现在屏幕上显示一个时钟表盘,并且使用定时器进行准确的计时。秒针每隔10毫秒转动一次。当按钮按下后开始计时,秒针会以10毫秒为单位转动,并且可以暂停和继续计时。同样可以归零计时。
阅读全文