【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键盘制作计算器

  • 22
    点赞
  • 182
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏小泡泡#

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值