在我寫的一篇文章【Arduino】基於4*4鍵盤製作計算器中提到了可以根據需求去設置多位數的運算。現在我來寫一篇文章詳細說明其實現過程,並在此基礎之上增添了其他功能,製作了趣味口算測試–Amazing Counting Test。
實現現象
將實現代碼燒寫至Arduino主板,會有一個啓動界面,播放動畫。動畫播放完後進入主界面,在鍵盤上按下D鍵,開始進行口算測試,回答正確,界面會提示”great-”反饋給用戶,回答錯誤,界面會提示”losing-_-”反饋給用戶,並熄滅一盞led燈。每一輪口算測試都有20道題。只有三次答錯機會,每次答錯熄滅一盞燈,若三盞燈都熄滅了,即宣部挑戰失敗,反之,則宣佈挑戰成功,重新返回主界面。
具體實現效果可以參考【Arduino創意作品】趣味口算測試
功能說明
1.隨機生成20道題(一年級口算題-100以內加減法)
2.輸入答案,系統判斷用戶計算是否正確
3.回答錯誤,熄滅一盞led燈
4.啓動界面動畫,主界面,提示用戶回答正確,提示用戶回答錯誤,挑戰成功動畫,挑戰失敗動畫
實驗準備
- Arduino 主板-1
- 麪包板-1
- 數據線-1
- LCD1602模塊-1
- 電位器-1
- Led燈-3
- 220Ω直插電阻-3
- 4x4鍵盤
- 跳線若干
連接電路
整個電路分爲三部分,一部分爲LCD1602液晶顯示電路,電路具體連接可以參考【Arduino基礎】LCD1602液晶驅動實驗;另一部分爲4*4鍵盤電路,電路具體連接可以參考【Arduino】基於4*4鍵盤製作計算器;最後一部分爲Led燈電路
實物連接圖
實驗主要代碼及說明
- 啓動界面–>以動畫效果顯示AMAZING Counting Test!
- 隨機生成計算題–>100以內加減法
- 多位數–>只要獲取到的數爲0~9,就對數進行追加,得到多位數,否則結束輸入
- 滅燈功能
- 根據系統答案,判斷輸入答案是否正確,並提示用戶是否回答正確
- 挑戰失敗動畫–>閃爍,並持續一段時間
實驗完整代碼–>由於代碼顯示不全,我只能分開寫了
#include<Keypad.h>
#include <stdio.h>
#include <string.h>
#include "DS1302.h"
#include "LiquidCrystal.h"
#define LED1 A0
#define LED2 A1
#define LED3 A2
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', '+'},
{'4', '5', '6', '-'},
{'7', '8', '9', 'C'},
{'*', '0', '=', '/'}
};
byte rowPins[ROWS] = {7, 6, 5, 4};
byte colPins[COLS] = {3, 2, A3, A4};
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);//設置接口
// Created instances
Keypad myKeypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
int firstNum ;
int secondNum ;
int result ;
int my_result;
int flag=0;
int led_num;
char operatr = ' ';
void setup() {
randomSeed(analogRead(A5));
pinMode(LED1,OUTPUT); //定義LED爲輸出引腳
pinMode(LED2,OUTPUT); //定義LED爲輸出引腳
pinMode(LED3,OUTPUT); //定義LED爲輸出引腳
Serial.begin(9600);//設置串口波特率爲9600
lcd.begin(16,2);
lcd.clear(); //清屏
delay(1000); //延時1000ms
coolshow();
lcd.clear(); //清屏
}
void coolshow(){
lcd.setCursor(0, 0) ; //設置光標位置爲第1行第1個位置
lcd.print(" A"); //使屏幕顯示文字
delay(1000);
lcd.print("M"); //使屏幕顯示文字
delay(1000);
lcd.print("A"); //使屏幕顯示文字
delay(1000);
lcd.print("Z"); //使屏幕顯示文字
delay(1000);
lcd.print("I"); //使屏幕顯示文字
delay(1000);
lcd.print("N"); //使屏幕顯示文字
delay(1000);
lcd.print("G"); //使屏幕顯示文字
lcd.setCursor(0, 1) ;
lcd.print(" Counting Test!"); //使屏幕顯示文字Button OFF
delay(5000);
}
void setLed(int num){
if(num==3){
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
}else if(num==2){
digitalWrite(LED1,LOW);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
}else if(num==1){
digitalWrite(LED1,LOW);
digitalWrite(LED2,LOW);
digitalWrite(LED3,HIGH);
}else{
digitalWrite(LED1,LOW);
digitalWrite(LED2,LOW);
digitalWrite(LED3,LOW);
}
}
void gennerator(){
int level=99;
int x=random(level)+1;
int y=random(level)+1;
if(x%2==0){
operatr = '+';
if(x>y){
result=x;
firstNum=y ;
secondNum=x-y ;
}else{
result=y;
firstNum=x;
secondNum=y-x ;
}
}else {
operatr = '-';
if(x>y){
result=x-y;
firstNum=x;
secondNum=y;
}else{
result=y-x;
firstNum=y;
secondNum=x ;
}
}
my_result=0;
}
void loop(){
lcd.setCursor(0, 0) ; //設置光標位置爲第1行第1個位置
lcd.print("Welcome!"); //使屏幕顯示文字
lcd.setCursor(0, 1) ;
lcd.print("Press D to start"); //使屏幕顯示文字Button OFF
delay(500); //延時0.1秒,這裏也就是刷新速度。
flag=0;
led_num=0;
setLed(led_num);
char newKey = myKeypad.getKey();
if(newKey != NO_KEY && newKey == '/'){
flag=1;
}
if(flag==1){
led_num=3;
setLed(led_num);
for(int i=0;i<5&&led_num!=0;i++){
gennerator();
lcd.clear(); //清屏
lcd.setCursor(0, 0) ; //設置光標位置爲第1行第1個位置
lcd.print(firstNum); //使屏幕顯示文字
lcd.print(operatr); //使屏幕顯示文字
lcd.print(secondNum); //使屏幕顯示文字
lcd.print("="); //使屏幕顯示文字
while(1){
newKey = myKeypad.getKey();
if (newKey != NO_KEY && (newKey == '1' || newKey == '2' || newKey == '3' || newKey == '4' || newKey == '5' || newKey == '6' || newKey == '7' || newKey == '8' || newKey == '9' || newKey == '0')) {
int num=newKey-48;
lcd.print(num); //使屏幕顯示文字
delay(500);
my_result=my_result*10+num;
}
if(newKey != NO_KEY && newKey == '='){
break;
}
}
lcd.setCursor(0, 1) ;
if(result==my_result){
lcd.print(" great^-^"); //使屏幕顯示文字Button OFF
delay(500);
}else{
led_num--;
setLed(led_num);
if(led_num>0){
lcd.print(" losing-_-"); //使屏幕顯示文字Button OFF
delay(500);
}
if(led_num==0){
for(int j=0;j<3;j++){
lcd.clear(); //清屏
delay(500);
lcd.setCursor(0, 0) ; //設置光標位置爲第1行第1個位置
lcd.print("----DEFEATED----"); //使屏幕顯示文字
delay(500);
}
lcd.clear(); //清屏
lcd.setCursor(0, 0) ; //設置光標位置爲第1行第1個位置
lcd.print("----DEFEATED----"); //使屏幕顯示文字
delay(2000);
lcd.clear(); //清屏
break;
}
}
}
if(led_num>0){
for(int j=0;j<3;j++){
lcd.clear(); //清屏
delay(500);
lcd.setCursor(0, 0) ; //設置光標位置爲第1行第1個位置
lcd.print("****VICTORY****"); //使屏幕顯示文字
delay(500);
}
lcd.clear(); //清屏
lcd.setCursor(0, 0) ; //設置光標位置爲第1行第1個位置
lcd.print("****VICTORY****"); //使屏幕顯示文字
delay(2000);
lcd.clear(); //清屏
}
}
}