#include <Adafruit_NeoPixel.h>
#include <math.h>
#define LED_PIN A3
#define LED_COUNT 30
#define LDR_PIN A0 // Wokwi’de LDR AO -> A0 kullan
// (Dijital pin 2 burada gereksiz, lux hesabı analogdan yapılır)
// LDR Characteristics (yaklaşık)
const float GAMMA = 0.7;
const float RL10 = 50.0; // kΩ @ 10 lux (yaklaşık)
// Bu satır senin orijinal “LDR sınıfı” mantığındaki ambient farkı için:
// setup’ta ortam ortalaması alınır, loop’ta fark üzerinden karar verilir.
#define THRESHOLD_ldr 100
int ldrAverageLight = 0;
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
// ----------------- Helpers -----------------
int readAverageADC(uint8_t samples = 40, uint16_t dly = 5) {
long sum = 0;
for (uint8_t i = 0; i < samples; i++) {
sum += analogRead(LDR_PIN);
delay(dly);
}
return (int)(sum / samples);
}
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 - WheelPos;
if (WheelPos < 85) return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
if (WheelPos < 170) { WheelPos -= 85; return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3); }
WheelPos -= 170;
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
void turnOff() {
for (int i = 0; i < LED_COUNT; i++) strip.setPixelColor(i, 0);
strip.show();
}
// Orijinal koddaki “rainbow / sequenceA / rainbowCycle / sequenceB” aynı mantıkla taşındı:
void rainbow(uint8_t wait) {
for (uint16_t j = 0; j < 256; j++) {
for (uint16_t i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel((i + j) & 255));
}
strip.show();
delay(wait);
}
}
void rainbowCycle(uint8_t wait) {
for (uint16_t j = 0; j < 256 * 5; j++) {
for (uint16_t i = 0; i < LED_COUNT; i++) {
strip.setPixelColor(i, Wheel(((i * 256 / LED_COUNT) + j) & 255));
}
strip.show();
delay(wait);
}
}
void sequenceA() {
for (int j = LED_COUNT; j > 0; j--) {
for (int i = 0; i < j; i++) {
strip.setPixelColor(i, Wheel(((i * 256 / LED_COUNT) + j) & 255));
if (i > 0) strip.setPixelColor(i - 1, 0);
strip.show();
delay(20);
}
}
}
void sequenceB() {
for (int j = LED_COUNT; j > 0; j--) {
for (int i = 0; i < LED_COUNT; i++) {
for (int k = 0; k < 7; k++) {
int idx = (i + k) % LED_COUNT;
strip.setPixelColor(idx, Wheel(((idx * 256 / LED_COUNT) + j) & 255));
}
strip.show();
delay(20);
}
}
}
// ----------------- Setup -----------------
void setup() {
Serial.begin(9600);
strip.begin();
strip.show();
// orijinal kod: ldr.readAverage()
ldrAverageLight = readAverageADC();
Serial.print("Ambient ADC Avg: ");
Serial.println(ldrAverageLight);
}
// ----------------- Loop -----------------
void loop() {
// orijinal kod: ldr.read()
int analogValue = analogRead(LDR_PIN);
// orijinal mantık: “Light Diff”
int ldrDiff = analogValue - ldrAverageLight;
// senin mevcut lux hesabın (aynen korundu)
float voltage = analogValue / 1024.0 * 5.0;
if (voltage < 0.01) voltage = 0.01;
float resistance = 2000.0 * voltage / (1.0 - voltage / 5.0);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1.0 / GAMMA));
Serial.print("ADC: ");
Serial.print(analogValue);
Serial.print(" | Diff: ");
Serial.print(ldrDiff);
Serial.print(" | Lux: ");
Serial.println(lux);
// ==== ORIJINAL KOD MANTIĞI TAŞINDI ====
// Eski kod: if (ldrSample < 500) { animasyonlar; turnOff(); }
//
// Burada iki seçenek var:
// 1) Ham ADC ile: analogValue < 500
// 2) Ambient fark ile: ldrDiff < -THRESHOLD_ldr (ortamdan daha karanlık)
//
// İkisini birlikte kullandım: daha stabil.
bool isDark = (analogValue < 500) || (ldrDiff < -THRESHOLD_ldr);
if (isDark) {
rainbow(20);
sequenceA();
rainbowCycle(10);
sequenceB();
turnOff();
} else {
// Aydınlıkta kapalı kalsın (istersen farklı davranış eklenir)
turnOff();
}
delay(50);
}