ARDUINO Помогите с кодом

ASM

★★★★✩✩✩
26 Окт 2018
1,514
294
А зачем надо было туда лезть , если все работало ?
упростить код вывода времени и датчиков, нужно чтобы чаще, городить с функцией текущей не хотел не хотел, были косяки иногда, проскакивало время между датчиками решил оптимизировать код, с delay вышло намного компактнее и красивее) в принципе можно несколько раз делать опрос времени с задержкой в секунду, вот и будут мерцания)
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
этот же код работает)
C++:
if (GetSecond()>=16 && GetSecond()<=20 || (GetSecond()>=41 &&GetSecond()<=45))
          {TempStreetToArray();}
            else if (GetSecond()>=8 && GetSecond()<=15 || (GetSecond()>=34 &&GetSecond()<=40))
            {TempToArray();}
            else if (GetSecond()>=21&& GetSecond()<=25 || (GetSecond()>=46 && GetSecond()<=50))
              {PressToArray();}
               else    {TimeToArray();}
по сути тоже самое, те же операторы, только без условий по секундам)
Просто для себя хотел узнать. Получается что за это условие Вы вызываете функцию GetSecond() 12 раз, у меня даже возникла мысль, что в процессе выполнения условия результат данной функции может поменяться. Просто хотел у ГУРУ уточнить, что в этом случае лучше делать, один раз опросить функцию, передав её значение в переменную перед условием и потом прогнать условие, или так тоже вполне адекватно?
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,188
1,280
Москва
Может поменяться. Но вероятность в данном случае мала. Тем не менее, лучше сначала получить в переменную и с ней работать, так будет правильнее и , скорее всего, даже немного быстрее.
Привыкать так писать не хорошо, т.к. можно напороться. И вообще когда что то делаешь надо четко понимать что будет в результате, так во всем.

Я довольно долго не понимал зачем детей на уроках информатики при изучении языка заставляют делать пошаговое вычисление переменных - а вот зачем, что бы понимание того , что будет.
 

ASM

★★★★✩✩✩
26 Окт 2018
1,514
294
у меня даже возникла мысль, что в процессе выполнения условия результат данной функции может поменяться
бывало такое, на короткое время) ну этот код не я придумал, он был уже, только доделал под свои нужды) больше датчиков, больше запросов)
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
бывало такое, на короткое время) ну этот код не я придумал, он был уже, только доделал под свои нужды) больше датчиков, больше запросов)
Да я всё понимаю, просто для себя узнал. Глаз резало, а главное никто не поправлял, я уж засомневался в своей адекватности.
 

ASM

★★★★✩✩✩
26 Окт 2018
1,514
294
Да я всё понимаю, просто для себя узнал. Глаз резало, а главное никто не поправлял, я уж засомневался в своей адекватности.
Хорошо, когда знаешь и понимаешь теорию)
P.S.
Я вот хочу на esp с wifi перевести без ардуино, для управления с телефона) получится осуществить, без переписывания всего кода?) Лампу Gyver делал, в настройках с wifi разберусь)
Если возможно, надо заказывать платку, зимой будет чем заняться)
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
В этом случае, как я понимаю самое главное, это написать приложение под Андроид. По мне, следующие, что я буду делать, так это играть с структурами и еепром... Сперва надо до конца понять все эти типы данных, всякие классы, структуры, бинарные операции, а потом уже думать о вафле и прочем....
 

ASM

★★★★✩✩✩
26 Окт 2018
1,514
294
@Старик Похабыч, подскажи, как проще организовать тумблер для включения смены цветов и спецэффектов.
в коде есть две функции void fadeall() и void cylon (). Чтобы они работали, в коде часов, датчиков прописаны cylon(); ledColor = ColorTable[random(16)];
и закрыт ledColor = ColorTable[2]; (любое значение, свое или из таблицы) что выключить, нужно его открыть и закрыть спецэффекты.
Хотелось бы два тумблера
Cylon = true/false
LedColor = 0/1
1 будет random
0 будет фиксированным

через if (Cylon = true), то выполнять код, а если нет, то пропускает?)
аналогично if ( LedColor = 1), то выполняем, если нет, то берем готовый?)

получилось, но появились другие проблемы, анимация смены занимает время, в тайминги не убираюсь) стандартная функция, которая была в коде только к часам уже не подходит к моей реализации с датчиками, ответ исчерпан, пост пока оставлю)
 
Изменено:

ASM

★★★★✩✩✩
26 Окт 2018
1,514
294
@DAK, так-то есть готовые программы для управления по WiFi через AT команды
 

ASM

★★★★✩✩✩
26 Окт 2018
1,514
294
bool CYLON = false;
bool FADEAL = false;

void fadeall() {
if (FADEAL=true){... } }

void cylon () {
if (CYLON=true){...
fadeal;
...}}

даже если false, функция работает) я же указал, что работать при true)
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,188
1,280
Москва
если у отображения спецэффектов есть 3 состояния, то bool я бы не брал. взять byte, тогда 0 - все выключено, 1- 1-ый спец, 2 - 2-ой, и всегда можно легко добавить 3-ий
Ну а в коде switch (nomer) и нужное делать

