查看: 1800|回复: 2

肺活量大比赛

[复制链接]
  • TA的每日心情
    开心
    2019-1-20 16:41
  • 签到天数: 56 天

    [LV.5]常住居民I

    发表于 2018-4-2 22:50 | 显示全部楼层 |阅读模式
    本帖最后由 topdog 于 2018-4-3 21:50 编辑

    左手定则和右手定则是在高中物理教材中电磁学部分出现的,是电磁学部分的重点之一。口诀“左通力右生电。” 还可以记忆为:因电而动用左手,因动而电用右手,方法简要:右手手指沿电流方向拳起,大拇指伸出,观察大拇指方向。
    472309f790529822cdd4708ed4ca7bcb0b46d49c.jpg
    基于右手定律开发一个肺活量大比赛的竞技项目,用两个usb风扇按下图改装,用arduino测量电阻分压电压值。小伙伴吹动usb风扇的叶片带动电机里的线圈,移动于磁场的导体,因为动生电动势而产生的感应电流。电流通过二极管整流,电流穿过电阻产生电压,并联的电容消除高频波使测量稳定。arduino的模拟端口A0可以对微量的电压进行测量。
    原理图.JPG
    基于以上的原理改装两组usb风扇,看谁的累加值先到预设值,oled屏幕显示累加量判断胜负,比赛过程中启动炫彩led用亮度来激发气氛,比赛胜利者撞线后,泡泡机继电器接通,泡泡机开始喷射漂亮的肥皂泡泡,蜂鸣器奏乐,为比赛胜利者祝贺。
    接线图.jpg
    这是一个无厘头的,带有一定物理原理的游戏,让初中的学生们能够在玩中学习,激发思考,实现这个项目也需要了解arduino,外围洞洞板电路的焊接,风扇、泡泡机和hub板的连接,模拟I/O的使用,蜂鸣器的编曲,oled屏幕u8g库的使用,继电器的控制,炫彩led的操控渐变的实现,按键和系统时间的控制等,最后再用乐高积木做个控制台防止短路,并且把各个部件展现给参赛者。
    IMG_8947.JPG
    参加比赛的学生们玩得多高兴呀。
    IMG_8966.JPG

    IMG_8997.JPG

    IMG_9001.JPG

    材料如下:
    coreUSB一个、HUB一个、继电器一个、蜂鸣器一个、炫彩led两个、开关一个、usb小风扇两个、泡泡机一个、乐高积木若干、导线、二极管、电阻、电容等

    代码如下:

    #include <Microduino_ColorLED.h> //引用美科科技彩灯库 语法手册 https://wiki.microduino.cn/index.php/Sensor-Color_LED_Reference
    #include <U8glib.h>

    #define setFont_M u8g.setFont(u8g_font_timB18) //OLED设置字体
    #define RedPin A0      //设置红队风速检测引脚
    #define BluePin A1     //设置蓝队风速检测引脚
    #define PaoPin 12      //设置泡泡机控制引脚
    #define KeyPin 10      //设置按键检测引脚
    #define LedPin 8       //设置LED引脚
    #define MidiPin 6      //设置蜂鸣器引脚
    #define NUMPIXELS 2    //级联彩灯数量

    ColorLED strip = ColorLED(NUMPIXELS, LedPin); //将ColorLED类命名为strip,并定义彩灯数量和彩灯引脚号

    U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);

    int SumRed = 0;    //红队总分初始化
    int SumBlue = 0;   //蓝队总分初始化
    int MaxSum = 1000; //游戏结束总分数设置
    int MaxTime = 30;  //游戏最大超时时间,单位:秒

    //两只老虎跑得快曲谱
    float tonelist[7]={1046.5,1174.7,1318.5,1396.9,1568,1760,1975.5};
    long musiclist[32]={1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,4,3,1,5,6,5,4,3,1,2,5,1,2,5,1};
    long highlist[32]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,-1,0};
    long rhythmlist[32]={4,4,4,4,4,4,4,4,4,4,2,4,4,2,8,8,8,8,4,4,8,8,8,8,4,4,4,4,2,4,4,2};

    void playmusic() {
      for (int i = 1; i <= 32; i = i + (1)) {
        tone(MidiPin,tonelist[(int)(musiclist[(int)(i - 1)] - 1)] * pow(2, highlist[(int)(i - 1)]));
        delay((2000 / rhythmlist[(int)(i - 1)]));
        noTone(MidiPin);
        delay(10);
      }
    }


    void GameStart(void)
    {
      SumRed = 0;    //红队总分初始化
      SumBlue = 0;   //蓝队总分初始化

      int LED1 = 0;
      int LED2 = 0;

      long TimeCache = 0;  //定义超时时间缓存
      TimeCache = millis();  //获取系统运行时间

      digitalWrite(PaoPin, LOW);  //初始化关掉泡泡机

      while((SumRed < MaxSum) && (SumBlue < MaxSum) && ((millis() - TimeCache) < MaxTime * 1000))
      {
        SumRed += analogRead(RedPin);
        SumBlue += analogRead(BluePin);

         u8g.firstPage();
      do {
        setFont_M;
        u8g.setPrintPos(0, 20);
        u8g.print("red");
        setFont_M;
        u8g.setPrintPos(60, 20);
        u8g.print(SumRed);
        setFont_M;
        u8g.setPrintPos(0, 60);
        u8g.print("blue");
        setFont_M;
        u8g.setPrintPos(60, 60);
        u8g.print(SumBlue);
      } while( u8g.nextPage() );


        LED1 = map(SumRed, 0, MaxSum, 0, 255);
        LED2 = map(SumBlue, 0, MaxSum, 0, 255);

        if(SumRed >= MaxSum)LED1 = 255 ,LED2 = 0;
        if(SumBlue >= MaxSum)LED2 = 255, LED1 =0;

        strip.setPixelColor(0, strip.Color(LED1,0, 0)); //红队显示红色渐变灯效
        strip.setPixelColor(1, strip.Color(0,0,LED2));  //蓝队显示蓝色渐变灯效
        strip.show();

        delay(50);         
      }
    }

    void setup()
    {
      Serial.begin(9600);
      strip.begin();  //LED灯初始化
      strip.setAllLED(COLOR_RED);  //准备好了,两个红灯亮起。
      strip.show();


      pinMode(PaoPin, OUTPUT);  //引脚初始化配置
      pinMode(KeyPin, INPUT);
      pinMode(MidiPin, OUTPUT);

      digitalWrite(PaoPin, LOW);  //初始化关掉泡泡机
      digitalWrite(MidiPin, LOW);  //初始化关掉蜂鸣器
    }

    void loop()
    {
      if(digitalRead(KeyPin) == LOW) //判断按键是否被按下
      {
        GameStart();  //开始游戏
        if(SumRed >= MaxSum)  //判断是否红队赢
        {
          digitalWrite(PaoPin, HIGH);  //开泡泡机

        u8g.firstPage();    //OLED显示红队胜利
        do {
           setFont_M;
           u8g.setPrintPos(0, 20);
           u8g.print("Red Win !!!");   
           } while( u8g.nextPage() );

          playmusic();   //奏乐

        }
        else if(SumBlue >= MaxSum)  //判断是否蓝队赢
        {
          digitalWrite(PaoPin, HIGH);  //开泡泡机

          u8g.firstPage();      //OLED显示蓝队胜利
          do {
              setFont_M;
              u8g.setPrintPos(0, 20);
              u8g.print("Blue Win !!!");   
              } while( u8g.nextPage() );  

             playmusic();   //奏乐
        }
        else
        {

           u8g.firstPage();    //红队蓝队都未则进行比赛则OLED显示游戏超时
           do {
              setFont_M;
              u8g.setPrintPos(0, 20);
              u8g.print("Time Out !!!");   
              } while( u8g.nextPage() );        
        }

        delay(1000);

        digitalWrite(PaoPin, LOW);      //关掉泡泡机
        digitalWrite(MidiPin, LOW);     //关掉蜂鸣器
        strip.setAllLED(COLOR_GREEN);   //两个绿灯亮起,可以按下按键再来一次。   
        strip.show();
      }

    }

    打赏作者鼓励一下!
  • TA的每日心情
    开心
    2018-5-12 17:02
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    发表于 2018-4-3 13:18 | 显示全部楼层
    不错有意思
  • TA的每日心情
    开心
    2019-1-20 16:41
  • 签到天数: 56 天

    [LV.5]常住居民I

     楼主| 发表于 2018-4-3 22:01 | 显示全部楼层

    谢谢关注,一起学习,一起进步。
    打赏作者鼓励一下!
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    KittenBot杯第六届开源硬件开发大赛启动啦
    KittenBot杯第六届开源硬
    大赛简介: 第六届开源硬件开发大赛由Arduino中文社区发起 由KittenBot冠名赞助
    Blinker 模拟传感器+数字传感器例程(DHT11 温湿度+气体传感)
    Blinker 模拟传感器+数字
    才接触1星期,发现Blinker自带了很多例程,已经成功试验了DHT的例程序,并完善了体
    一文教你选择Arduino开发板,小白进
    一文教你选择Arduino开发
    笔者在2016年接触了Arduino,跳了万条坑,行了千里弯,到今天也算是Arduino的一
    [发布帖]RPG游戏 无人世界
    [发布帖]RPG游戏 无人世界
    视频攻略:https://www.bilibili.com/video/av43790997/ (b站正在审核) 剧情:主角是
    【人脸识别】ESP-EYE 最新的板子到货了
    【人脸识别】ESP-EYE 最新
    1.我不会编程,最多抄几个一步一步的网络教程。 2.不知道为啥就是超级喜欢电子元件。
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表