Şimdi Ara

1 Arduino İle 2 Farklı Görev Yaptırma (Koda Müdahale Edebilir Misiniz ?

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
6
Cevap
1
Favori
993
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Selamlar,


    Arduino ile buton üzerinden buzzer çalıştırıyorum. Aynı zamanda farklı bir Arduinodan Lcd ekrana sıcaklık sensörü verisini yazdırıyordum. Fakat bu iki görevi tek bir arduino kartı ile yaptırmam gerekiyor. Lütfen kodlarıma gerekli müdahaleyi nasıl yapabilceğimi tarif edebilri misiniz ?




    #include <Wire.h>

    #include <Adafruit_GFX.h>

    #include <Adafruit_SSD1306.h>


    #define SCREEN_WIDTH 128 // OLED display width, in pixels

    #define SCREEN_HEIGHT 64 // OLED display height, in pixels


    // declaration for an SSD1306 display connected to I2C (SDA, SCL pins)

    Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);


    const int sensorPin = A0;

    float sensorValue;

    float voltageOut;


    float temperatureC;


    // uncomment if using LM335

    //float temperatureK;

    const int buttonPin = 3;   // the number of the pushbutton pin

    int Buzzer1 = 11;


    // variables will change:

    int buttonState = 0;     // variable for reading the pushbutton status


    void setup() {

     pinMode(sensorPin, INPUT);

     Serial.begin(9600);


     if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {

      Serial.println(F("SSD1306 allocation failed"));

      for (;;);

     }


     delay(2000);

     display.clearDisplay();

     display.setTextColor(WHITE);

     // initialize the piezo as output:

     pinMode(Buzzer1, OUTPUT);

     // initialize the pushbutton pin as an input:

     pinMode(buttonPin, INPUT);

    }




    void loop() {

     sensorValue = analogRead(sensorPin);

     voltageOut = (sensorValue * 5000) / 1024;


     // calculate temperature for LM35 (LM35DZ)

     temperatureC = voltageOut / 10;


     // calculate temperature for LM335

     //temperatureK = voltageOut / 10;

     //temperatureC = temperatureK - 273;

     //temperatureF = (temperatureC * 1.8) + 32;


     // calculate temperature for LM34

     //temperatureF = voltageOut / 10;

     //temperatureC = (temperatureF - 32.0)*(5.0/9.0);


     Serial.print("MOTOR SICAKLIK(ºC): ");

     Serial.print(temperatureC);

     Serial.print("ERHAN DEMIR 2021");



     // clear display

     display.clearDisplay();


     // display temperature Celsius

     display.setTextSize(1);

     display.setCursor(0, 0);

     display.print("MOTOR SICAKLIGI: ");

     display.setTextSize(2);

     display.setCursor(0, 10);

     display.print(temperatureC);

     display.print(" ");

     display.setTextSize(1);

     display.cp437(true);

     display.write(167);

     display.setTextSize(2);

     display.print("C");


     // display temperature Fahrenheit

     display.setTextSize(2);

     display.setCursor(0, 35);

     display.print("Erhan   Demir 2021 ");

     display.setTextSize(2);

     display.setCursor(0, 45);



     display.display();

     delay(1000);


     // read the state of the pushbutton value:

     buttonState = digitalRead(buttonPin);


     if (buttonState == HIGH) {

      // play th Music

      tone(Buzzer1, 194, 200);

      delay(40);

      tone(Buzzer1, 94, 40);

      delay(40);

     }

    }








  • Şu bağlantıdan yardım alabilirsin;

    https://googledaariyim.com/?q=Arduino+assembly+dersleri
  • oradan kendin bir yararlan önce belki nakil falan yaptırırsın. 

  • Bu yazdığın koddaki eksik nedir ?
  • koddaki delay satırlarından kurtul, arduino timerlarından birini zamanlama sinyali olarak kullan, örneğin her saniye bir bayrak değişkeni "1" yap. sonsuz döngünde uzun delay içeren kodları bu bayrak değişkene (veya değişkenlere) bağla ve ilgili kod çalıştığında bu bayrak değişkeni "0" yapsın ve "timer interrupt" kodunda "1" olarak güncellenene kadar çalışmasın. Örneğin:

    -----------------------------------------

    int lcdbayrak;


    //interrupt kodu

    {

    lcdbayrak=1;

    }


    //loop kodu;


    if(lcdbayrak>0)

    {

    //lcd ile ilgili işlemler ve aynı periyotta çalıştırmak istediğin işlemler

    sensorDegeri=sensorOku(kanal);

    lcd.setCursor(x,y);

    lcd.print("sensor:");

    lcd.print(sensorDegeri);

    lcdbayrak=0; //bayrak değişkeni kod grubunun sonunda "0" yap

    }

    -------------------

    buna benzer bir çok periyodik kodu sorunsuz aynı döngüde kullanabilirsin, kimisi 5 saniyede bir çalışabilir kimisi her saniye çalışabilir.


    Ya da:

    millis fonksiyonu ile de yapabilirsin benzer etkiyi, örneğin.


    ------------------

    //loop kodu gerekli değişkenlerin tanımlandığı varsayılarak

    {

    if((millis()-zamantakip)>1000) // zamantakip değişkeni periyod tespiti için

    {

    sayac1++; //her saniye artan bir sayaç

    sayac2++;

    }

    if(sayac1>0)

    {

    //her saniye çalışmasını istediğin kod

    sayac1=0; //sayacı "0" yaparak bir saniye sonra sayaç tekrar "1" yapılana kadar bu kod sonsuz döngüde es geçilir

    }

    if(sayac2>4)

    {

    //her beş saniyede bir çalışmasını istediğin kod

    sayac2=0;

    }


    -------------------------------------------





  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.