• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Lampa Led sterw.PWM
#1
Witam.
Czy mógłby mi ktoś pomóc w napisaniu,dopisaniu ,poprawieniu kodu.
Arduino steruje 2 belkami ledowymi .Opcja włącz i wyłącz jest wspólna dla obu belek i tak jest ok.Chciałbym jednak aby swieciły one z różna jasnością dlatego dołączyłem 2 potencjometry które mają to zadanie wykonać .Potrzebuje dopisać w menu kolejny krok (7) gdzie bede mógł poustawiać sobie jasność belek wg potrzeb.Kiedy nadejdzie godzina włączenia rozpoczyna się proces rozjaśniania (tablica).Chciałbym aby belki rozjasniły się do takiego poziomu jaki ustawie sobie na  potencjometrze więc jezeli ustawie,że kanał 1 ma się rozjasnić max do 50% to proces rozjasniania musi wziąć to pod uwagę .Obecnie to mam taki efekt ,że belki i tak idą na maxa.Pomysł miałem taki żeby w menu stworzyć np".Ustawienie jasnosci kanałów",potem program ma przestawić wartosc potencjometru na sygnał PWM 0-255.,nastepnie ma powstać tablica gdzie max wartością bedzie przeliczona wartość z potencjometru np.125,wartość ta podzielona na 61 kroków i tak powstała tablica ma zostać wykorzystana do procesu świt/zmierzch.Nie potrafie tego ogarnąć.
Kod:
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <RTClib.h>
#include <EEPROM.h>

#define ONE_WIRE_BUS 2
#define BACKLIGHT_PIN

LiquidCrystal_I2C lcd(0x3F, 16, 2);
RTC_DS1307 RTC;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

int LED1 = 3;   // Lampa nr 1
int LED2 = 5;   // Lampa nr 2
int Ton = 43;   // Temperatura włączenia wentylatora
int Toff = 27;  // Temperatura wyłączenia wentylatora
int P1 = 6;     // Menu od ustawiania czasu
int P2 = 7;     // Przycisk +
int P3 = 8;     // Przycisk -
// Nowe zmienne dla potencjometrów
int pot1Pin = A0;  // Pin dla potencjometru 1
int pot2Pin = A1;  // Pin dla potencjometru 2

int hourupg;
int minupg;
int startHour, startMinute, stopHour, stopMinute; // Zmienne na godziny i minuty włączenia/wyłączenia lamp
int menu = 0;

void setup() {
    lcd.setBacklight(HIGH);
    lcd.init();
    lcd.begin(16, 2);
    lcd.clear();
    Wire.begin();

    pinMode(P1, INPUT);
    pinMode(P2, INPUT);
    pinMode(P3, INPUT);
    pinMode(9, OUTPUT); // Wentylator
    pinMode(LED1, OUTPUT); // Lampa LED 1
    pinMode(LED2, OUTPUT); // Lampa LED 2

    Serial.begin(9600);
    sensors.begin();
    RTC.begin();

    // Odczyt z EEPROM ustawień włączenia/wyłączenia lamp
    startHour = EEPROM.read(0);
    startMinute = EEPROM.read(1);
    stopHour = EEPROM.read(2);
    stopMinute = EEPROM.read(3);
}

