arduino ldr ile otomatik aydınlatma

Konu ile ilgili yapay zekadan yardım aldım:


C++:
const int led1 = 2;
const int led2 = 4;
const int led3 = 7;
const int sensorPin = A0;

int okumaSayisi = 3; // Karar vermeden önce bu kadar okuma yapacağız
int isikOkumalari[3] = {0, 0, 0}; // Son 3 okumayı saklamak için dizi
int index = 0;

void setup() {
    pinMode(led1, OUTPUT);
    pinMode(led2, OUTPUT);
    pinMode(led3, OUTPUT);
    Serial.begin(9600);
}

void loop() {
    // Yeni değeri kaydedip eskiyi kaydırıyoruz
    isikOkumalari[index] = analogRead(sensorPin);
    index = (index + 1) % okumaSayisi;

    // Ortalama hesapla
    int toplam = 0;
    for (int i = 0; i < okumaSayisi; i++) {
        toplam += isikOkumalari[i];
    }
    int ortalamaIsik = toplam / okumaSayisi;

    Serial.println(ortalamaIsik);
    delay(500);

    // Led1 kontrolü
    if (ortalamaIsik > 1020) {
        digitalWrite(led1, LOW);
    }
    else if (ortalamaIsik < 990) {
        digitalWrite(led1, HIGH);
    }

    // Led2 kontrolü
    if (ortalamaIsik > 990) {
        digitalWrite(led2, LOW);
    }
    else if (ortalamaIsik < 930) {
        digitalWrite(led2, HIGH);
    }

    // Led3 kontrolü
    if (ortalamaIsik > 800) {
        digitalWrite(led3, LOW);
    }
    else if (ortalamaIsik < 720) {
        digitalWrite(led3, HIGH);
    }
}

ve TinkerCad ile de denemesini yaptım pot kullandım çalışıyor:

Ekli dosyayı görüntüle 115064
Umarım gerçek donanımda da çalışır...
mrb. yükledim ama istediğim gibi çalışmıyor. 1 kere ğörüp yakıp veya sönderiyor. ben en az 3 kere o değeri görmesi gerektiğini istiyorum
 
int led2_sondur_sayi = 0, led4_sondur_sayi = 0, led7_sondur_sayi = 0;
mrb bunu ekledim hıgt kısımlarınıda ekledim ama bir kere degerin üstüne cıkınca sönüyor. siz ekleyip gönderirmisiniz acaba. ben yanlış yapıyor olabilirim belki...
mrb tekrardan sizin yardımınız cok oldu aydınlatma yanma konusunda sıkıntı yok sadece söndürmede sıkıntı var. yardımlarınızı bekliyorum
 
mrb tekrardan sizin yardımınız cok oldu aydınlatma yanma konusunda sıkıntı yok sadece söndürmede sıkıntı var. yardımlarınızı bekliyorum
Kod:
// LDR Led yakma
#define LED2 2
#define LED4 4
#define LED7 7

int led2_sayi = 0, led4_sayi = 0, led7_sayi = 0;
int led2_sayiL = 0, led4_sayiL = 0, led7_sayiL = 0;

