“蓝桥杯”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条评论