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