Emergency Vehicle - Зрабіце два святлодыёда міргаюць з кнопкамі і змены гуку пасіўны зумер

Мой тата і я проста навучыцца выкарыстоўваць свой новы UNO.

Мы даведаліся, як зрабіць святлодыёды міргаюць пры націску кнопкі. Мы таксама даведаліся, як зрабіць пасіўны гук зумера пры націску кнопкі і змяніць тон гучаць як паліцэйскі аўтамабіль.

Мы толькі што даведаліся, што мы не можам запусціць больш аднаго цыклу, таму мы аб'ядналі код зумер і святлодыёд код двойчы (для сініх і чырвоных святлодыёдаў), і ён працуе ... але затрымка на святлодыёдах губіць гук зумера. Што мы можам зрабіць?

Код ніжэй.

Дзякуй!

код:

int buzzerPin = 9;   //the number of the buzzer pin
int BlueLEDpin = 5;  //the number of the blue LED pin
int RedLEDpin = 7;   //the number of the Red LED pin  
float sinVal;        //Define a variable to save sine value for buzzer
int toneVal;         //Define a variable to save sound frequency for buzzer

void setup() {
  pinMode(buzzerPin, OUTPUT);//Set Buzzer pin to output mode
  pinMode(BlueLEDpin, OUTPUT);//Set Blue LED pin to output mode
  pinMode(RedLEDpin, OUTPUT);//Set Red LED pin to output mode
}

void loop() { 
    Buzzer(); 
    BlueLED();
    RedLED();

}

void Buzzer() {
  for (int x = 0; x < 360; x++) {      //X from 0 degree->360 degree
    sinVal = sin(x * (PI/180));      //Calculate the sine of x
    toneVal = 2000 + sinVal * 500;     //Calculate sound frequency according to the sine of x
    tone(buzzerPin, toneVal);          //Output sound frequency to buzzerPin
    delay(1);
  }

 }

  void BlueLED() {
  digitalWrite(5, HIGH);  //turn the LED on (HIGH is the voltage level)
  delay(1);             //wait for a second
  digitalWrite(5, LOW);   //turn the LED off by making the voltage LOW
  delay(1);             //wait for a second
}

void RedLED() {
  digitalWrite(7, HIGH);  //turn the LED on (HIGH is the voltage level)
  delay(1);             //wait for a second
  digitalWrite(7, LOW);   //turn the LED off by making the voltage LOW
  delay(1);             //wait for a second
}
3
Нічога сабе, дзякуй. Прама зараз мы адчуваем вельмі ганарлівым.
дададзена аўтар Steve S, крыніца
+1 за адфарматаваны код ... хацеў бы даць вам іншы, калі б я мог, для захоўвання каментароў і код асобна ... код, радасць глядзець на
дададзена аўтар jsotola, крыніца

5 адказы

Ваша праблема з'яўляецца затрымка() у вашых BlueLED() і RedLED() выклікаў. Для таго, каб атрымаць больш «адначасова» дзейнасць, вам трэба выкарыстоўваць перапыненне таймера для выканання гэтых затрымак. Гэта значна больш складаны канцэптуальна, але правільны спосаб зрабіць гэта.

2
дададзена
Гэта была хуткая праца! Рады, што вы атрымалі гэта адбываецца.
дададзена аўтар George Bailey, крыніца
Вялікі дзякуй Harper; што было вельмі карысна. Мы рушылі ўслед за вашы парады і проста вырашыць яе !!! Дзякуй!
дададзена аўтар Steve S, крыніца

Мы зрабілі гэта. Дзякуй за дапамогу Harper Shelby.

Мы сумясцілі Blink Без прыкладу затрымкі з нашым арыгінальным кодам:

int buzzerPin = 9;   //the number of the buzzer pin
const int BlueLEDpin = 5;
const int RedLEDpin = 7;    
float sinVal;        //Define a variable to save sine value
int toneVal;         //Define a variable to save sound frequency
int BlueLEDState = LOW; 
int RedLEDState = HIGH; 
unsigned long previousMillisBlue= 0;
unsigned long previousMillisRed= 0;
const long interval = 200; 

void setup() {
  pinMode(buzzerPin, OUTPUT);//Set Buzzer pin to output mode
  pinMode(BlueLEDpin, OUTPUT);
  pinMode(RedLEDpin, OUTPUT);
}

void loop() {
    Buzzer(); 
    BlueLED();
    RedLED();

}

void Buzzer() {
  for (int x = 0; x < 360; x++) {      //X from 0 degree->360 degree
    sinVal = sin(x * (PI/180));      //Calculate the sine of x
    toneVal = 2000 + sinVal * 500;     //Calculate sound frequency according to the sine of x
    tone(buzzerPin, toneVal);          //Output sound frequency to buzzerPin
    delay(1);
  }

 }

  void BlueLED() {
  unsigned long currentMillisBlue = millis();

  if (currentMillisBlue - previousMillisBlue >= interval) {
    previousMillisBlue = currentMillisBlue;
    if (BlueLEDState == LOW) {
      BlueLEDState = HIGH;
    } else {
      BlueLEDState = LOW;
    }

    digitalWrite(BlueLEDpin, BlueLEDState);
  }

}

