【Arduino創意】基於計算器(多位數)製作趣味口算測試

在我寫的一篇文章【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(); //清屏
    }
  }
}

相關文章
【Arduino】基於4*4鍵盤製作計算器

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章