Arduino: 7 segment display (七段顯示器)

若要顯示3,則讓abgcd,五支腳位通電
=> 把全部腳位接線,以2~10接上控制線,再以function形式呈現1234567890
=> 接好控制線後,不做任何控制(HIGH or LOW),預設是全亮,所以會顯示8

– 為什麼當我們 digitalWrite(a, HIGH) 時,a卻是暗掉的呢?
=>
七段顯示器有共陽or共陰兩種,

此例就是共陽
所以當我們想要哪支腳位不亮,就把那支腳位設為HIGH,使他與高電位同電位,就不會有電流通過,即斷路,自然不會亮。
example:

int dp = 2;
int c = 3;
int d = 4;
int e = 5;
int b = 6;
int a = 7;
int f = 8;
int g = 9;

// the setup routine runs once when you press reset:
void setup() {
  // initialize the digital pin as an output.
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
}

void show0(){
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, HIGH);
}
void show1(){
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}
void show2(){
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, LOW);
}
void show3(){
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, LOW);
}
void show4(){
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
}
void show5(){
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, HIGH);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
}
void show6(){
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
}
void show7(){
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}
void show8(){
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
}
void show9(){
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, HIGH);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
}

void setNumber(int number){
  switch(number){
  case 0: show0(); break;
  case 1: show1(); break;
  case 2: show2(); break;
  case 3: show3(); break;
    case 4: show4(); break;
    case 5: show5(); break;
    case 6: show6(); break;
    case 7: show7(); break;
    case 8: show8(); break;
    case 9: show9(); break;
  default: Serial.println(“Error”);
  }
}

// the loop routine runs over and over again forever:
void loop() {
  setNumber(1);
  delay(1000);
  setNumber(2);
  delay(1000);
  setNumber(3);
  delay(1000);
  setNumber(4);
  delay(1000);
  setNumber(5);
  delay(1000);
  setNumber(6);
  delay(1000);
  setNumber(7);
  delay(1000);
  setNumber(8);
  delay(1000);
  setNumber(9);
  delay(1000);
}



————————-

兩位數七段顯示器
 

Arduino Buzzer

int buzz= 13;
int low[]= {0, 1908, 1701, 1515, 1433, 1276, 1136, 1012};
int middle[]= {0, }
int high[]= {0, }

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(buzz, OUTPUT);
}

void play(int tone, unsigned long howlong){
  unsigned long time= millis();
  
  while(millis() – time < howlong){
    digitalWrite(buzz, HIGH);
    delayMicroseconds(low[tone]);
    digitalWrite(buzz, LOW);
    delayMicroseconds(low[tone]);
  }
  delay(10);
};

void play_little_apple(){
  play(1, 250);
  play(1, 250);
  play(5, 250);
  play(5, 250);
  play(6, 250);
  play(6, 250);
  play(5, 250);


  play(4, 250);
  play(4, 250);
  play(3, 250);
  play(3, 250);
  play(2, 250);
  play(2, 250);
  play(1, 250);

  
}

void loop() {
  // put your main code here, to run repeatedly:
  play_little_apple(); 
}


excel 算音階對應到的頻率
=ROUND(1/E2/2*1000000,0)

Arduino practice: 小型打地鼠

1. 以arduino實做一個打地鼠小遊戲,Serial序列顯示分數(可用七段顯示器或LCD替換顯示分數方式),每3秒隨機一個LED發亮,玩家需要在三秒內按到該發亮LED對應的按鈕才算得分,成功得一分,失敗則扣一分。

2. 電路圖:

3. 程式碼:

// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led1 = 2;
int led2= 3;
int led3= 4;
int led4= 5;
int led5= 6;
int button1 = 8;
int button2 = 9;
int button3 = 10;
int button4 = 11;
int button5 = 12;
static int score=0;
int keyValue=0;

// the setup routine runs once when you press reset:
void setup() {
  Serial.begin(9600);
  // initialize the digital pin as an output.
  pinMode(led1,OUTPUT);
  pinMode(led2,OUTPUT);
  pinMode(led3,OUTPUT);
  pinMode(led4 ,OUTPUT);
  pinMode(led5 ,OUTPUT);
  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
  pinMode(button3, INPUT);
  pinMode(button4, INPUT);
  pinMode(button5, INPUT);
  initial();
}
void initial(){
 digitalWrite(led1,LOW); 
 digitalWrite(led2,LOW); 
 digitalWrite(led3,LOW); 
 digitalWrite(led4,LOW); 
 digitalWrite(led5,LOW); 
 Serial.println(“—–Welcome to Whack-a-mole Game!—–“);
}


// the loop routine runs over and over again forever:
void loop() {
  
  int a = random(2,7);      //隨機選取五個LED之一發亮
  digitalWrite(a, HIGH);  

  unsigned long time = millis();
  while( millis()-time < 3000){    // 三秒換一次LED發亮
    keyValue= digitalRead(a+6);
    if(keyValue){
    break;
    }
  //Serial.println(keyValue);
  delay(10);
  }
  
  if(keyValue){
      score++;
  }else{
      score–;
  }
  digitalWrite(a, LOW);
  Serial.print(“Score: “);
  Serial.println(score);
}


參考:
1. Autodesk circuit: (提供接線、coding模擬,功能完整,使用上方便,不會有爆炸危險XD)
https://circuits.io/circuits/

Network Security(一)