void RedLED() {
  unsigned long currentMillisRed = millis();

  if (currentMillisRed - previousMillisRed >= interval) {
    previousMillisRed = currentMillisRed;
    if (RedLEDState == LOW) {
      RedLEDState = HIGH;
    } else {
      RedLEDState = LOW;
    }

    digitalWrite(RedLEDpin, RedLEDState);
  }

}
2
дададзена

Па-першае, віншую! Вы зрабілі свой першы крок у вельмі карысны свет мікра-кантролерах. Я вучу робататэхнікі ў мясцовым універсітэце, так што заўсёды прыемна бачыць, калі святло лямпы працягваецца, і людзі пачынаюць разумець.

Як ужо згадвалася вышэй, мігаценне без кода затрымкі з'яўляецца добрым пачаткам. Добры код павінен таксама быць якая пашыраецца ў выпадку пазней вы хочаце дадаць яшчэ адзін святло або 10, і гэта, дзе кадаваньне кожнага радка можа быць вельмі вялікі. Ёсць шмат іншых спосабаў рабіць такога роду задачы, аднак вы можаце захацець зірнуць на гэтую серыю навучальных дапаможнікаў. Шматзадачнасць з Arduino.

Выгада для машыннага падыходу дзяржавы, які выкарыстоўваецца ў гэтым прыкладзе, гэта становіцца вельмі лёгка ў далейшым змяніць свой код; калі вы хочаце мець больш агнёў ў паслядоўнасці (як рыцар-наезнік агні) або больш сірэн, становіцца прасцей уключыць. У вашым другім кодзе, пустата redLED() і несапраўднымі blueLED (коды) у асноўным утрымліваюць адны і тыя ж лініі; вы маглі б зрабіць аб'ект пад назвай «LED», а затым проста зрабіць так шмат прыкладаў гэтага, як вам трэба, усё працуе на розных хуткасцях і розных штыфтоў (прыклад на вэб-сайт павінен забяспечыць гэта шмат. Зуммер, верагодна, можа паўторна выкарыстоўваць частка серво разгорткі кода). Вы маглі б таксама, напрыклад, праграма 4-х розных тыпаў сірэнай як перамыкач: выпадак, і пасля часу мінула, перамыкацца паміж імі.

Яшчэ больш прасунуты метад будзе ўключаць у сябе аперацыйную сістэму рэальнага часу. RTOS робіць яго вельмі лёгка мець некалькі незалежных задач, запушчаных. Кожны святло можа быць па сваёй задачы і сірэне на траціны, і сістэма будзе трымаць кожную працу, эфектыўна адначасова. Такі падыход мае тое перавага, калі вы хочаце змяніць час адной крыніцы святла; ён атрымлівае змяніўся ў адным месцы, не асцерагаючыся неабходнасці змяняць увесь код. Інфармацыя пра FreeRTOS на Arduino можна знайсці тут . Існуе прыклад у ніжняй частцы старонкі, якая ўключае ў сябе як лыпання і аналагавыя чытання прыклады.

Гэта даволі складаныя тэмы, але я думаю, што вы і ваш тата атрымае там. Яшчэ раз віншую.

1
дададзена
Вялікі дзякуй Натана! Мы будзем глядзець, каб гэта далей, і спасылка сайта вы далі нам выдатна выглядае.
дададзена аўтар Steve S, крыніца

Гэта, верагодна, крыху прасунуліся, але ...

Вы можаце выкарыстоўваць базавы клас і паказальнікі на вытворны святлодыёд і класы зумера, каб паменшыць вам функцыю завесы да пятлі. Вы не атрымаеце шмат на гэтым узроўні, але пры даданні новых аб'ектаў, такіх як мігцяць фары і люстэркі святла, можа быць, нават ззаду абліцавальны дошка вы будзеце рабіць жыццё прасцей для сябе.

/*
Jacob & Dad’s Police Car light and sounds
*/

class BaseOutputObject
{
protected:
    int Pin;
public:
    BaseOutputObject(const int& pin)
        : Pin(pin)
    {
        pinMode(Pin, OUTPUT);
    }
    virtual void Update()
    {
    }
};

class FlashingLED : public BaseOutputObject
{
    long OnTime;
    long OffTime;
    int ledState;
    unsigned long previousMillis;
public:
    FlashingLED(const int& pin, const long& on, const long& off, const bool& startLow = true)
        : BaseOutputObject(pin)                    //Call base class constructor                      
        , OnTime(on)                           //Use initialisers rather than assignments 
        , OffTime(off)
        , ledState(startLow ? LOW : HIGH)
        , previousMillis(0)
    {
    }

    void Update()
    {
       //check to see if it's time to change the state of the LED
        const unsigned long currentMillis = millis();          //Make it const because it won't change within this call of the function.

        if (currentMillis - previousMillis >= OnTime)
        {
            ledState = (ledState == LOW ? HIGH : LOW); //Toggle the state.
            previousMillis = currentMillis; //Remember the time
            digitalWrite(Pin, ledState); //Update the actual LED
        }
    }
};