void loop() {
    DateTime now = RTC.now(); // Użyj RTC do pobrania aktualnego czasu

    sensors.requestTemperatures();
    lcd.setCursor(11, 0);
    lcd.print(sensors.getTempCByIndex(0));

    // Kontrola wentylatora
    if ((sensors.getTempCByIndex(0)) > Ton) {
        digitalWrite(9, LOW);
    }
    if ((sensors.getTempCByIndex(0)) < Toff) {
        digitalWrite(9, HIGH);
    }// Odczyt wartości z potencjometrów
    int pot1Value = analogRead(pot1Pin);  // Odczytaj wartość z potencjometru 1
    int pot2Value = analogRead(pot2Pin);  // Odczytaj wartość z potencjometru 2

    // Mapa wartości potencjometrów do zakresu PWM (0-255)
    int pwmValue1 = map(pot1Value, 0, 1023, 0, 255);
    int pwmValue2 = map(pot2Value, 0, 1023, 0, 255);
// Wyświetlanie wartości potencjometrów na LCD
    //lcd.setCursor(0, 1); // Ustaw kursor w dolnym wierszu
  //  lcd.print("1:");
//   lcd.print(pot1Value); // Wyświetl wartość potencjometru 1
  //  lcd.print("  "); // Puste miejsca do wyczyszczenia poprzednich wartości
//
    //lcd.setCursor(8, 1); // Ustaw kursor w dolnym wierszu, przesunięty dla drugiego potencjometru
  //  lcd.print("2:");
  //  lcd.print(pot2Value); // Wyświetl wartość potencjometru 2
    int CZAS = (hourupg * 60 + minupg); // Użyj hourupg i minupg zamiast now
    int dzienG = startHour; // Użyj ustawień z EEPROM
    int dzienM = startMinute; 
    int nocG = stopHour;
    int nocM = stopMinute;
    int maxD1 = 60;  // Ilość kroków z tablicy
    int maxD2 = 60;
    int STEP = 1;
    int ZMIANA = 60;  // Długość rozjaśniania lub ściemniania (60 min)
    int czas1 = (dzienG * 60 + dzienM); // Obliczenie czas rozjaśnienia
    int czas2 = (nocG * 60 + nocM);     // Oblicz czas gaszenia

    static int D1;
    static int D2;
    int mocD1[61] = {
        0, 5, 8, 11, 14,
        18, 20, 25,
        28, 30, 32, 36, 40, 46, 50,
        56, 58, 60, 62, 68,69,70,72, 74, 78, 80,
        82, 86, 88, 96, 68,110, 120, 130,
        140, 150, 160, 170, 180,182,183,187, 190,
        200, 208, 212, 220, 224, 228, 234,
        238, 240, 242, 244, 246, 248, 249,
        250, 251, 253, 255
    };
    int mocD2[61] = {
        0, 5, 8, 11, 14,
        18, 20, 25,
        28, 30, 32, 36, 40, 46, 50,
        56, 58, 60, 62, 68,69,70,72, 74, 78, 80,
        82, 86, 88, 96, 68,110, 120, 130,
        140, 150, 160, 170, 180,182,183,187, 190,
        200, 208, 212, 220, 224, 228, 234,
        238, 240, 242, 244, 246, 248, 249,
        250, 251, 253, 255
    };

    if (CZAS < czas1) {
        D1 = 0;
    }

    if ((czas1 <= CZAS) && (CZAS < (czas1 + ZMIANA))) {
        D1 = ((CZAS - czas1) / STEP);   
    }
    if (((czas1 + ZMIANA) <= CZAS) && (CZAS < (czas2 - ZMIANA))) {
        D1 = maxD1;
    }
    if (((czas2 - ZMIANA) <= CZAS) && (CZAS < czas2)) {
        D1 = ((czas2 - CZAS) / STEP);
    }
    if (czas2 <= CZAS) {
        D1 = 0;
    }
    if (CZAS < czas1) {
        D1 = 0;
    }

    if ((czas1 <= CZAS) && (CZAS < (czas1 + ZMIANA))) {
        D2 = ((CZAS - czas1) / STEP);   
    }
    if (((czas1 + ZMIANA) <= CZAS) && (CZAS < (czas2 - ZMIANA))) {
        D2 = maxD2;
    }
    if (((czas2 - ZMIANA) <= CZAS) && (CZAS < czas2)) {
        D2 = ((czas2 - CZAS) / STEP);
    }
    if (czas2 <= CZAS) {
        D2 = 0;
    }// Ostateczna moc z uwzględnieniem potencjometrów
    // Ostateczna moc z uwzględnieniem potencjometrów
int finalPower1 = (pot1Value > 0) ? mocD1[D1] * (pot1Value / 1023.0) : 0;  // Zastosowanie wartości potencjometru
int finalPower2 = (pot2Value > 0) ? mocD2[D2] * (pot2Value / 1023.0) : 0;  // Zastosowanie wartości potencjometru

    // Zapis do wyjść PWM
    analogWrite(LED1, finalPower1);
    analogWrite(LED2, finalPower2);

    // Wyświetlanie poziomu jasności na Serial Monitor
    Serial.print("LED1 Power: ");
    Serial.print(finalPower1);
    Serial.print(" | LED2 Power: ");
    Serial.println(finalPower2);


    analogWrite(LED1, mocD1[D1]);
    analogWrite(LED2, mocD2[D2]);
    lcd.setCursor(9, 1);
    lcd.print("");
    lcd.print(' ');
    lcd.print((D1 * 100 / maxD1));
    lcd.print("%");
    lcd.setCursor(1, 1);
    lcd.print("");
    lcd.print(' ');
    lcd.print((D2 * 100 / maxD2));
    lcd.print("%");

    if (digitalRead(P1)) {
        menu = menu + 1;
    }

    // Menu do ustawiania czasu
    if (menu == 0) {
        DisplayDateTime();
    }
    if (menu == 1) {
        DisplaySetHourStart();
    }
    if (menu == 2) {
        DisplaySetMinuteStart();
    }
    if (menu == 3) {
        DisplaySetHourStop();
    }
    if (menu == 4) {
        DisplaySetMinuteStop();
    }
    if (menu == 5) {
        DisplaySetSystemHour();  // Funkcja ustawienia systemowej godziny
    }
    if (menu == 6) {
        DisplaySetSystemMinute();  // Funkcja ustawienia systemowych minut
    }
    if (menu == 7) {
        StoreSettings();
        delay(500);
        menu = 0; // Reset menu po zapisaniu
        lcd.clear(); // Wyczyść ekran po zapisaniu
    }

    delay(100);
}

