上一篇介紹了數碼管的使用,一位數碼管可顯示數字0到9。本篇使用random()函數產生隨機數並在數碼管上進行顯示,製作一個隨機骰子。
在Arduino中,random()函數用來產生僞隨機數,可以傳入一個區間,產生此區間內的隨機數。通常情況下,在使用random()函數之前,需要使用randomSeed()來初始化隨機數生成器,指定一個隨機數種子。
1. 實驗材料
- Uno R3開發板
- 配套USB數據線
- 麪包板及配套連接線
- 共陰極數碼管
- 1個220Ω限流電阻
2. 實驗步驟
1. 根據原理圖搭建電路。
數碼管的A,B,C,D,E,F,G,DP引腳分別接入開發板的數字管腳7,6,5,10,11,8,9,4。數碼管公共端接限流電阻,電阻另一端接GND。
實驗原理圖如下圖所示:
實物連接圖如下圖所示:
2. 新建sketch,拷貝如下代碼替換自動生成的代碼並進行保存。
/*
Random
通過Random隨機顯示0到9的數字
*/
//設置控制各段的數字IO腳,具體幾號引腳對應哪一段,來源爲數碼管官方引腳圖。
int pin_a = 7;
int pin_b = 6;
int pin_c = 5;
int pin_d = 10;
int pin_e = 11;
int pin_f = 8;
int pin_g = 9;
int pin_p = 4;
int num;
//根據共陰極數碼管段碼錶定義0~9顯示的各段開關狀態
int numTable[10][8] = {
//1爲點亮,0爲關閉
//a b c d e f g dp
{1, 1, 1, 1, 1, 1, 0, 0}, //0
{0, 1, 1, 0, 0, 0, 0, 0}, //1
{1, 1, 0, 1, 1, 0, 1, 0}, //2
{1, 1, 1, 1, 0, 0, 1, 0}, //3
{0, 1, 1, 0, 0, 1, 1, 0}, //4
{1, 0, 1, 1, 0, 1, 1, 0}, //5
{1, 0, 1, 1, 1, 1, 1, 0}, //6
{1, 1, 1, 0, 0, 0, 0, 0}, //7
{1, 1, 1, 1, 1, 1, 1, 0}, //8
{1, 1, 1, 1, 0, 1, 1, 0}, //9
};
void setup()
{
for (int i = 4; i <= 11; i++)
{
pinMode(i, OUTPUT); //設置4~11引腳爲輸出模式
}
randomSeed(analogRead(0));
}
//根據索引顯示數字
void showNum(int index)
{
digitalWrite(pin_a, numTable[index][0]); //設置a 引腳的電平
digitalWrite(pin_b, numTable[index][1]); //設置b 引腳的電平
digitalWrite(pin_c, numTable[index][2]); //設置c 引腳的電平
digitalWrite(pin_d, numTable[index][3]); //設置d 引腳的電平
digitalWrite(pin_e, numTable[index][4]); //設置e 引腳的電平
digitalWrite(pin_f, numTable[index][5]); //設置f 引腳的電平
digitalWrite(pin_g, numTable[index][6]); //設置g 引腳的電平
digitalWrite(pin_p, numTable[index][7]); //設置dp引腳的電平
}
void loop()
{
num = random(10); //產生隨機數
showNum(num); //顯示隨機數
delay(500);
}
3. 連接開發板,設置好對應端口號和開發板類型,進行程序下載。
3. 實驗現象
隨機顯示0到9之間的數字。
4. 函數介紹
random()
- 描述:生成僞隨機數。
- 函數原型:
- random(max)
- random(min,max)
- 參數:
- min: 隨機數區間下限值,且包括在內。此參數可選,省略則從0開始。
- max: 隨機數區間上限值,且不包括在內。
- 返回值:min和max-1之間的隨機數。
randomSeed()
- 描述:初始化隨機數生成器。
- 函數原型:randomSeed(seed)
- 參數:用於初始化僞隨機序列的數字,隨機數種子。
- 返回值:沒有。
5. 實驗分析
程序中通過randomSeed()函數來初始化隨機數生成器。當模擬管腳0懸空時,使用analogRead(0)讀取到的是不確定的模擬噪聲,用它來做隨機種子,可獲取到更加理想的隨機數。在使用random()函數時,參數中區間上限是不包括在內的。比如想生成[10,20]之間的隨機數,則應該這樣寫:random(10,21)。