Жедел жәрдем көлігі - екі түймені жарықтандырады да, дыбыс сигналын өзгертпейді

Менің әкем мен мен жаңа БҰҰ-ды қалай пайдалану керектігін біліп жатырмын.

Біз түймені түрту арқылы жарық шамдарын қалай жасауға болатынын білдік. Біз сондай-ақ, батырманың жанасуы кезінде пассивті қоңырау шалу дыбысын жасауды үйрендік және полиция көлігі секілді дыбысты өзгертуді үйрендік.

Біз жай ғана білдік те, біз бірден көп цикл істей алмайтынымызды білеміз, сондықтан қоңырау кодын және LED кодын екі рет (көк және қызыл жарық диодты шамдар үшін) біріктірдік және ол жұмыс істейді ... бірақ светодиодтардағы кідіріс сигнал дыбысын бұзады. Біз не істей аламыз?

Код төменде көрсетілген.

Рақмет сізге!

Код:

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
Wow, рахмет. Қазір біз өте мақтан тұтамыз.
қосылды автор Steve S, көзі
Жақсы пішімделген код үшін +1 ... түсініктемелерді және кодты бөлек сақтау үшін, егер басқаша болса, сізге тағы біреуді берер еді ...
қосылды автор jsotola, көзі

5 жауаптар

Сіздің проблемаңыз BlueLED() және RedLED() қоңырауларындағы кешіктіру() болып табылады. Көбірек «бір мезгілде» әрекеттер алу үшін осы кешіктірулерді орындау үшін таймерді үзуді пайдалану керек. Бұл концептуалды түрде әлдеқайда күрделі, бірақ оны орындаудың дұрыс жолы.

2
қосылды
Бұл жылдам жұмыс болды! Сізге қуаныштымын.
қосылды автор George Bailey, көзі
Үлкен рахмет Harper; бұл өте пайдалы болды. Біз сіздердің кеңестеріңізді ұстандық және оны шештік! Рахмет!
қосылды автор Steve S, көзі

Біз мұны жасадық. Harper Shelby-дің көмегі үшін алғыс айтамыз.

Біз Blink Without Delay үлгісін бастапқы кодпен біріктірдік:

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() және void blueLED() кодтары негізінен бірдей сызықтарды қамтиды; сіз «LED» деп аталатын нысанды жасай аласыз, содан кейін әртүрлі жылдамдықтарда және әртүрлі істіктерде жұмыс істей аласыз (мысалы, веб-тораптағы мысал осы функцияны қамтамасыз етуі керек). кодының). Сондай-ақ, мысалы, коммутатор ретінде 4 түрлі сиренді бағдарламаны жасай аласыз: кейс, ал өткен уақыт өткеннен кейін олардың арасында ауысыңыз.

Тағы бір неғұрлым озық әдіс - нақты уақыт режимінде операциялық жүйені қамту. RTOS бірнеше тәуелсіз тапсырмаларды орындауды оңай етеді. Әрбір жарық өзінің тапсырмасы бойынша және сиренаны үшінші орында болуы мүмкін және жүйе әр уақытта бір уақытта тиімді жұмыс істейтін болады. Егер бір жарықтың уақытын өзгерткіңіз келсе, бұл тәсіл артықшылығы бар; бұл бүкіл кодты өзгертуді қажет деп қорықпай, бір жерде өзгереді. Ардуинодағы FreeRTOS туралы ақпаратты мына жерден табуға болады: мұнда . Беттің төменгі жағында Blink және аналогтық оқу мысалдарын қамтитын мысал бар.

Бұл жеткілікті дамыған тақырыптар, бірақ сіз және сіздің әкеңіз барады деп ойлаймын. Тағы да құттықтаулар.

1
қосылды
Натанға үлкен рахмет! Келесіге қарап, сіз берген веб-сайттың сілтемесі керемет көрінеді.
қосылды автор Steve S, көзі

Бұл, шамасы, біршама жетілдірілген, бірақ ...

Циклдік функцияны циклге дейін азайту үшін негізгі сынып пен көрсеткіштерді алынған LED және Buzzer сыныптарына пайдалануға болады. Сіз осы деңгейде көп нәрсе таба алмайсыз, бірақ сіз жыпылықтайтын фаралар мен айна шамдар сияқты қосымша нысандарды қосқанда, тіпті артқы жағына қарап тұрған хабар тақтасы өзіңіздің өміріңізді оңайырақ етеді.

/*
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
қосылды

Біз оны Натанның көрсеткішімен жақсырақ жасадық.

Біз класс жасауды үйрендік, бірақ светодиодтар бірге жыпылықтанды, сондықтан біз басқа класс жасауды үйрендік (сыныптағы қоғамдық және жарамсыз жаңартулармен - бізді алдымен бұл бит). Бір класс HIGH HIGH күйінен басталады, ал екіншісі LOW күйінде, сондықтан LED шамдары өзгереді. Барлық үш түймені басқанда, біз екі дыбыстық сигнал беріп, ауыспалы жарық диодты шамдар аламыз.

Осы әдісті қолданып, біз қанша жаңа СИД қосамыз.

Міне, біз жазған код:

/*
  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 арасындағы жалғыз айырмашылық A LOW басталады және B жоғарыдан басталады? Егер солай болса, мен сынып конструкторына қосымша параметр қосып, тек біреуін қолданамын.
қосылды автор Thomas Myron, көзі