Close

Odpověď na: Osvětlení akvaria Led pásky

Úvodní stránka Fórum Vaše projekty Arduino Osvětlení akvaria Led pásky Odpověď na: Osvětlení akvaria Led pásky

#8960
posjirka
Účastník

to nasranek:
onečně jsem dokopal k tomu abych někde ukazal jak jsem myslel linearni rozložení rozsvěcení/zhasnutí na základě času. Trachu jsem upravil/zjednodušil tvůj program a mírně z přeházel některé funkce. Ta uprava co jsem udělal by měla odstranit ten neduh o zpožděné reakci v důsledku dlouhého delay(). Zjednodušil jse to proto aby bylo poznat co se tam měnilo. Jestli máš chut tak to prosím vyzkoušej. krok se mění 1x za minutu a funkcí map() se přepočítává na rozsah 0-255.

#include <Wire.h>
#include <DS3231.h>
#define DS3231_I2C_ADDRESS 0x68
DS3231  rtc(SDA, SCL);

int svetlo1 = 11;//pwm vystup
int den = 9*60; // od kdy je den
int noc = 21*60;// od kdy je noc
int svetlo = 42; // doba rozsveceni/zhasnuti
int cas = 0; // nasobek aktualnich hodin a minut
byte jas = 0; // velikost jasu 0-255
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

void setup()
{
  rtc.begin();
  lcd.clear();//smaže obrazovku
  lcd.setContrast(30);//nastavení kontrastu je to individuální, mám jich několik a každý chce něco jiného ale je to v rozmezí 30-60
  Wire.begin();
  pinMode(svetlo1, OUTPUT);
}

byte decToBcd(byte val){
  return ( (val / 10 * 16) + (val % 10) );
}

byte bcdToDec(byte val){
  return ( (val / 16 * 10) + (val % 16) );
}

void readDS3231time(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year)
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}

void loop()
{
  delay(1000);
  byte s, m, h, dvt, dvm, mesic, r;
  readDS3231time(&s, &m, &h, &dvt, &dvm, &mesic, &r);
  analogWrite(svetlo1, brightness);
  
  cas = h*m; // nasobek minut a hodin
  if (cas < den) {
    jas = 0; // jeste neni den tak nesvit
  } else {  
    if(cas < (den+svetlo)}{
      jas = map(cas, den, (den+svetlo), 0, 255); // rozsveceni
    }
  }
  if (cas > (noc + svetlo)) {
    jas = 0; // jeste neni den tak nesvit  
  } else {
    if (cas > noc){
      jas = map(cas, noc, (noc+svetlo), 255, 0); // zhasnuti  
    }
  }
}