Compare commits

...

3 Commits

Author SHA1 Message Date
wancat
6b661f1d48 Week 5 2022-03-23 12:05:25 +08:00
wancat
d56ea0dab0 Week 4 2022-03-16 10:54:01 +08:00
wancat
7cf9de2f1d Week3 2022-03-09 11:21:32 +08:00
10 changed files with 460 additions and 0 deletions

20
week3-2/week3-2.ino Normal file
View File

@@ -0,0 +1,20 @@
#define LED 7
#define pbOn A0
#define pbOff A1
void setup() {
pinMode(LED, OUTPUT);
pinMode(pbOn, INPUT);
pinMode(pbOff, INPUT);
}
void loop() {
if (!digitalRead(pbOff)) {
digitalWrite(LED, HIGH);
while (!digitalRead(pbOff));
}
else if (!digitalRead(pbOn)) {
digitalWrite(LED, LOW);
while (!digitalRead(pbOn));
}
}

32
week3-3/week3-3.ino Normal file
View File

@@ -0,0 +1,32 @@
#define LED 7
#define BUTTON A0
#define BLINK 8
#define DELAY 100
void setup() {
pinMode(LED, OUTPUT);
pinMode(BUTTON, INPUT);
pinMode(BLINK, OUTPUT);
}
bool mode() {
static bool last = HIGH;
static bool m = HIGH;
if (last && !digitalRead(BUTTON)) {
m = !m;
}
last = digitalRead(BUTTON);
return m;
}
void loop() {
static unsigned long clk = 0;
static bool blinkValue = HIGH;
digitalWrite(LED, mode());
if (millis() - clk > DELAY) {
blinkValue = !blinkValue;
clk = millis();
}
digitalWrite(BLINK, blinkValue);
delay(1);
}

17
week4-1/week4-1.ino Normal file
View File

@@ -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;
}

21
week4-2/week4-2.ino Normal file
View File

@@ -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);
}
}

25
week4-3/week4-3.ino Normal file
View File

@@ -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);
}
}

118
week4-4/week4-4.ino Normal file
View File

