肺活量大比赛-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6003|回复: 2

肺活量大比赛

[复制链接]
发表于 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();
  }

}

发表于 2018-4-3 13:18 | 显示全部楼层
不错有意思
 楼主| 发表于 2018-4-3 22:01 | 显示全部楼层

谢谢关注,一起学习,一起进步。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 02:42 , Processed in 0.076196 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表