nslookup: 查DNS,也就是說可以把網址丟進去查IP  => 替代指令: dig
1. nslookup [OPTIONs] HOST [SERVER]-debug
-d2
-port=VALUE
-type=VALUE
A: IPv4
AAAA: IPv6
A+AAAA: 同時IPv4 + IPv6
NS: 查Name Server(當然HOST也要填入name server)
PTR: 查HOST對應到的domain name, 也就是IP轉出URL
CNAME: 查HOST的別名
ps. 某些URL會對應多組IP,所以建議先查出IP

dig: 查DNS
2. dig [@SERVER] {Q_OPTIONs} {D-OPTIONs} HOST

Learn about bash? shell? (二)

8. 環境變數?自訂變數?
– 自訂變數只能在當個process使用
ex. 我在終端機裡面設定
=> variable=”hello”
=> echo $variable
會跑出 hello
但是開了別的終端機時,echo $variable,就沒東西囉
ps. 即使在同一個終端機下,終端機的child process也讀取不到$variable
=> 利用export variable
能夠使同一個終端機下的child process也能使用$variable
但開啟別的終端機,還是無法使用$variable

有關環境變數問題集:
1. 到底有哪些變數是環境變數?
2. 自訂變數export後就是環境變數了嗎?
3. 如何讓自訂變數能夠永久存在?
4. PS1是環境變數嗎?

9.

Learn about bash? shell? (一)

1. 什麼是shell?
=> 

在system call之外的應用程式,都是shell(廣義)

2. 什麼是bash?
常聽到的 Bourne SHell (sh) 、在 Sun 裡頭預設的 C SHell、 商業上常用的 K SHell、, 還有 TCSH 等等,每一種 Shell 都各有其特點
-> Bourne Again SHell (簡稱 bash)

3. 為什麼要用bash?
優點:
1) 能查詢history(之前在資工系用的工作站就不支援查詢,每次指令都要重打,超煩XD)
=> less ~/.bash_history
裡面有之前輸入過的指令(被駭客取得root權限後,查看裡面就可能得知某某伺服器帳密)

2) tab補足指令或檔案名稱(完全是福音,使用沒有tab補足功能的shell會死掉哈哈)
tab按一下:補足指令或檔名
tab按兩下:顯示接下來有哪些選項是符合的

3) alias指令別名(可以把常使用的指令設成更簡單好懂好打的方式)
=> alias lm = ‘ls -al’

4) job control, background, foreground

5) shell script 程式化腳本(批次檔的感覺,把一連串的連續指令寫成script,之後只要執行script就不用一行一行keyin)

6) wildcard 萬用字元

4. 查詢某指令是否為bash shell內建命令
-> type [-tpa] command
ex. type -t ls

herongsendeMacBook-Air:~ RongSonHo$ type -t ls
file

顯示file -> 外部命令
顯示alias -> 別名
顯示builtin -> 內建命令
-p: 若command為外部命令時,會顯示完整檔案路徑

herongsendeMacBook-Air:~ RongSonHo$ type -p ls
/bin/ls

-a: 把$PATH中,含有command的指令都列出來
ex. type -a pwd

herongsendeMacBook-Air:~ RongSonHo$ type -a pwd
pwd is a shell builtin

pwd is /bin/pwd

ps. which指令,也有類似的功能哦

5. $PATH 環境變數在幹麻的?
=> 當我們在終端機輸入指令後,shell會到$PATH中的資料夾中尋找相對應的指令,若找不到指令就執行不了。

herongsendeMacBook-Air:~ RongSonHo$ echo $PATH
/Users/RongSonHo/.rbenv/shims:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

6. 如何改變命令提示字元的預設顯示呢?
herongsendeMacBook-Air:~ RongSonHo$ 
改變PS1這個環境變數
我的PS1長這樣:

herongsendeMacBook-Air:~ RongSonHo$ echo $PS1
h:W u$



但直接修改PS1只會在當個tty改變

7. 如何永久改變PS1?
=> cd ~
=> ls -a
=> vim .bash_profile
=>

if which rbenv > /dev/null; then eval “$(rbenv init -)”; fi
export PS1='[就決定是你了,帥榮森! t: W ]$ ‘

參考:
1. 鳥哥:
http://linux.vbird.org/linux_basic/0320bash.php#ps2

LinkedList practice in C

1. single (direction) linked list:

– linkedlist.c:

#include <stdio.h>
#include <stdlib.h>

typedef struct ns{
int data;
struct ns* next;
}node;

node* create_node(int);
void insert_node(node*, node*);
void remove_node(node*);
void print_lists(node*);
void free_lists(node*);


node* create_node(int data){
node* n = (node*) malloc(sizeof(node));
n->data = data;
n->next = NULL;

return n;
}

void insert_node(node* n1, node* n2){
n2->next = n1->next;
n1->next = n2;
}

void remove_node(node* n1){
n1->next = n1->next->next;
}

void print_lists(node* lists){
node* n = lists;

while(n!=NULL){
printf(“%d”, n->data);
n = n->next;
}
printf(“n”);
}

void free_lists(node* lists){
if(lists->next != NULL){
free_lists(lists->next);
}
free(lists);
}


– main.c:

#include “linkedlist.c”

int main(void){
printf(“Hello worldn”);

node* singleLinkedListHead = create_node(9);

for(int i=0; i<10; i++){
node *tempNode = create_node(i);
insert_node(singleLinkedListHead, tempNode);
}

print_lists(singleLinkedListHead);
return 0;

}

2. double (direction) linked list :
– 
參考:
1. Infinite Loop:「演算」連結串列:
http://program-lover.blogspot.tw/2008/05/linked-list.html
2. [資料結構]教學:
http://notepad.yehyeh.net/Content/DS/CH04/3.php