void cylon () {
if (!CYLON) return;
...
}
 

ASM

★★★★✩✩✩
26 Окт 2018
1,514
294
Нету трёх состояний) в коде Cylon, который ссылается для переливашек на fadeal, и LedColor, который можно сделать статичным и рандомным, надеюсь понятно)
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,188
1,280
Москва
Вот тут у каждой переменной 2 состояния, соотв есть не 3 а 4 возможных состояния всего.
bool CYLON = false;
bool FADEAL = false;

Я пока не понимаю.. завтра на свежую голову прочитаю
 

ASM

★★★★✩✩✩
26 Окт 2018
1,514
294
Еще баг словил, установка времени теперь работает только один раз за цикл (11сек)
Батарейку заменил и всё по нулям) через settime установил)
Подробнее вчерашний разговор...
cylon:
void cylon () {
  static uint8_t hue = 0;
  Serial.print("x");
  // First slide the led in one direction
  for(int i = 0; i < NUM_LEDS; i++) {
    // Set the i'th led to red
    leds[i] = CHSV(hue++, 255, 255);
    // Show the leds
    FastLED.show();
    // now that we've shown the leds, reset the i'th led to black
    // leds[i] = CRGB::Black;
    fadeall();
    // Wait a little bit before we loop around and do it again
    delay(10);
  }
  Serial.print("x");

  // Now go in the other direction. 
  for(int i = (NUM_LEDS)-1; i >= 0; i--) {
    // Set the i'th led to red
    leds[i] = CHSV(hue++, 255, 255);
    // Show the leds
    FastLED.show();
    // now that we've shown the leds, reset the i'th led to black
    // leds[i] = CRGB::Black;
    fadeall();
    // Wait a little bit before we loop around and do it again
    delay(10);
  }
}
C++:
void fadeall() { for(int i = 0; i < NUM_LEDS; i++) { leds[i].nscale8(250); } }
кусочек из кода, для восприятия
C++:
      for(int k=0; k<=27;k++){
        if (digits[digit][k] == 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      if (digit != last_digit)
      {
        //cylon();
        //ledColor =  ColorTable[random(16)];
          ledColor =  ColorTable[2];
меняя комментарии включаю/выключаю "фишки")
 

kostyamat

★★★★★★✩
29 Окт 2019
1,097
630
bool CYLON = false;
bool FADEAL = false;

void fadeall() {
if (FADEAL=true){... } }

void cylon () {
if (CYLON=true){...
fadeal;
...}}

даже если false, функция работает) я же указал, что работать при true)
А если вот так?
void fadeall() {
if (FADEAL==true){... } }

void cylon () {
if (CYLON==true){...
fadeal;
...}}
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,188
1,280
Москва
А если вот так?
void fadeall() {
if (FADEAL==true){... } }

void cylon () {
if (CYLON==true){...
fadeal;
...}}
А так будет работать.. типичная ошибка... А я уже не замтил... До 5 утра починял ребенку ноут, что бы мог смотреть свои дистанционные уроки..
А лучше всего так:

void fadeall() {
if (FADEAL){... } }

void cylon () {
if (CYLON){...
fadeal;
...}}
 
  • Лойс +1
Реакции: ASM

ASM

★★★★✩✩✩
26 Окт 2018
1,514
294
@Старик Похабыч, я так сначала хотел сделать, но добавил, чтобы явно видно было)
работает в таком виде) сейчас тогда с LedColor помучаю, на byte (0 или 1) и буду спецэффекты допиливать, не так работают, как бы мне хотелось)
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,188
1,280
Москва
в примерах лента перерисовывается после изменения каждого свтодиода. может так и надо. но от delay надо избавиться
 

ASM

★★★★✩✩✩
26 Окт 2018
1,514
294
@Старик Похабыч, пока так не работает)
byte LEDCOLOR = 1;
C++:
void color(){
   if (LEDCOLOR==0){
      long ledColor = CRGB::Aqua;}
      else if (LEDCOLOR==1){
      long ledColor = ColorTable[random(16)];}
    }
в loop color();
в коде ledColor; и ничего не кажет)
 
Изменено:

ASM

★★★★✩✩✩
26 Окт 2018
1,514
294
а точно ledColor надо лонг ?
из кода
C++:
long ledColor = CRGB::Aqua;

long ColorTable[16] = {
  CRGB::Amethyst,
  CRGB::Aqua,
  CRGB::Blue,
  CRGB::Chartreuse,
  CRGB::DarkGreen,
  CRGB::DarkMagenta,
  CRGB::DarkOrange,
  CRGB::DeepPink,
  CRGB::Fuchsia,
  CRGB::Gold,
  CRGB::GreenYellow,
  CRGB::LightCoral,
  CRGB::Tomato,
  CRGB::Salmon,
  CRGB::Red,
  CRGB::Orchid
};
 

kostyamat

★★★★★★✩
29 Окт 2019
1,097
630
@ASM, и шо?
Замените long на CRGB, скомпилируйте, и оцените разницу. Потом напишите static const CRGB ColorTable[16] = FLPROGMEM {} (надо перед include FastLED задать
#define FASTLED_USE_PROGMEM 1) и оцените еще раз.
 
Изменено: