“蓝桥杯”Arduino解析-乌鸦喝水。

梁老师
梁老师 北京小升初老师~

0 人点赞了该文章 · 63 浏览





【要求】

“乌鸦喝水”的故事告诉我们一个道理,遇到困难的时候,要善于动脑思考,这样再困难的事情也会迎刃而解。下面请你模拟乌鸦喝水的过程。

【硬件准备】

四位数码管,红外遥控(自己选择所需按键),旋转电阻器

【原理规则】

故事梗概:一只乌鸦口渴了,发现一个装有水的瓶子,它开始时喝不到水,乌鸦衔来石子丢进瓶子,每次等到瓶子里的水面升到了瓶口,乌鸦就喝水。

(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 { } }}

图片


添加 家长论坛微信 



发布于 2024-04-26 15:29

免责声明:

本文由 梁老师 原创发布于 家长帮 ,著作权归作者所有。

登录一下,更多精彩内容等你发现,贡献精彩回答,参与评论互动

登录! 还没有账号?去注册

暂无评论

广告
All Rights Reserved Powered BY WeCenter V4.1.0 © 2025 京ICP备20005761号-2