#include #include #include #define Version "0.1.3" #define PinLED 2 // on-board LED #define IN1 32 #define IN2 14 #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 32 #define OLED_RESET -1 #define SCREEN_ADDRESS 0x3C // Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); BH1750 lightMeter; // TaskHandle_t TaskReadLux; float lux = 0.0; void setup() { Serial.begin(9600); Wire.begin(); lightMeter.begin(); // if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { // Serial.println(F("SSD1306 allocation failed")); // } // xTaskCreatePinnedToCore( // readLuxTask, "ReadLux", 2048, NULL, 1, &TaskReadLux, 1); // display.setTextSize(1); // display.setTextColor(SSD1306_WHITE); // display.clearDisplay(); // display.setCursor(0, 0); // display.println("Version:"); // display.setCursor(60, 0); // display.println(Version); // display.display(); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(PinLED, OUTPUT); } void pulsujNaprzemiennie(int czasSekundy) { const int steps = 600; // większa liczba = gładsze przejścia const int totalMillis = czasSekundy * 1000; const int delayPerStep = totalMillis / steps; // display.clearDisplay(); // display.setCursor(0, 20); // display.println("1"); // display.display(); for (int i = 0; i < 20; i++) { for (int i = 0; i <= steps; i++) { float phase = (float)i / steps; float angle = phase * PI; // pół cyklu (od 0 do π) // sinusoidalne przejście float brightness1 = (cos(angle) + 1.0) / 2.0; // 1 → 0 float brightness2 = 1.0 - brightness1; // 0 → 1 // Konwersja jasności do długości impulsu (maks. 2000us) int pulse1 = (int)(brightness1 * 2000); int pulse2 = (int)(brightness2 * 2000); // Wysterowanie IN1 digitalWrite(IN1, HIGH); delayMicroseconds(pulse1); digitalWrite(IN1, LOW); // Wysterowanie IN2 digitalWrite(IN2, HIGH); delayMicroseconds(pulse2); digitalWrite(IN2, LOW); // Opóźnienie (reszta czasu kroku) delayMicroseconds(1000 * delayPerStep - pulse1 - pulse2); } // drugi półcykl: kolory zamienione miejscami (pełny cykl = 2x π) // display.clearDisplay(); // display.setCursor(0, 20); // display.println("2"); // display.display(); for (int i = 0; i <= steps; i++) { float phase = (float)i / steps; float angle = phase * PI; float brightness1 = (cos(angle) + 1.0) / 2.0; float brightness2 = 1.0 - brightness1; int pulse1 = (int)(brightness2 * 2000); int pulse2 = (int)(brightness1 * 2000); digitalWrite(IN1, HIGH); delayMicroseconds(pulse1); digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); delayMicroseconds(pulse2); digitalWrite(IN2, LOW); delayMicroseconds(1000 * delayPerStep - pulse1 - pulse2); } } } void loop() { uint16_t lux = lightMeter.readLightLevel(); if (lux < 10 || lux == -2) { digitalWrite(PinLED, LOW); pulsujNaprzemiennie(8); // pełny cykl 8 sekund } else { digitalWrite(PinLED, HIGH); // display.setCursor(0, 10); // display.println("OFF"); esp_sleep_enable_timer_wakeup(100 * 1000000ULL); // 5s w mikrosekundach esp_light_sleep_start(); } // display.display(); }