void setup()
{
  pinMode(LED2, OUTPUT);
  pinMode(LED4, OUTPUT);
  pinMode(LED7, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  int isik = analogRead(A0);
  Serial.println(isik);
  delay(2000); // 2 sn. gecikme millis() ile yapılabilir.

  if (isik > 1020) // bu koşul sıkça oluşursa sorun olabilir! O zaman bu kısmı da saymak gerekir.
  {
    led2_sayiL++;
    if (led2_sayiL >= 3)
      digitalWrite(LED2, LOW);
    led2_sayi = 0;
  }
  if (isik < 990)
  {
    led2_sayi++;
    if (led2_sayi >= 3)
      digitalWrite(LED2, HIGH);
    led2_sayiL = 0;
  }

  if (isik > 990)
  {
    led4_sayiL++;
    if (led4_sayiL >= 3)
      digitalWrite(LED4, LOW);
    led4_sayi = 0;
  }
  if (isik < 930)
  {
    led4_sayi++;
    if (led4_sayi >= 3)
      digitalWrite(LED4, HIGH);
    led4_sayiL = 0;
  }

  if (isik > 800)
  {
    led7_sayiL++;
    if (led7_sayiL >= 3)
      digitalWrite(LED7, LOW);
    led7_sayi = 0;
  }
  if (isik < 720)
  {
    led7_sayi++;
    if (led7_sayi >= 3)
      digitalWrite(LED7, HIGH);
    led7_sayiL = 0;
  }

}
Herhalde iş görür.
 
Kod:
// LDR Led yakma
#define LED2 2
#define LED4 4
#define LED7 7

int led2_sayi = 0, led4_sayi = 0, led7_sayi = 0;
int led2_sayiL = 0, led4_sayiL = 0, led7_sayiL = 0;

void setup()
{
  pinMode(LED2, OUTPUT);
  pinMode(LED4, OUTPUT);
  pinMode(LED7, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  int isik = analogRead(A0);
  Serial.println(isik);
  delay(2000); // 2 sn. gecikme millis() ile yapılabilir.

  if (isik > 1020) // bu koşul sıkça oluşursa sorun olabilir! O zaman bu kısmı da saymak gerekir.
  {
    led2_sayiL++;
    if (led2_sayiL >= 3)
      digitalWrite(LED2, LOW);
    led2_sayi = 0;
  }
  if (isik < 990)
  {
    led2_sayi++;
    if (led2_sayi >= 3)
      digitalWrite(LED2, HIGH);
    led2_sayiL = 0;
  }

  if (isik > 990)
  {
    led4_sayiL++;
    if (led4_sayiL >= 3)
      digitalWrite(LED4, LOW);
    led4_sayi = 0;
  }
  if (isik < 930)
  {
    led4_sayi++;
    if (led4_sayi >= 3)
      digitalWrite(LED4, HIGH);
    led4_sayiL = 0;
  }

  if (isik > 800)
  {
    led7_sayiL++;
    if (led7_sayiL >= 3)
      digitalWrite(LED7, LOW);
    led7_sayi = 0;
  }
  if (isik < 720)
  {
    led7_sayi++;
    if (led7_sayi >= 3)
      digitalWrite(LED7, HIGH);
    led7_sayiL = 0;
  }

}
Herhalde iş görür.
teşekkürler çok yardımınız oldu. şuan için çok güzel çalışıyor emeğinize sağlık. birde uzun süre sistem çalışınca donup kalıyor, ya acık kalıyor yada kapalı kalıyordu bekçi köpeği ekledim. başka bir tavsiyeniz varsa ekleyebilirim.
 
Beslemeye filtrasyon için 16v 10-100uF bir elektrolit kapasitör paralel bağlayın.
mrb hayırlı işler. kendim ledlerle 2 li 7 segment display yaptım. her segmentte 10 ad. led kullandım. gelen 0.10 voltu 0.80 arasında bir hız göstersin dedim. kodu atıyorum sizlere. ama AO ya gelen voltajı 2 li çarptım. yanlız AO ya gelen 2.5 voltu 40 hız göstermesi lazım. ama 52 gösteriyor dışardan 5 voltluk ğüç kaynagıyla baglıyorum. nasıl yardımcı olabilirsiniz acaba

#include <avr/wdt.h> // Watchdog kullanımı

// 14 segment pini (2x7 segment)
const int segmentPins[14] = {
2, 3, 4, 5, 6, 7, 8, // Sol display (A-G)
9, 10, 11, 12, 13, A1, A2 // Sağ display (A-G)
};

// Rakamların segment karşılıkları (A–G)
const bool digitSegments[10][7] = {
{1, 1, 1, 1, 1, 1, 0}, // 0
{0, 1, 1, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1}, // 2
{1, 1, 1, 1, 0, 0, 1}, // 3
{0, 1, 1, 0, 0, 1, 1}, // 4
{1, 0, 1, 1, 0, 1, 1}, // 5
{1, 0, 1, 1, 1, 1, 1}, // 6
{1, 1, 1, 0, 0, 0, 0}, // 7
{1, 1, 1, 1, 1, 1, 1}, // 8
{1, 1, 1, 1, 0, 1, 1} // 9
};

int previousSpeed = -1; // Önceki hız değeri

void setup() {
wdt_enable(WDTO_4S); // 4 saniyelik watchdog

// Segment pinlerini çıkış olarak ayarla
for (int i = 0; i < 14; i++) {
pinMode(segmentPins, OUTPUT);
digitalWrite(segmentPins, LOW);
}

analogReference(EXTERNAL); // AREF pininden harici 5V referans al

Serial.begin(9600);
Serial.println("AREF ile çalışan hız göstergesi başlatıldı...");
}

// A0’dan sabit ortalamalı analog okuma
int readStableAnalog(int pin, int sampleCount = 20) {
long total = 0;
for (int i = 0; i < sampleCount; i++) {
total += analogRead(pin);
delay(2);
}
return total / sampleCount;
}

void loop() {
wdt_reset(); // Watchdog sıfırla

int raw = readStableAnalog(A0); // Analog değer 0–1023
float voltage = raw * (5.0 / 1023.0); // A0 gerçek voltajı
float inputVoltage = voltage * 2.0; // Voltaj bölücü oranı (0–10V)

int speed = inputVoltage * 8.0; // 10V → 80 km/h
speed = constrain(speed, 0, 80);

if (abs(speed - previousSpeed) >= 1) {
previousSpeed = speed;

Serial.print("A0: ");
Serial.print(voltage, 3);
Serial.print(" V | Giriş: ");
Serial.print(inputVoltage, 3);
Serial.print(" V | Hız: ");
Serial.print(speed);
Serial.println(" km/h");

displaySpeed(speed);
}

delay(400); // Yenileme süresi
}

// 2 haneli hızı göster
void displaySpeed(int number) {
int tens = number / 10;
int ones = number % 10;

showDigit(tens, 0); // Sol
showDigit(ones, 1); // Sağ
}

// Digit yazdır
void showDigit(int digit, int displayIndex) {
if (digit < 0 || digit > 9 || displayIndex < 0 || displayIndex > 1) return;

int baseIndex = displayIndex * 7;
for (int i = 0; i < 7; i++) {
digitalWrite(segmentPins[baseIndex + i], digitSegments[digit] ? HIGH : LOW);
}
}
 
Yada ufak tefek dalgalanmalar kararsız calismaya neden olabilir.


————————————————
skysmotor.co.uk aşağıdaki ürünleri çevrimiçi olarak satmaktadır: step motor, servo motor, step motor sürücüleri, planet dişli kutusu ve ihtiyaç halinde çevrimiçi olarak satın alınabilir.
 
Son düzenleme:

Forum istatistikleri

Konular
133,383
Mesajlar
971,009
Kullanıcılar
459,231
Son üye
Dmronr1

Yeni konular

Geri
Üst