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
25.10.2016 v 19:29
#8960
Úč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
}
}
}