Acil Durum Aracı - İki LED'in düğmelerle yanıp sönmesini ve pasif sesli uyarı sesini değiştirmesini sağlayın

Babam ve ben sadece UNO'mu nasıl kullanacağımızı öğreniyoruz.

Bir düğmeye dokunarak ledlerin nasıl yanıp söneceğini öğrendik. Ayrıca bir düğmeye dokunarak pasif bir zil sesini nasıl çıkartacağımızı ve bir polis arabası gibi sesini değiştirmeyi de öğrendik.

Az önce birden fazla döngü çalıştıramayacağımızı öğrendik, zil kodunu ve LED kodunu iki kez birleştirdik (mavi ve kırmızı LED'ler için) ve çalışıyor ... ancak LED'lerin gecikmesi zil sesini bozuyor. Yapabileceğimiz bir şey var mı?

Kod aşağıda.

Teşekkür ederim!

Kod:

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
Vay, teşekkürler. Şu an çok gururlu hissediyoruz.
katma yazar Steve S, kaynak
Güzelce biçimlendirilmiş kod için +1 ... başka bir tane verir, eğer yapabilseydim, yorumları ve kodu ayrı tuttuğumda ... bakmaktan zevk alan bir kod
katma yazar jsotola, kaynak

5 cevap

Sorununuz BlueLED() ve RedLED() aramalarınızdaki gecikme (). Daha fazla "eşzamanlı" etkinlik almak için, bu gecikmeleri uygulamak için zamanlayıcı kesintilerini kullanmanız gerekir. Kavramsal olarak çok daha karmaşık, ama bunu yapmanın doğru yolu.

2
katma
Hızlı işti! Gitmene sevindim.
katma yazar George Bailey, kaynak
Çok teşekkürler Harper; Bu çok yardımcı oldu. Tavsiyenizi takip ettik ve çözdük! Teşekkürler!
katma yazar Steve S, kaynak

Yaptık. Yardımın için teşekkürler Harper Shelby.

Blink Without Delay örneğini orijinal kodumuzla birleştirdik:

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
katma

İlk olarak, tebrikler! Mikrodenetleyicilerin çok değerli dünyasına ilk adımınızı attınız. Yerel bir üniversitede robotik eğitimi veriyorum, bu yüzden ampulün ne zaman yandığını ve insanların anlamaya başladığını görmek her zaman güzeldir.

Yukarıda belirtildiği gibi, gecikme kodu olmadan yanıp sönme iyi bir başlangıçtır. İyi bir kod, daha sonra başka bir ışık veya 10 eklemek istediğinizde genişletilebilir olmalıdır ve bu, her satırın kodlanmasının çok büyük olabileceği yerdir. Bu tür bir görevi yerine getirmenin birçok yöntemi vardır, ancak bu eğitici serilere bir göz atmak isteyebilirsiniz. Arduino ile çoklu görevlendirme.

Bu örnekte kullanılan durum makinesi yaklaşımının avantajı, kodunuzu değiştirmek için daha sonra çok kolay hale gelmesidir; sırayla (şövalye binici ışıkları gibi) daha fazla ışığın yanıp sönmesi veya sirenlerin daha fazla görünmesini istiyorsanız, dahil edilmesi daha kolay hale gelir. İkinci kodunuzda, redLED() ve void blueLED() boşlukları çoğunlukla aynı satırları içerir; 'LED' adında bir nesne oluşturabilir ve daha sonra ihtiyacınız olan her şeyi yapabilirsiniz, hepsi farklı hızlarda ve farklı pinlerde çalışabilir (web sitesindeki örnek bunu sağlamalıdır. Buzzer muhtemelen servo süpürme parçasını tekrar kullanabilir) Kodun). Örneğin, bir anahtar olarak 4 farklı siren türü programlayabilirsiniz: durum ve geçen süreden sonra aralarında geçiş yapın.

Daha gelişmiş bir yöntem ise, gerçek zamanlı bir işletim sistemi içermektir. Bir RTOS çalışan çoklu bağımsız görevlerin yapılmasını çok kolaylaştırır. Her ışık kendi görevi ve üçte bir siren olabilir ve sistem aynı anda etkin bir şekilde çalışmaya devam eder. Bu yaklaşımın, bir ışığın zamanlamasını değiştirmek isterseniz avantajları vardır; tüm kodu değiştirmek zorunda kalmaktan korkmadan tek bir yerde değiştirilir. Arduinodaki FreeRTOS ile ilgili bilgileri burada bulabilirsiniz Sayfanın alt kısmında hem Blink hem de analog okuma örnekleri içeren bir örnek var.

Bunlar oldukça gelişmiş konular, ama sanırım sen ve baban oraya varacaksınız. Bir kez daha, tebrikler.

1
katma
Çok teşekkürler Nathan! Daha sonra buna bakacağız ve bize verdiğiniz web sitesi bağlantısı harika görünüyor.
katma yazar Steve S, kaynak

Bu muhtemelen biraz ileri ama ...

Döngü işlevini bir döngüye indirgemek için türetilmiş LED ve Buzzer sınıflarına bir temel sınıf ve işaretçiler kullanabilirsiniz. Bu seviyede fazla kazanamayacaksınız, ancak yanıp sönen farlar ve ayna ışıkları gibi daha fazla nesne eklediğinizde, belki de arkaya dönük bir mesaj panosu bile, hayatı kendiniz için kolaylaştıracaktır.

/*
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
katma

Nathan'ın işaretçisiyle daha iyi yaptık.

Bir sınıfın nasıl yapıldığını öğrendik, ancak LED'ler birlikte yanıp söndüler, bu yüzden başka bir sınıfın nasıl yapıldığını öğrendik (Sınıftaki Public ve Void Güncellemesi ile - bizi ilk o anda yakaladılar). Bir sınıf, HIGH durumuyla, diğeri ise LOW durumuyla başlar, böylece LED'ler değişebilir. Üç düğmeye de bastığımızda iki tonlu zili ve alternatif LED'leri alırız.

Bu yöntemi kullanarak dilediğimiz kadar yeni LED ekleyebiliriz.

İşte yazdığımız kod:

/*
  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
katma
FlashingLED_A ve FlashingLED_B arasındaki tek fark, A'nın DÜŞÜK ve B'nin HIGH'a başlaması gerçeği midir? Öyleyse sınıf yapıcısına fazladan bir parametre ekler ve yalnızca sınıflardan birini kullanırdım.
katma yazar Thomas Myron, kaynak