class Buzzer : public BaseOutputObject
{
    float SinValue;
    int ToneValue;
public:
    Buzzer(const int& pin)
        : BaseOutputObject(pin)
        , SinValue(0.0f)       //Always initialise variables, in case you change the code later.
        , ToneValue(0)
    {
    }

    void Update()
    {
        for (int x = 0; x < 360; x++)
        {
            SinValue = sin(x * (PI/180));
            ToneValue = 2000 + SinValue * 500;
            tone(Pin, ToneValue);
            delay(1);
        }
    }

};

// The objects could be declared dynamically, but thats not a great idea on embedded systems.
FlashingLED ledOne(5, 100, 400);
FlashingLED ledTwo(7, 100, 400);
Buzzer buzzer(9);
enum { LED_ONE, LED_TWO, BUZZER, MaxObjects };
// Have to have pointers to the objects to allow you to cast them down to the base objects.
BaseOutputObject* objects[MaxObjects] = {  &ledOne, &ledTwo, &buzzer};

void setup()
{
}

void loop()
{
    for (int index = 0; index < MaxObjects; ++index)
    {
        objects[index]->Update();
    }
}
0
дададзена

Мы зрабілі гэта лепш з паказальнікам Натана.

Мы даведаліся, як зрабіць клас, але святлодыёды мільгалі разам, каб мы даведаліся, як зрабіць яшчэ адзін клас (з грамадскімі і Пустатой Update ў класе - злавілі нас на першым, што біт). Адзін класа пачынаецца са станам высокай, а іншым з дзяржаўным нізкім, так чаргуюцца святлодыёды. Калі мы націснем ўсе тры кнопкі, якія мы атрымліваем два тону гукавы сігнал, і святлодыёды зменных.

З дапамогай гэтага метаду мы можам дадаць шмат новых святлодыёдаў, як нам падабаецца.

Вось код, мы пісалі:

/*
  Jacob & Dad’s Police Car light and sounds
*/

int buzzerPin = 9;    
float sinVal;         
int toneVal;         

class FlashingLED_A
{
    int ledPin;     
    long OnTime;     
    long OffTime;    
    int ledState;                   
    unsigned long previousMillis;   
  public:
  FlashingLED_A(int pin, long on, long off)
  {
    ledPin = pin;
    pinMode(ledPin, OUTPUT);     
    OnTime = on;
    OffTime = off;
    ledState = LOW; 
    previousMillis = 0;
  }

 void Update()
  {
   //check to see if it's time to change the state of the LED
    unsigned long currentMillis = millis();

    if((ledState == HIGH) && (currentMillis - previousMillis >= OnTime))
    {
        ledState = LOW; //Turn it off
      previousMillis = currentMillis; //Remember the time
      digitalWrite(ledPin, ledState); //Update the actual LED
    }
    else if ((ledState == LOW) && (currentMillis - previousMillis >= OffTime))
    {
      ledState = HIGH; //turn it on
      previousMillis = currentMillis;   
      digitalWrite(ledPin, ledState);     
    }
  }

};

class FlashingLED_B
{
    int ledPin;  
    long OnTime;    
    long OffTime;   
    int ledState;                   
    unsigned long previousMillis;   
  public:
  FlashingLED_B(int pin, long on, long off)
  {
    ledPin = pin;
    pinMode(ledPin, OUTPUT);     
    OnTime = on;
    OffTime = off;
    ledState = HIGH; 
    previousMillis = 0;
  }

 void Update()
  {
   //check to see if it's time to change the state of the LED
    unsigned long currentMillis = millis();

    if((ledState == HIGH) && (currentMillis - previousMillis >= OnTime))
    {
        ledState = LOW; //Turn it off
      previousMillis = currentMillis; //Remember the time
      digitalWrite(ledPin, ledState); //Update the actual LED
    }
    else if ((ledState == LOW) && (currentMillis - previousMillis >= OffTime))
    {
      ledState = HIGH; //turn it on
      previousMillis = currentMillis;   
      digitalWrite(ledPin, ledState);    
    }
  }

};

FlashingLED_A led1(5, 100, 400);
FlashingLED_B led2(7, 100, 400);

void setup() {
  pinMode(buzzerPin, OUTPUT);
}

void loop() {
  Buzzer(); 
    led1.Update();
    led2.Update();
}

void Buzzer() {
  for (int x = 0; x < 360; x++) {      
    sinVal = sin(x * (PI/180));       
    toneVal = 2000 + sinVal * 500;    
    tone(buzzerPin, toneVal);          
    delay(1);
  }
 }
0
дададзена
Гэта адзінае адрозненне паміж FlashingLED_A і FlashingLED_B Той факт, што пачынаецца LOW і B пачыналася высокая? Калі так, то я хацеў бы дадаць дадатковы параметр ў канструктар класа і выкарыстоўваць толькі адзін з класаў.
дададзена аўтар Thomas Myron, крыніца