void DisplayDateTime() {
    DateTime now = RTC.now();
    lcd.setCursor(0, 0);

    // Wyświetlanie godziny
    if (now.hour() <= 9) {
        lcd.print("0");
    }
    lcd.print(now.hour(), DEC);
    hourupg = now.hour();
    lcd.print(":");
    if (now.minute() <= 9) {
        lcd.print("0");
    }
    lcd.print(now.minute(), DEC);
    minupg = now.minute();
}

void DisplaySetHourStart() {
    lcd.clear();
    if (digitalRead(P2) == HIGH) {
        if (startHour == 23) {
            startHour = 0;
        } else {
            startHour = startHour + 1;
        }
    }
    if (digitalRead(P3) == HIGH) {
        if (startHour == 0) {
            startHour = 23;
        } else {
            startHour = startHour - 1;
        }
    }
    lcd.setCursor(0, 0);
    lcd.print("Set start hour:");
    lcd.setCursor(0, 1);
    lcd.print(startHour, DEC);
    delay(200);
}

void DisplaySetMinuteStart() {
    lcd.clear();
    if (digitalRead(P2) == HIGH) {
        if (startMinute == 59) {
            startMinute = 0;
        } else {
            startMinute = startMinute + 1;
        }
    }
    if (digitalRead(P3) == HIGH) {
        if (startMinute == 0) {
            startMinute = 59;
        } else {
            startMinute = startMinute - 1;
        }
    }
    lcd.setCursor(0, 0);
    lcd.print("Set start minute:");
    lcd.setCursor(0, 1);
    lcd.print(startMinute, DEC);
    delay(200);
}

void DisplaySetHourStop() {
    lcd.clear();
    if (digitalRead(P2) == HIGH) {
        if (stopHour == 23) {
            stopHour = 0;
        } else {
            stopHour = stopHour + 1;
        }
    }
    if (digitalRead(P3) == HIGH) {
        if (stopHour == 0) {
            stopHour = 23;
        } else {
            stopHour = stopHour - 1;
        }
    }
    lcd.setCursor(0, 0);
    lcd.print("Set stop hour:");
    lcd.setCursor(0, 1);
    lcd.print(stopHour, DEC);
    delay(200);
}

void DisplaySetMinuteStop() {
    lcd.clear();
    if (digitalRead(P2) == HIGH) {
        if (stopMinute == 59) {
            stopMinute = 0;
        } else {
            stopMinute = stopMinute + 1;
        }
    }
    if (digitalRead(P3) == HIGH) {
        if (stopMinute == 0) {
            stopMinute = 59;
        } else {
            stopMinute = stopMinute - 1;
        }
    }
    lcd.setCursor(0, 0);
    lcd.print("Set stop minute:");
    lcd.setCursor(0, 1);
    lcd.print(stopMinute, DEC);
    delay(200);
}

void DisplaySetSystemHour() {
    lcd.clear();
    if (digitalRead(P2) == HIGH) {
        if (hourupg == 23) {
            hourupg = 0;
        } else {
            hourupg = hourupg + 1;
        }
    }
    if (digitalRead(P3) == HIGH) {
        if (hourupg == 0) {
            hourupg = 23;
        } else {
            hourupg = hourupg - 1;
        }
    }
    lcd.setCursor(0, 0);
    lcd.print("Set hour:");
    lcd.setCursor(0, 1);
    lcd.print(hourupg, DEC);
    delay(200);
}

void DisplaySetSystemMinute() {
    lcd.clear();
    if (digitalRead(P2) == HIGH) {
        if (minupg == 59) {
            minupg = 0;
        } else {
            minupg = minupg + 1;
        }
    }
    if (digitalRead(P3) == HIGH) {
        if (minupg == 0) {
            minupg = 59;
        } else {
            minupg = minupg - 1;
        }
    }
    lcd.setCursor(0, 0);
    lcd.print("Set Minutes:");
    lcd.setCursor(0, 1);
    lcd.print(minupg, DEC);
    delay(200);
}

void StoreSettings() {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("SAVING...");
    EEPROM.write(0, startHour);
    EEPROM.write(1, startMinute);
    EEPROM.write(2, stopHour);
    EEPROM.write(3, stopMinute);
    RTC.adjust(DateTime(2024, 10, 9, hourupg, minupg, 0)); // Przykład aktualizacji czasu RTC
    delay(200);
    lcd.clear();
}
 
Odpowiedź
#2
Ustalasz sobie wartość zmiennej finalPower2 =200, czy tam z potencjometru, nie ważne, w miejscu gdzie wpisujesz PWM
if (finalPower2 >=aktualna moc kroku ) analogWrite(LED2, finalPower2 ) else analogWrite(LED2, aktualna moc kroku);
Naucz się używać millis, idea jest prosta, zamiast wstawiać delay by opóźniać jakieś działanie pomijasz wykonanie tego działania, z delay program zawsze będzie kulawy.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości