Zwielokrotnienie pętli

This commit is contained in:
sieja
2025-08-17 18:39:01 +02:00
parent 875086605b
commit de590a5556

View File

@@ -2,7 +2,7 @@
#include <BH1750.h> #include <BH1750.h>
#include <Adafruit_GFX.h> #include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h> #include <Adafruit_SSD1306.h>
#define Version "0.1.0" #define Version "0.1.2"
#define PinLED 2 // on-board LED #define PinLED 2 // on-board LED
#define IN1 32 #define IN1 32
@@ -32,70 +32,83 @@ void setup() {
display.println("Version:"); display.println("Version:");
display.setCursor(60, 0); display.setCursor(60, 0);
display.println(Version); display.println(Version);
display.display(); display.display();
pinMode(IN1, OUTPUT); pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT); pinMode(IN2, OUTPUT);
pinMode(PinLED, OUTPUT); pinMode(PinLED, OUTPUT);
} }
void pulsujNaprzemiennie(int czasSekundy) { void pulsujNaprzemiennie(int czasSekundy) {
const int steps = 400; // większa liczba = gładsze przejścia const int steps = 600; // większa liczba = gładsze przejścia
const int totalMillis = czasSekundy * 1000; const int totalMillis = czasSekundy * 1000;
const int delayPerStep = totalMillis / steps; 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++) { for (int i = 0; i <= steps; i++) {
float phase = (float)i / steps; float phase = (float)i / steps;
float angle = phase * PI; // pół cyklu (od 0 do π) float angle = phase * PI; // pół cyklu (od 0 do π)
// sinusoidalne przejście // sinusoidalne przejście
float brightness1 = (cos(angle) + 1.0) / 2.0; // 1 → 0 float brightness1 = (cos(angle) + 1.0) / 2.0; // 1 → 0
float brightness2 = 1.0 - brightness1; // 0 → 1 float brightness2 = 1.0 - brightness1; // 0 → 1
// Konwersja jasności do długości impulsu (maks. 2000us) // Konwersja jasności do długości impulsu (maks. 2000us)
int pulse1 = (int)(brightness1 * 2000); int pulse1 = (int)(brightness1 * 2000);
int pulse2 = (int)(brightness2 * 2000); int pulse2 = (int)(brightness2 * 2000);
// Wysterowanie IN1 // Wysterowanie IN1
digitalWrite(IN1, HIGH); digitalWrite(IN1, HIGH);
delayMicroseconds(pulse1); delayMicroseconds(pulse1);
digitalWrite(IN1, LOW); digitalWrite(IN1, LOW);
// Wysterowanie IN2 // Wysterowanie IN2
digitalWrite(IN2, HIGH); digitalWrite(IN2, HIGH);
delayMicroseconds(pulse2); delayMicroseconds(pulse2);
digitalWrite(IN2, LOW); digitalWrite(IN2, LOW);
// Opóźnienie (reszta czasu kroku) // Opóźnienie (reszta czasu kroku)
delayMicroseconds(1000 * delayPerStep - pulse1 - pulse2); delayMicroseconds(1000 * delayPerStep - pulse1 - pulse2);
} }
// drugi półcykl: kolory zamienione miejscami (pełny cykl = 2x π) // drugi półcykl: kolory zamienione miejscami (pełny cykl = 2x π)
for (int i = 0; i <= steps; i++) { // display.clearDisplay();
float phase = (float)i / steps; // display.setCursor(0, 20);
float angle = phase * PI; // display.println("2");
// display.display();
float brightness1 = (cos(angle) + 1.0) / 2.0; for (int i = 0; i <= steps; i++) {
float brightness2 = 1.0 - brightness1; float phase = (float)i / steps;
float angle = phase * PI;
int pulse1 = (int)(brightness2 * 2000); float brightness1 = (cos(angle) + 1.0) / 2.0;
int pulse2 = (int)(brightness1 * 2000); float brightness2 = 1.0 - brightness1;
digitalWrite(IN1, HIGH); int pulse1 = (int)(brightness2 * 2000);
delayMicroseconds(pulse1); int pulse2 = (int)(brightness1 * 2000);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH); digitalWrite(IN1, HIGH);
delayMicroseconds(pulse2); delayMicroseconds(pulse1);
digitalWrite(IN2, LOW); digitalWrite(IN1, LOW);
delayMicroseconds(1000 * delayPerStep - pulse1 - pulse2); digitalWrite(IN2, HIGH);
delayMicroseconds(pulse2);
digitalWrite(IN2, LOW);
delayMicroseconds(1000 * delayPerStep - pulse1 - pulse2);
}
} }
} }
void loop() { void loop() {
uint16_t lux = lightMeter.readLightLevel(); uint16_t lux = lightMeter.readLightLevel();
if (lux < 10) { if (lux < 10 || lux == -2) {
digitalWrite(PinLED, LOW); digitalWrite(PinLED, LOW);
pulsujNaprzemiennie(8); // pełny cykl 8 sekund pulsujNaprzemiennie(8); // pełny cykl 8 sekund
} else { } else {
@@ -104,5 +117,7 @@ void loop() {
display.println("OFF"); display.println("OFF");
delay(5000); delay(5000);
} }
display.display();
display.display();
} }