“蓝桥杯”Arduino解析-乌鸦喝水。
【要求】
“乌鸦喝水”的故事告诉我们一个道理,遇到困难的时候,要善于动脑思考,这样再困难的事情也会迎刃而解。下面请你模拟乌鸦喝水的过程。
【硬件准备】
四位数码管,红外遥控(自己选择所需按键),旋转电阻器
【原理规则】
故事梗概:一只乌鸦口渴了,发现一个装有水的瓶子,它开始时喝不到水,乌鸦衔来石子丢进瓶子,每次等到瓶子里的水面升到了瓶口,乌鸦就喝水。
(1)瓶子的最高水位为30,以数码管的左侧两位显示瓶子当前水位,右侧两位显示瓶子中的剩余水量(即还有多少水位是水);
(2)确定初始水量:瓶子中初始装有的水量用旋转电阻器实时调整数码管左侧两位数字(全量程内控制范围5-25)并用红外遥控按键“0”来确认,确认后左侧两个数字就不能再用旋转变阻器修改了;
(3)投入石头和喝水:用红外遥控的按键“1”表示乌鸦向瓶中投入能让水位升高1的石子,按键“2”代表投入了能让水位升高2的石子;按键“3”代表乌鸦喝水,每次喝掉3个水位的水;
(4)故事重来:任意时刻按红外遥控按键“4”,故事重新开始。
【编程实现】
(1)程序开始时,为瓶子确定初始水量;
(2)用红外遥控器的按键“1”和“2”模拟乌鸦向瓶内投入石子;
(3)每当瓶子满了(水位到达30)时,乌鸦可以喝水(用按键“3”模拟),每次喝水使当前水位降低3,瓶中剩余水量减3;
(4)过程2、3可重复交叉进行,且数码管实时刷新水位和水量,须注意以下情形:
1、乌鸦在把瓶中剩余的水喝光之前,可以多次喝水;
2、瓶子满时如果加石子,水会溢出(剩余水量减少,但当前水位为30);
3、瓶子不满(水位不到30)时,不可以喝水;
4、瓶子中剩余水量不能为负数,最小为0,此时喝不到水(即当前水位不再减少);
(5)任意时刻按红外遥控器按键“4”,重复过程1~4。
【评判标准】
20分:正确实现了确定初始水量的过程;
40分:在20分的标准基础上,实现了乌鸦投入石子的过程;
60分:在40分的标准基础上,至少正确实现一次喝水的过程;
80分:至少实现了一轮完整的乌鸦喝水的过程;
100分:完全符合题意,即在80分标准的基础上,实现了任意时刻重来的过程。
【程序代码】
1、Mixly代码
(1)初始化
(2)通过对电位器的值的获取,得到瓶子中的水位并显示在四位数码管的左侧
(3)通过红外遥控模块判断按下那个按键(按键“1”表示乌鸦向瓶中投入能让水位升高1的石子,按键“2”代表投入了能让水位升高2的石子;按键“3”代表乌鸦喝水,每次喝掉3个水位的水;4代表重新开始。)
(4)判断水位是否大于等于30,水位等于30后,再次投入石子,那么水会溢出剩余水量减少
2、Arduino C代码
#include <SevenSegmentTM1637.h>
#include <IRremote.h>
SevenSegmentTM1637 zhang(3,4);
int chushihua;
int chushi;
int shuwei;
boolean kaishi;
long ir_item;
IRrecv irrecv_11(11);
decode_results results_11;
void setup(){
Serial.begin(9600);
zhang.begin();
chushihua=0;
chushi=0;
shuwei=0;
kaishi=true;
irrecv_11.enableIRIn();
}
void loop(){
if (kaishi==true) {
chushihua=(map(analogRead(A0), 0, 1023, 5, 25));
zhang.print(String(chushihua)+String(" "));
if (irrecv_11.decode(&results_11)) {
ir_item=results_11.value;
String type="UNKNOWN";
String typelist[18]={"UNUSED", "RC5", "RC6", "NEC", "SONY", "PANASONIC", "JVC", "SAMSUNG", "WHYNTER", "AIWA_RC_T501", "LG", "SANYO", "MITSUBISHI", "DISH", "SHARP", "DENON", "PRONTO", "LEGO_PF"};
if(results_11.decode_type>=1&&results_11.decode_type<=17){
type=typelist[results_11.decode_type];
}
Serial.println("IR TYPE:"+type+" ");
Serial.println(ir_item,HEX);
if (ir_item==0xFF9867) {
chushi=chushihua;
shuwei=chushi;
if (String(String(chushi, DEC)).length()==1) {
zhang.clear();
zhang.print(String(shuwei)+String(String(" ")+String(chushi)));
kaishi=false;
} else {
zhang.clear();
zhang.print(String(shuwei)+String(chushi));
kaishi = false;
}
}
irrecv_11.resume();
} else {
}
} else {
if (irrecv_11.decode(&results_11)) {
ir_item=results_11.value;
String type="UNKNOWN";
String typelist[18]={"UNUSED", "RC5", "RC6", "NEC", "SONY", "PANASONIC", "JVC", "SAMSUNG", "WHYNTER", "AIWA_RC_T501", "LG", "SANYO", "MITSUBISHI", "DISH", "SHARP", "DENON", "PRONTO", "LEGO_PF"};
if(results_11.decode_type>=1&&results_11.decode_type<=17){
type=typelist[results_11.decode_type];
}
Serial.println("IR TYPE:"+type+" ");
Serial.println(ir_item,HEX);
if (ir_item==0xFFA25D) {
shuwei=shuwei+1;
} else if (ir_item==0xFF629D) {
shuwei=shuwei+2;
} else if (ir_item==0xFFE21D && shuwei == 30) {
shuwei=shuwei-3;
chushi=chushi-3;
if (chushi==0) {
chushi=0;
shuwei=27;
} else if (chushi ==-1) {
chushi=0;
shuwei=28;
} else if (chushi==-2) {
chushi=0;
shuwei=29;
} else if (chushi==-3) {
chushi=0;
shuwei=30;
}
} else if (ir_item == 0xFF22DD) {
zhang.clear();
kaishi=true;
chushi=chushihua;
shuwei=chushihua;
}
// 水位等于30后,再次投入石子,那么水会溢出剩余水量减少。
if (shuwei==31) {
chushi=chushi-1;
shuwei=30;
if (chushi<=0) {
chushi=0;
}
} else if (shuwei==32) {
chushi=chushi-2;
shuwei=30;
if (chushi<=0) {
chushi=0;
}
}
if (String(String(chushi, DEC)).length()==1) {
zhang.clear();
zhang.print(String(shuwei) + String(String(" ") + String(chushi)));
kaishi=false;
} else {
zhang.clear();
zhang.print(String(shuwei)+String(chushi));
kaishi=false;
}
irrecv_11.resume();
} else {
}
}
}

添加 家长论坛微信
全部 0条评论