Сегодня смок! Поздравляю сэр! (С)
Друзья , товарищи, опять нужна помощь!
проблема вот какая:
Вкладки с циклами , рассвет, закат , день, ночь. в каждом своя палитра будет. работают пока рассвет и закат. день ночь как тестовые режим.
так ввт если запускаю loop цикл ,рассвет или закат отдельно, то время смены цвета(рассвет) от черный-красный-желтый-белый можно регулировать до 30минут.
Я поставил 5минут для теста.
НО !!! теперь при срабатывании условия при котором он должен включиться ,так сказать разгореться за 5минут и гореть белым НЕРАБОТАЕТ.
Он разгорается 2ч 30мин
ПОчему??? где это исправит тыкните прожалуйста.
#include <FastLED.h> // библиотека LED
#define NUM_LEDS 30 // кол-во светодиодов
#define PIN 10 // пин ленты
#define BRIGHTNESS 240 // яркость ленты
#define LED_TYPE WS2812B // тип ленты
#define COLOR_ORDER GRB //порядок следования цветов
CRGB leds[NUM_LEDS];
#define UPDATES_PER_SECOND 100 //ХЗ ЧТО ЭТО
CRGBPalette16 currentPalette;
TBlendType currentBlending;
extern CRGBPalette16 myRedWhiteBluePalette;
extern const TProgmemPalette16 myRedWhiteBluePalette_p FL_PROGMEM;
// == Моя палитра ==
DEFINE_GRADIENT_PALETTE(heatmap_gp){
0, 255, 0, 0, // Red
32, 171, 85, 0, // Orange
64, 171, 171, 0, // Yellow
96, 0, 255, 0, // Green
128, 0, 171, 85, // Aqua
160, 0, 0, 255, // Blue
192, 85, 0, 171, // Purple
224, 171, 0, 85, // Pink
255, 255, 0, 0
}; // and back to Red
CRGBPalette16 myPal = heatmap_gp;
#include <Wire.h> // библиотеку для шины I2C
#include <Time.h> // время и текущая дата
#include <LiquidCrystal_I2C.h> // библиотека LCD
#include <DS1307RTC.h> // библиотека RTC
#include <TimeLord.h> // БИБЛИОТЕКА вычисление времени заката и рассвета
LiquidCrystal_I2C lcd(0x27, 16, 2); // LCD address to 0x3f
const int TIMEZONE = +3; // установка часового пояса ( Москва )
const float LATITUDE = 52.93; // установка координат: широта
const float LONGITUDE = 36.26; // установка координат: долгота
// переменные TimeLord
TimeLord myLord; // декларируем(обьявляем) объект
byte sunTime[6]; //
int minNow; // минуты
int minLast = -1; // -1 отрабатывает при первом запуске
int hourNow; // Часы
int hourLast = -1; // -1 отрабатывает при первом запуске
int minOfDay; // минут с начала суток
int mSunrise, mSunset; //время рассвета и заката в минутах от начала дня (0-1439)
// ==============настройка=============
void setup() {
Serial.begin(57600); // Инициализация серийного порта
Wire.begin(); // Start the I2C interface
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
//==============настройка Time lord==========
myLord.TimeZone(TIMEZONE * 60);
myLord.Position(LATITUDE, LONGITUDE);
setSyncProvider(RTC.get); // синхронизация времени с RTC
//lcd.begin();
lcd.init(); // инициализация LCD
lcd.backlight(); // включаем подсветку
lcd.clear(); // очистка дисплея
FastLED.addLeds<WS2812B, PIN, GRB>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
FastLED.setBrightness(245);
currentPalette = RainbowColors_p;
currentBlending = LINEARBLEND;
}
// ======основной цикл=======
void loop() {
if (timeStatus()!= timeNotSet)
{
minNow = minute();
if (minNow != minLast)
{
minLast = minNow;
hourNow = hour();
minOfDay = hourNow * 60 + minNow; //текущая минута дня 0-1439
if (hourNow != hourLast) // расчет времени рассвета и заката при изменении часа (раз в час)
{
//Время рассвета и заката в минутах от начала дня
sunTime[3] = day(); // текущая дата от библиотеки Time
sunTime[4] = month();
sunTime[5] = year()-2000;
sunTime[2];
sunTime[1];
myLord.SunRise(sunTime); // расчетные данные рассвета из TimeLord
mSunrise = sunTime[2] * 60 + sunTime[1] + 5; // "+20" задержка выкл утром в минутах
myLord.SunSet(sunTime); // расчетные данные заката из TimeLord
mSunset = sunTime[2] * 60 + sunTime[1] + 5; // "+15" задержка вкл вечером в минутах
hourLast = hourNow;
}
{
Serial.print("TimeNow: ");
Serial.print(hourNow);
Serial.print("-");
Serial.print(minNow);
Serial.println();
Serial.print("SunRise: ");
Serial.print(mSunrise);
Serial.println();
Serial.print("SunSet: ");
Serial.print(mSunset);
Serial.println();
}
// Упрравляем запусками циклов
// (если время рассвета (кол-во минут) <(меньше) время RTC(колич минут с начала суток)
// и (если время рассвета (кол-во минут) > то выполняем цикл sunrise()~30 минут
if (minOfDay < mSunrise || minOfDay >= mSunset)
{
sunset();
lcd.setCursor(0, 0);
lcd.print("Sunrise: ");
lcd.print(mSunrise);
}
//while (minOfDay > mSunrise || minOfDay <= (sunTime[2] * 60 + sunTime[1])) { my_pal_White(); }
// (если время заката (кол-во минут)= время RTC(колич минут с начала суток) то выполняем цикл sunrise() ~30 минут
//while (minOfDay >= mSunset-5 || minOfDay < mSunrise) { sunrise(); }
//while (minOfDay >= mSunset || minOfDay > mSunrise) { my_pal_Blue(); }
FastLED.show();
} // End: if (minNow != minLast)
} // End: if (timeStatus()!= timeNotSet)
} // End loop()
// for (инициализация; условие; изменение) { // команды, которые будут повторяться }
// for (инициализация; условие; изменение) { // команды, которые будут повторяться }
// for (инициализация; условие; изменение) { // команды, которые будут повторяться }
// for (инициализация; условие; изменение) { // команды, которые будут повторяться }
byte decToBcd(byte val){
return ( (val/10*16) + (val%10) );
}
void sunset() {
static const uint8_t sunriseLength = 5; // общая продолжительность восхода солнца, в минутах
// как часто (в секундах) должен меняться цвет индикатора нагрева?
// по умолчанию каждые 30 минут, то есть примерно каждые 7 секунд
// 7 секунд x 256 шагов градиента = 1792 секунды = ~30 минут
static const float interval = ((float)(sunriseLength * 60) / 256)*1000;
// текущий цветовой индекс палитры градиентов
static uint8_t heatIndex = 240; // start out at 0
// HeatColors_p — это градиентная палитра, встроенная в FastLED
// цвет меняется с чёрного на красный, оранжевый, жёлтый, белый
// не стесняйтесь использовать другую палитру или определите свою собственную
CRGB color = ColorFromPalette(HeatColors_p, heatIndex);
// залейте всю полосу текущим цветом
fill_solid(leds, NUM_LEDS, color);
// медленно увеличивайте огонь
EVERY_N_MILLISECONDS(interval ) { if(heatIndex > 0) { heatIndex--; } }
}
Свою палитру пока не могу запустить что то где-то ни так делаю или не понимаю((
У вас одно время со смещением на 3 часа, а второе нет
Кроме того, в процедуре sunset() с логикой совсем туго. Вы сначала безальтернативно выводите цвет на ленту, а только потом начинаете проверять - а надо ли было это делать…
Совсем не понял((( как так !? где это смещение?
Про логику цикла Loop. Это взято из примера. но там вроде все работает, так что я ничего не менял, хотел свою палитру туда но пока не получается ее запустить. ругается компилятор.
Идея такая была: для аквариума: время рассвета и заката из TimeLord.h , при совпадении с часами реалн врем запускается своя палитра Восхода с нарастанием яркости, примерно 30-40 минут, затем палитра день до наступления времени заката, время заката совпало с часами, стартует своя палитра закат минут 30 тоже, и потом палитра ночь.
Вот из примеров и сгородил((
У вас логики в коде вообще не просматривается.
Вот, смотрите:
Что тут происходит - Вы понимаете?
Если текущее время меньше времени рассвета - выполняется ваша процедура sunset(); .
Возьмем для примера, что текущее время 3 часа ночи, а рассвет - в 7 утра.
Ваша процедура начинает выполнятся сразу, потому что 3 часа меньше, чем семь. И будет выполнятся все 4 часа, пока не наступит рассвет.
А вам надо, чтобы она начала выполнятся только за пять минут до рассвета.
И как я уже писал, сама процедура sunset() тоже написана нелогично.
void sunset() {
static const uint8_t sunriseLength = 5; // общая продолжительность восхода солнца, в минутах
static const float interval = ((float)(sunriseLength * 60) / 256)*1000;
// текущий цветовой индекс палитры градиентов
static uint8_t heatIndex = 240; // start out at 0
CRGB color = ColorFromPalette(HeatColors_p, heatIndex);
// залейте всю полосу текущим цветом
fill_solid(leds, NUM_LEDS, color);
// медленно увеличивайте огонь
EVERY_N_MILLISECONDS(interval ) { if(heatIndex > 0) { heatIndex--; } }
}
смотрите - после настройки переменных interval и heatIndex вы в строке 14 заливаете полосу светом. И только потом, в строке 17, меняете цветовой индекс и проверяете, не кончился ли цикл.
А когда цикл дойдет до нуля, вы все равно снова и снова будете заливать полосу цветом, хотя это может давным давно никому не нужно.
Правильно было бы СНАЧАЛА поставить условие цикла - и только если оно выполняется, менять цвет и заливать полосу.
Кроме того, в макросе EVERY_N_MILLISECONDS(interval ) параметр interval должен быть целым, а у вас он float. В данном случае, скорее всего, ничего страшного - но вообще эта такая “мелочь”, которая запросто может сломать всю программу.
Тут примерно понял, что делать. Спасибо огромное
Текущее время в мин. = время рассвета в мин.
Выполняем {sunset();}
Так?
Или же нужно БОЛЬШЕ РАВНО знак, тогда
БОЛЬШЕ нужно ограничение НЕ БОЛЬШЕ стольких то минут ставить. Ну или как то так.
Вот сделал условие, компилятор не ругается, все загрузилось, но что то не так.
Цикл my_pal_Blue выполняется с задержкой, точнее бегущий огонек 1 раз пробегает по ленте и дальше она не горит некоторое время , через наверно 1 минуту опять.
Я так понимаю что условие работает НО…
//====== Упрравляем запусками циклов======
if (minOfDay > 0 && minOfDay < mSunrise) { my_pal_Blue();
// при выполнении выводи длительность на диспл
lcd.setCursor(9, 0);
lcd.print("Night: ");
lcd.setCursor(9, 1);
lcd.print(mSunrise + (1439-mSunset)); //длительность ночи AM
}
if (minOfDay >= mSunrise && minOfDay < mSunriseOff) { sunrise();
// при выполнении выводи длительность на диспл
lcd.setCursor(9, 0);
lcd.print("SunR: ");
lcd.setCursor(9, 1);
lcd.print(mSunrise - mSunriseOff); //длительность рассвета
}
if (minOfDay >= mSunriseOff && minOfDay < mSunset) { my_pal_White();
// при выполнении выводи длительность на диспл
lcd.setCursor(9, 0);
lcd.print("Day: ");
lcd.setCursor(9, 1);
lcd.print(mSunset - mSunriseOff); //длительность дня
}
if (minOfDay >= mSunset && minOfDay < mSunsetOff) { sunset();
// при выполнении выводи длительность на диспл
lcd.setCursor(9, 0);
lcd.print("SunS: ");
lcd.setCursor(9, 1);
lcd.print(mSunsetOff - mSunset); //длительность заката
}
if (minOfDay >= mSunsetOff && minOfDay < 1439) { my_pal_Blue();
// при выполнении выводи длительность на диспл
lcd.setCursor(9, 0);
lcd.print("Night: ");
lcd.setCursor(9, 1);
lcd.print(1439 - mSunsetOff); //длительность ночи PM
}
// при выполнении выводи длительность на диспл
//lcd.setCursor(10, 1);
//lcd.print("Strt: ");
//lcd.print(mSunrise - mSunriseOff);
//lcd.setCursor(10, 1);
//lcd.print("Day: ");
//lcd.print(mSunset - mSunrise);
FastLED.show();
} // End: if (minNow != minLast)
} // End: if (timeStatus()!= timeNotSet)
} // End loop()
byte decToBcd(byte val){
return ( (val/10*16) + (val%10) );
}
Наверно нужно все было вставить
#include <FastLED.h> // библиотека LED
#define NUM_LEDS 30 // кол-во светодиодов
#define PIN 10 // пин ленты
#define BRIGHTNESS 240 // яркость ленты
#define LED_TYPE WS2812B // тип ленты
#define COLOR_ORDER GRB //порядок следования цветов
CRGB leds[NUM_LEDS];
#define UPDATES_PER_SECOND 100 //ХЗ ЧТО ЭТО
CRGBPalette16 currentPalette;
TBlendType currentBlending;
extern CRGBPalette16 myRedWhiteBluePalette;
extern const TProgmemPalette16 myRedWhiteBluePalette_p FL_PROGMEM;
// == Моя палитра ==
DEFINE_GRADIENT_PALETTE(heatmap_gp){
0, 255, 0, 0, // Red
32, 171, 85, 0, // Orange
64, 171, 171, 0, // Yellow
96, 0, 255, 0, // Green
128, 0, 171, 85, // Aqua
160, 0, 0, 255, // Blue
192, 85, 0, 171, // Purple
224, 171, 0, 85, // Pink
255, 255, 0, 0
}; // and back to Red
CRGBPalette16 myPal = heatmap_gp;
#include <Wire.h> // библиотеку для шины I2C
#include <Time.h> // время и текущая дата
#include <LiquidCrystal_I2C.h> // библиотека LCD
#include <DS1307RTC.h> // библиотека RTC
#include <TimeLord.h> // БИБЛИОТЕКА вычисление времени заката и рассвета
LiquidCrystal_I2C lcd(0x27, 16, 2); // LCD address to 0x3f
const int TIMEZONE = +3; // установка часового пояса ( Москва )
const float LATITUDE = 52.93; // установка координат: широта
const float LONGITUDE = 36.26; // установка координат: долгота
// переменные TimeLord
TimeLord myLord; // декларируем(обьявляем) объект
byte sunTime[6]; //
int minNow; // минуты
int minLast = -1; // -1 отрабатывает при первом запуске
int hourNow; // Часы
int hourLast = -1; // -1 отрабатывает при первом запуске
int minOfDay; // минут с начала суток
int mSunrise, mSunset; //время рассвета и заката в минутах от начала дня (0-1439)
int mSunriseOff, mSunsetOff; //время завершения рассвета и заката в минутах
// ==============настройка=============
void setup() {
Serial.begin(57600); // Инициализация серийного порта
Wire.begin(); // Start the I2C interface
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
//==============настройка Time lord==========
myLord.TimeZone(TIMEZONE * 60);
myLord.Position(LATITUDE, LONGITUDE);
setSyncProvider(RTC.get); // синхронизация времени с RTC
//lcd.begin();
lcd.init(); // инициализация LCD
lcd.backlight(); // включаем подсветку
lcd.clear(); // очистка дисплея
FastLED.addLeds<WS2812B, PIN, GRB>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
FastLED.setBrightness(245);
currentPalette = RainbowColors_p;
currentBlending = LINEARBLEND;
}
// ======основной цикл=======
void loop() {
if (timeStatus()!= timeNotSet)
{
minNow = minute();
if (minNow != minLast)
{
minLast = minNow;
hourNow = hour();
minOfDay = hourNow * 60 + minNow; //текущая минута дня 0-1439
if (hourNow != hourLast) // расчет времени рассвета и заката при изменении часа (раз в час)
{
//Время рассвета и заката в минутах от начала дня
sunTime[3] = day(); // текущая дата от библиотеки Time
sunTime[4] = month();
sunTime[5] = year()-2000;
sunTime[2];
sunTime[1];
myLord.SunRise(sunTime); // расчетные данные рассвета из TimeLord
mSunrise = sunTime[2] * 60 + sunTime[1]; // восход в мин
mSunriseOff = mSunrise + 40 ; //Конец рассвета
myLord.SunSet(sunTime); // расчетные данные заката из TimeLord
mSunset = sunTime[2] * 60 + sunTime[1]; // закат в мин
mSunsetOff = mSunset + 40 ; //конец заката
//Конец ночи
//Начало ночи
}
{
Serial.print("TimeNow: ");
Serial.print(hourNow);
Serial.print("-");
Serial.print(minNow);
Serial.println();
Serial.print("SunRise: ");
Serial.print(mSunrise);
Serial.println();
Serial.print("SunSet: ");
Serial.print(mSunset);
Serial.println();
Serial.print("mSunriseOff: ");
Serial.print(mSunriseOff);
Serial.println();
Serial.print("mSunsetOff: ");
Serial.print(mSunsetOff);
Serial.println();
lcd.setCursor(0, 0);
lcd.print("SR: ");
lcd.print(mSunrise);
lcd.setCursor(0, 1);
lcd.print("SS: ");
lcd.print(mSunset);
}
//====== Упрравляем запусками циклов======
if (minOfDay > 0 && minOfDay < mSunrise) { my_pal_Blue();
// при выполнении выводи длительность на диспл
lcd.setCursor(9, 0);
lcd.print("Night: ");
lcd.setCursor(9, 1);
lcd.print(mSunrise + (1439-mSunset)); //длительность ночи AM
}
if (minOfDay >= mSunrise && minOfDay < mSunriseOff) { sunrise();
// при выполнении выводи длительность на диспл
lcd.setCursor(9, 0);
lcd.print("SunR: ");
lcd.setCursor(9, 1);
lcd.print(mSunrise - mSunriseOff); //длительность рассвета
}
if (minOfDay >= mSunriseOff && minOfDay < mSunset) { my_pal_White();
// при выполнении выводи длительность на диспл
lcd.setCursor(9, 0);
lcd.print("Day: ");
lcd.setCursor(9, 1);
lcd.print(mSunset - mSunriseOff); //длительность дня
}
if (minOfDay >= mSunset && minOfDay < mSunsetOff) { sunset();
// при выполнении выводи длительность на диспл
lcd.setCursor(9, 0);
lcd.print("SunS: ");
lcd.setCursor(9, 1);
lcd.print(mSunsetOff - mSunset); //длительность заката
}
if (minOfDay >= mSunsetOff && minOfDay < 1439) { my_pal_Blue();
// при выполнении выводи длительность на диспл
lcd.setCursor(9, 0);
lcd.print("Night: ");
lcd.setCursor(9, 1);
lcd.print(1439 - mSunsetOff); //длительность ночи PM
}
// при выполнении выводи длительность на диспл
//lcd.setCursor(10, 1);
//lcd.print("Strt: ");
//lcd.print(mSunrise - mSunriseOff);
//lcd.setCursor(10, 1);
//lcd.print("Day: ");
//lcd.print(mSunset - mSunrise);
FastLED.show();
} // End: if (minNow != minLast)
} // End: if (timeStatus()!= timeNotSet)
} // End loop()
byte decToBcd(byte val){
return ( (val/10*16) + (val%10) );
}
Цикл ночь
void my_pal_Blue()
{// Move a single white led
for(int whiteLed = 0; whiteLed < NUM_LEDS; whiteLed = whiteLed + 1) {
// Turn our current led on to white, then show the leds
leds[whiteLed] = CRGB::Blue;
// Show the leds (only one of which is set to white, from above)
FastLED.show();
// Wait a little bit
delay(100);
// Turn our current led back to black for the next loop around
leds[whiteLed] = CRGB::Black;
}
}
Цикл рассвет
void sunrise() {
static const uint8_t sunriseLength = 40; // общая продолжительность восхода солнца, в минутах
// как часто (в секундах) должен меняться цвет индикатора нагрева?
// по умолчанию каждые 30 минут, то есть примерно каждые 7 секунд
// 7 секунд x 256 шагов градиента = 1792 секунды = ~30 минут
static const float interval = ((float)(sunriseLength * 60) / 256)*1000;
// текущий цветовой индекс палитры градиентов
static uint8_t heatIndex = 0; // start out at 0
// HeatColors_p — это градиентная палитра, встроенная в FastLED
// цвет меняется с чёрного на красный, оранжевый, жёлтый, белый
// не стесняйтесь использовать другую палитру( ) или определите свою собственную
CRGB color = ColorFromPalette(HeatColors_p, heatIndex);
// залейте всю полосу текущим цветом
fill_solid(leds, NUM_LEDS, color);
// медленно увеличивайте огонь
EVERY_N_MILLISECONDS( interval ) { if (heatIndex < 240) { heatIndex++;}
if (heatIndex == 240) {heatIndex = 0;}
}
}