From d56ea0dab0b8ca32e1c3ddc7afc643a73482d4c1 Mon Sep 17 00:00:00 2001 From: wancat Date: Wed, 16 Mar 2022 10:54:01 +0800 Subject: [PATCH] Week 4 --- week4-1/week4-1.ino | 17 ++++++ week4-2/week4-2.ino | 21 +++++++ week4-3/week4-3.ino | 25 +++++++++ week4-4/week4-4.ino | 130 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 193 insertions(+) create mode 100644 week4-1/week4-1.ino create mode 100644 week4-2/week4-2.ino create mode 100644 week4-3/week4-3.ino create mode 100644 week4-4/week4-4.ino diff --git a/week4-1/week4-1.ino b/week4-1/week4-1.ino new file mode 100644 index 0000000..bb16957 --- /dev/null +++ b/week4-1/week4-1.ino @@ -0,0 +1,17 @@ +const int LED[] = {11, 10, 9, 8, 7, 6, 5, 4}; + +void setup() { + for (int i = 0; i < 8; i++) { + pinMode(LED[i], OUTPUT); + digitalWrite(LED[i], HIGH); + } +} + +void loop() { + static bool clk = 0; + for (int i = 0; i < 8; i++) { + digitalWrite(LED[i], i % 2 == clk); + } + delay(250); + clk = !clk; +} diff --git a/week4-2/week4-2.ino b/week4-2/week4-2.ino new file mode 100644 index 0000000..a0baeaf --- /dev/null +++ b/week4-2/week4-2.ino @@ -0,0 +1,21 @@ +const int LED[] = {11, 10, 9, 8, 7, 6, 5, 4}; + +void setup() { + for (int i = 0; i < 9; i++) { + pinMode(LED[i], OUTPUT); + digitalWrite(LED[i], HIGH); + } +} + +void loop() { + for (int i = 0; i < 9; i++) { + digitalWrite(LED[i], LOW); + delay(100); + digitalWrite(LED[i-2], HIGH); + } + for (int i = 0; i < 8; i++) { + digitalWrite(LED[6-i], LOW); + delay(100); + digitalWrite(LED[8-i], HIGH); + } +} diff --git a/week4-3/week4-3.ino b/week4-3/week4-3.ino new file mode 100644 index 0000000..decb5b3 --- /dev/null +++ b/week4-3/week4-3.ino @@ -0,0 +1,25 @@ +const int LED[] = {11, 10, 9, 8, 7, 6, 5, 4}; + +void setup() { + for (int i = 0; i < 9; i++) { + pinMode(LED[i], OUTPUT); + digitalWrite(LED[i], HIGH); + } +} + +void loop() { + for (int i = 0; i < 3; i++) { + digitalWrite(LED[3-i], LOW); + digitalWrite(LED[4+i], LOW); + delay(100); + digitalWrite(LED[3-i], HIGH); + digitalWrite(LED[4+i], HIGH); + } + for (int i = 0; i < 3; i++) { + digitalWrite(LED[i], LOW); + digitalWrite(LED[7-i], LOW); + delay(100); + digitalWrite(LED[i], HIGH); + digitalWrite(LED[7-i], HIGH); + } +} diff --git a/week4-4/week4-4.ino b/week4-4/week4-4.ino new file mode 100644 index 0000000..9836f6a --- /dev/null +++ b/week4-4/week4-4.ino @@ -0,0 +1,130 @@ +#define DELAY 200 + +const int LED[] = {11, 10, 9, 8, 7, 6, 5, 4}; +const int BUTTON[] = {A0, A1, A2, A3}; + +int clk = 0; // 定義每個模式中的計數器 + +void setup() { + for (int i = 0; i < 8; i++) { + pinMode(LED[i], OUTPUT); + digitalWrite(LED[i], HIGH); + } + for (int i = 0; i < 4; i++) { + pinMode(BUTTON[i], INPUT); + } +} + +void call_interval( void (*f)(unsigned int) ) { + static unsigned long checkpoint = 0; + if (millis() - checkpoint > DELAY) { + for (int i = 0; i < 8; i++) { + digitalWrite(LED[7 - i], !((value >> i) % 2)); + } + clk += 1; + checkpoint = millis(); + } +} + +/* + * Function: get_mode + * Return the current mode from buttons input + * + * Side effects: reset the clk on button pressed + */ +unsigned int get_mode() { + static int last = 0; + for (int i = 0; i < 4; i++) { + if (!digitalRead(BUTTON[i])) { + last = i + 1; + clk = 0; + return last; + } + } + return last; +} + +/* + * Function: binary + * Display the LED as binary of clk + * + * increase clk per DELAY + * Side effect: increase clk per DELAY + */ +void binary(unsigned int value) { + static unsigned long checkpoint = 0; + if (millis() - checkpoint > DELAY) { + for (int i = 0; i < 8; i++) { + digitalWrite(LED[7 - i], !((value >> i) % 2)); + } + clk += 1; + checkpoint = millis(); + } +} + +void gray_code(unsigned int value) { + binary(value ^ (value >> 1)); +} + +/* + * Function: random_popup + * Randomly blink LED + * + * Randomly select LED. Each LED will turn on for 3 clk + * Side effect: increase clk per DELAY + */ +void random_popup() { + static unsigned long checkpoint = 0; + static int hp[] = {0, 0, 0, 0, 0, 0, 0, 0}; + + // Reset hp on mode changing + if (clk == 0) { + for (int i = 0; i < 8; i++) { + hp[i] = 0; + } + } + + if (millis() - checkpoint > DELAY) { + for (int i = 0; i < 8; i++) { + + // Decrease hp + if (hp[i] > 0) { + hp[i] -= 1; + } + digitalWrite(LED[i], !(hp[i])); + } + + // randomly select LED which is not turned on + int choice; + do { + choice = random(8); + } while (hp[choice] > 0); + hp[choice] = 4; + + checkpoint = millis(); + clk++; + } +} + +void clear_all() { + for (int i = 0; i < 8; i++) { + digitalWrite(LED[i], HIGH); + } +} + +void loop() { + const int mode = get_mode(); + if (mode == 1) { + binary(clk); + } + if (mode == 2) { + gray_code(clk); + } + if (mode == 3) { + random_popup(); + } + if (mode == 4) { + clear_all(); + } + delay(1); +}