@@ -0,0 +1,118 @@
#define DELAY 200
const int LED[] = {11, 10, 9, 8, 7, 6, 5, 4};
const int BUTTON[] = {A0, A1, A2, A3};
unsigned int clk = 0; // the counter in every mode
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);
}
}
/*
* Function: call_interval
* Call a function per DELAY
*
* f: the function being called
*
* Side effect: increase clk per DELAY
*/
void call_interval( void (*f)(unsigned int) ) {
static unsigned long checkpoint = 0;
if (millis() - checkpoint > DELAY) {
(*f)(clk);
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
*/
void binary(unsigned int value) {
for (int i = 0; i < 8; i++) {
digitalWrite(LED[7 - i], !((value >> i) % 2));
}
}
void gray_code(unsigned int value) {
binary(value ^ (value >> 1));
}
/*
Function: random_popup
Randomly select LED. Each LED will be turned on for 3 clk
*/
void random_popup(unsigned int clk) {
static int hp[8];
// Reset hp on mode changing
if (clk == 0) {
for (int i = 0; i < 8; i++) {
hp[i] = 0;
}
}
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;
}
void clear_all() {
for (int i = 0; i < 8; i++) {
digitalWrite(LED[i], HIGH);
}
}
void loop() {
const int mode = get_mode();
if (mode == 1) {
call_interval(binary);
}
if (mode == 2) {
call_interval(gray_code);
}
if (mode == 3) {
call_interval(random_popup);
}
if (mode == 4) {
clear_all();
}
delay(1);
}

45
week5-1/week5-1.ino Normal file
View File

@@ -0,0 +1,45 @@
const unsigned int scan[] = {5, 6, 7, 8};
#define DATA 10
#define LATCH 11
#define CLK 12
byte numbers[] = {
0xC0, 0xF9, 0xA4, 0xB0, 0x99,
0x92, 0x82, 0xF8, 0x80, 0x90
};
void setup() {
for (int i = 0; i < 4; i++) {
pinMode(scan[i], OUTPUT);
digitalWrite(scan[i], HIGH);
}
pinMode(DATA, OUTPUT);
pinMode(LATCH, OUTPUT);
pinMode(CLK, OUTPUT);
}
void setDigits(int number, int digits[4]) {
for (int i = 0; i < 4; i++) {
digits[i] = number % 10;
number /= 10;
}
}
void loop() {
static int number = 0;
static unsigned long checkpoint = 0;
static int digits[4];
for (int i = 0; i < 4; i++) {
digitalWrite(LATCH, LOW);
shiftOut(DATA, CLK, MSBFIRST, numbers[digits[i]]);
digitalWrite(LATCH, HIGH);
digitalWrite(scan[i], LOW);
delay(1);
digitalWrite(scan[i], HIGH);
}
if (millis() - checkpoint > 200) {
number++;
setDigits(number, digits);
checkpoint = millis();
}
}

50
week5-3/week5-3.ino Normal file
View File

@@ -0,0 +1,50 @@
const unsigned int scan[] = {5, 6, 7, 8};
#define DATA 10
#define LATCH 11
#define CLK 12
const int date[] = {2022, 323};
byte numbers[] = {
0xC0, 0xF9, 0xA4, 0xB0, 0x99,
0x92, 0x82, 0xF8, 0x80, 0x90
};
void setup() {
for (int i = 0; i < 4; i++) {
pinMode(scan[i], OUTPUT);
digitalWrite(scan[i], HIGH);
}
pinMode(DATA, OUTPUT);
pinMode(LATCH, OUTPUT);
pinMode(CLK, OUTPUT);
}
void setDigits(int number, int digits[4]) {
for (int i = 0; i < 4; i++) {
digits[i] = number % 10;
number /= 10;
}
}
void show(int digits[4]) {
for (int i = 0; i < 4; i++) {
digitalWrite(LATCH, LOW);
shiftOut(DATA, CLK, MSBFIRST, numbers[digits[i]]);
digitalWrite(LATCH, HIGH);
digitalWrite(scan[i], LOW);
delay(1);
digitalWrite(scan[i], HIGH);
}
}
void loop() {
static unsigned long checkpoint = 0;
static int digits[4];
static bool mode = false;
show(digits);
if (millis() - checkpoint > 500) {
mode = !mode;
setDigits(date[mode], digits);
checkpoint = millis();
}
}

42
week5-4/week5-4.ino Normal file
View File

@@ -0,0 +1,42 @@
const unsigned int scan[] = {5, 6, 7, 8};
#define DATA 10
#define LATCH 11
#define CLK 12
byte numbers[] = {
0xC0, 0xF9, 0xA4, 0xB0, 0x99,
0x92, 0x82, 0xF8, 0x80, 0x90
};
void setup() {
for (int i = 0; i < 4; i++) {
pinMode(scan[i], OUTPUT);
digitalWrite(scan[i], HIGH);
}
pinMode(DATA, OUTPUT);
pinMode(LATCH, OUTPUT);
pinMode(CLK, OUTPUT);
}
void show(int digits[10], int shift) {
for (int i = 0; i < 4; i++) {
digitalWrite(LATCH, LOW);
shiftOut(DATA, CLK, MSBFIRST, numbers[digits[(shift + i) % 10]]);
digitalWrite(LATCH, HIGH);
digitalWrite(scan[3-i], LOW);
delay(1);
digitalWrite(scan[3-i], HIGH);
}
}
void loop() {
static unsigned long checkpoint = 0;
static int digits[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
static int count = 0;
show(digits, count);
if (millis() - checkpoint > 500) {
count--;
if (count < 0) count = 9;
checkpoint = millis();
}
}

90
week5-5/week5-5.ino Normal file
View File

@@ -0,0 +1,90 @@
const unsigned int scan[] = {5, 6, 7, 8};
const unsigned int LED[] = {9, 13, 2, 3};
const unsigned int BUTTON[] = {A0, A1};
#define DATA 10
#define LATCH 11
#define CLK 12
void setup() {
for (int i = 0; i < 4; i++) {
pinMode(scan[i], OUTPUT);
digitalWrite(scan[i], HIGH);
}
for (int i = 0; i < 4; i++) {
pinMode(LED[i], OUTPUT);
digitalWrite(LED[i], HIGH);
}
for (int i = 0; i < 2; i++) {
pinMode(BUTTON[i], INPUT);
}
pinMode(DATA, OUTPUT);
pinMode(LATCH, OUTPUT);
pinMode(CLK, OUTPUT);
}
int get_mode() {
static int last = 0;
for (int i = 0; i < 2; i++) {
if (!digitalRead(BUTTON[i])) {
last = i+1;
return last;
}
}
return last;
}
void show(byte digits[4]) {
for (int i = 0; i < 4; i++) {
digitalWrite(LATCH, LOW);
shiftOut(DATA, CLK, MSBFIRST, ~digits[i]);
digitalWrite(LATCH, HIGH);
digitalWrite(scan[3 - i], LOW);
delay(1);
digitalWrite(scan[3 - i], HIGH);
}
}
void mode_display() {
static byte digits[4];
static byte p = 0;
static unsigned long checkpoint = 0;
show(digits);
if (millis() - checkpoint > 200) {
if (p == 4) {
// all the numbers are turned on, reset
p = 0;
for (int i = 0; i < 4; i++) digits[i] = 0;
}
digits[p] <<= 1;
digits[p] += 1;
if (digits[p] == 0xFF) {
// if current digit is full, change to the next one
p++;
}
checkpoint = millis();
}
}
void mode_led() {
static unsigned long checkpoint;
static int c = 0;
if (millis() - checkpoint > 200) {
for (int i = 0; i < 4; i++) {
digitalWrite(LED[i], i != c%4);
}
c++;
checkpoint = millis();
}
}
void loop() {
switch (get_mode()) {
case 1:
mode_display();
break;
case 2:
mode_led();
break;
}
}