Отговори на тема  [ 26 мнения ]  Отиди на страница Предишна  1, 2
Arduino - fadeIn(); fadeOut(); функции 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 5:52 pm
Мнения: 10368
Местоположение: Добрич
Мнение Re: Arduino - fadeIn(); fadeOut(); функции
maguss4o написа:
Колега ако няма какво да кажеш, просто си замълчи или всичките ти там 1500+ постове са ти като този ... ?


Първо си оправи кода, после се сърди...
Като начало НЕ ползвай sizeof на отворен масив, подавай си размера и/или броя на елементите, след това си оправи циклите.


Пет Яну 12, 2018 11:36 am
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Пон Май 06, 2013 10:58 pm
Мнения: 15
Мнение Re: Arduino - fadeIn(); fadeOut(); функции
stefan63 написа:
Цитат:
#обикновен double, това връща резултат 5000/(2+2)/10=1500.00, което е секцията на 50% при 3 елемента в масив

5000/(2+2)/10=1500.00
Това в каква математика ? Ардуино?
Аз поне не съм чувал за "обикновен double".

Добре де объркал съм се. 125.00

miro_atc написа:
maguss4o написа:
Колега ако няма какво да кажеш, просто си замълчи или всичките ти там 1500+ постове са ти като този ... ?


Първо си оправи кода, после се сърди...
Като начало НЕ ползвай sizeof на отворен масив, подавай си размера и/или броя на елементите, след това си оправи циклите.


За какво да задавам ръчно колко е голям масива, като искам тази функция независимо колко елемента има като вход на първия параметър (масив) сама да си изчислява. Представи си, че на едно място искам да имам fadeIn на 2 елемента, на друго място на 3 елемента и на друго място на 6 елемента. Какво трябва да направя 3 различни fadeIn функции ли ? Моля Ви се... Вече втора страница само се обяснявам тука и не съм получил никаква помощ. Заебете... Приятен ден.


Пет Яну 12, 2018 11:57 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 10:22 pm
Мнения: 3074
Мнение Re: Arduino - fadeIn(); fadeOut(); функции
Цитат:
Представи си, че на едно място искам да имам fadeIn на 2 елемента, на друго място на 3 елемента и на друго място на 6 елемента. Какво трябва да направя 3 различни fadeIn функции ли ?

Трябва да предадеш към функцията И броя елементи в масива;
Ако помислиш малко, ще разбереш ,че функция, която да определи броят елементи в масив от байтове, интове , лонгове и доблета - не може да се напише ;
Приятен ден!


Пет Яну 12, 2018 12:21 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 5:52 pm
Мнения: 10368
Местоположение: Добрич
Мнение Re: Arduino - fadeIn(); fadeOut(); функции
maguss4o написа:

За какво да задавам ръчно колко е голям масива, като искам тази функция независимо колко елемента има като вход на първия параметър (масив) сама да си изчислява.


Е ти може да искаш много работи, но такава функция няма ;-)

При Ц/Ц++ типът "int myArray[]" се нарича отворен масив и ако няма инициализация неговият размер е неясен. Някои компилатори мисля го приемаха по подразбиране с 1 елемент, други с 0, което при всички случаи е много различно от това дето очакваш. Има и още особености, но засега просто не използвай sizeof за такъв тип!
Освен това sizeof() връща размер в байтове, а не брой елементи. Така че ако искаш да го ползваш в цикли е редно да разделиш размера на целия масив спрямо размера на един елемент.

Примерно....
int myFadeIn[3] = {led1, led2, led3};

това е масив с 3 елемента. sizeof (myFadeIn) ще ти върне размер в байтове (който обаче варира според таргета за който компилираш). Ако искаш броя на елементите трябва да ползваш

sizeof (myFadeIn)/sizeof(int)

може и така:
sizeof(myFadeIn) / sizeof(myFadeIn[0])

Последното ще те предпази от бъг, ако случайно някой ден решиш да смениш типа на елементите на масива.


Пет Яну 12, 2018 12:40 pm
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Пон Май 06, 2013 10:58 pm
Мнения: 15
Мнение Re: Arduino - fadeIn(); fadeOut(); функции
stefan63 написа:
Цитат:
Представи си, че на едно място искам да имам fadeIn на 2 елемента, на друго място на 3 елемента и на друго място на 6 елемента. Какво трябва да направя 3 различни fadeIn функции ли ?

Трябва да предадеш към функцията И броя елементи в масива;
Ако помислиш малко, ще разбереш ,че функция, която да определи броят елементи в масив от байтове, интове , лонгове и доблета - не може да се напише ;
Приятен ден!


Ок напрвих го това. В момента мигат и трите ЛЕД едновременно.

Код:
void fadeIn(int myArray[], int time, int arraySize){
  double sectionFade = (time/(arraySize+1));
  int brightness, realBrightness = 0;

  for(int a = 0; a < arraySize+1; a++){
    for(int sectionTime = 0; sectionTime < sectionFade; sectionTime+=10){
      realBrightness = map(sectionTime, 0, sectionFade, 0, 127);
     
      for(int i = 0; i < arraySize; i++){
        analogWrite(myArray[i], realBrightness);
      }
      delay(10);
    }
  }
}


Сега трябва да направя проверка в кой цикъл е (а) и някаква си зависимост да започва самия fade. Ако е в първи цикъл почва първия led. Втори цикъл почва втория лед и трети цикъл почва третия лед. При втори цикъл първи лед е на 100%, трети цикъл втори лед е на 100% и четвърти цикъл трети лед е на 100%. Така ли е ? Това с for и if как би станало ?


Пет Яну 12, 2018 12:40 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 5:52 pm
Мнения: 10368
Местоположение: Добрич
Мнение Re: Arduino - fadeIn(); fadeOut(); функции
maguss4o написа:
Сега трябва да направя проверка в кой цикъл е (а) и някаква си зависимост да започва самия fade. Ако е в първи цикъл почва първия led. Втори цикъл почва втория лед и трети цикъл почва третия лед. При втори цикъл първи лед е на 100%, трети цикъл втори лед е на 100% и четвърти цикъл трети лед е на 100%. Така ли е ? Това с for и if как би станало ?


Искаш да кажеш, че индексът "първи", "втори" и т.н. са относителни и зависят от цикъла?

относителен_индекс = (индекс + цикъл) % (брой_индекси+1) ;

analogWrite(myArray[относителен_индекс], ...);


Пет Яну 12, 2018 2:22 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 10:22 pm
Мнения: 3074
Мнение Re: Arduino - fadeIn(); fadeOut(); функции
При 3 лампи цялото време се разделя на 4 подцикъла (0-50% или от50до100%)
при 4 - на 5 подцикъла, при 5 лампи - на 6 подцикъла;
ОбщияБройПодцикли е равен на броя лампи+1;
Тоест делиш ВремеПодцикъл= time(5000) /arraysize+1(3+1) и получаваш времето на подцикъла ;(Разкарай това "double");
Ако си фиксирал 10 милисекунди стъпка - стъпката на изменение в подцикъла
е СтъпкаПроценти=ВремеПодикъл/10 ;

Яркоста ще се променя от 0 до 100 с тази стъпка;


Почва цикълА от 0 до ОбщБройПодцикли-1 ,стъпка 1 ;
{//начало на цикълА
//Отброяване на ламповияПодцикъл с малък
ЦикълБ от 0 до ВремеПодцикъл-10, стъпка 10 (мс)
{ //начало на цикълБ
//Цикъл за обработка на лампите
ЦикълВ - номер на лампа ,от 0 до БройЛампи-1 ,стъпка 1
{//начало на ЦикълВ
Ако номерът на лампата е == на номера на подцикъла
ИЛИ
номерът на лампата+1 е == на номера на подцикъла
ТО следва изчисление на яркостта
ИНАЧЕ яркостта е =0;
Запис(номер на лампа, изчислена яркост) ;

}//край на цикълВ
дилей10мс;
}; //край на цикъл Б

}//край на цикъл А


Пет Яну 12, 2018 3:13 pm
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Пон Май 06, 2013 10:58 pm
Мнения: 15
Мнение Re: Arduino - fadeIn(); fadeOut(); функции
@stefan63 - благодаря ти. Същата логика си мислех и аз докато бях на кафе до преди малко. Работи до някъде, но може и да имам някъде грешка :) Сега ще го мъдря да пренапиша функцията, така че да избягам и от delay().

Код:
void fadeIn(int myArray[], int time, int arraySize) {
  int sectionFade = (time / (arraySize + 1));
  int brightness, realBrightness = 0;

  for (int a = 0; a < arraySize + 1; a++) {
    for (int sectionTime = 0; sectionTime < sectionFade; sectionTime += 10) {

      realBrightness = map(sectionTime, 0, sectionFade, 0, 127);
      for (int i = 0; i < arraySize; i++) {
        if (i == a) {
          analogWrite(myArray[i], realBrightness);
        } else if (i + 1 == a) {
          analogWrite(myArray[i], realBrightness * 2);
          if (analogRead(myArray[i]) >= 254) {
            digitalWrite(myArray[i], HIGH);
          }
        }
      }
      delay(10);
    }
  }
}


Пет Яну 12, 2018 3:44 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 10:22 pm
Мнения: 3074
Мнение Re: Arduino - fadeIn(); fadeOut(); функции
Нещо такова, да.

Код:
void fadeIn(int myArray[], int time, int arraySize) {
  int sectionFade = (time / (arraySize + 1));
  int brightness, realBrightness = 0;

  for (int a = 0; a < arraySize + 1; a++) {
    for (int sectionTime = 0; sectionTime < sectionFade; sectionTime += 10) {

      realBrightness = map(sectionTime, 0, sectionFade, 0, 127);
//Ако правилно съм разбрал - половин цикъл (от 0 до 50% ) го преобразува
// в число 0,,127,
//а 0..100% отговаря на 0,,255
     
      for (int i = 0; i < arraySize; i++)
      {
        brightness=0;///////
        if (i == a)
          {
             brightness= realBrightness;
            /////  analogWrite(myArray[i], realBrightness);
          } else
           if (i + 1 == a)
              {  brightness= realBrightness+128;
                // analogWrite(myArray[i], realBrightness +127);
       
           // if (analogRead(myArray[i]) >= 254) { ///Това не схващам какво ще прави.
           // digitalWrite(myArray[i], HIGH);

             };
         
           analogWrite(myArray[i], brightness); //това И изключва светната лампа след
              //като са минали нейните 100% ;
        }
      }
      delay(10);
    }
  }
}
[/quote]

Махането на дилея е правилно , тая функция трябва да се ползва много консервативно. Обаче ще ти трябва по-друга организация на програмата .

Успех ,,,, и го карай по-кротко.
БТВ , за американските и българските форуми - нямаш идея как боцкат и у американските . Просто си трябва и малко късмет - за едно или друго. :D


Пет Яну 12, 2018 7:15 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 04, 2005 8:59 pm
Мнения: 6019
Местоположение: София
Мнение Re: Arduino - fadeIn(); fadeOut(); функции
stefan63 написа:
Успех ,,,, и го карай по-кротко.
БТВ , за американските и българските форуми - нямаш идея как боцкат и у американските . Просто си трябва и малко късмет - за едно или друго. :D

Всъщност той е питал: https://forum.arduino.cc/index.php?topic=520761.0
но не съм сигурен дали е американски или италиянски.

_________________
Warriors of the Night, ASSEMBLER!!!


Пет Яну 12, 2018 8:20 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 06, 2007 1:45 am
Мнения: 260
Мнение Re: Arduino - fadeIn(); fadeOut(); функции
Моите 5 ст.:
Код:
#define LED_COUNT            3
#define PATTERN_STEPS_COUNT  (sizeof(patternFadeIn) / sizeof(patternFadeIn[0]))

typedef struct {
    int  physicalPinId;
    int  delaytimer;
    int  step;
} led_status_t;

struct {
    led_status_t  LED[ LED_COUNT ];
       const int* pPattern;
             int  stepDuration;
} status;

const int  patternFadeIn[] = { 0, 64, 128, 255 };
const int  patternFadeOut[] = { 255, 128, 64, 0 };
const int  pins[] = { 9, 10, 11 };

void setup() {
   
    for (int i = 0; i < LED_COUNT; i++)
    {
        pinMode(pins[i], OUTPUT);
    }
}

void loop() {
    FadeIn( pins, 5000 );
    FadeOut( pins, 5000 );
}

void FadeIn(int  pins[], int time)
{
    StartPattern(pins, time, patternFadeIn );
   
    do {
        LED_Task();
    } while (!IsPatternFinished());
}

void FadeOut(int  pins[], int time)
{
    StartPattern(pins, time, patternFadeOut );
   
    do {
        LED_Task();
    } while (!IsPatternFinished());
}

void StartPattern(int  pins[], int time, int*  pattern)
{
    for (int i = 0; i < LED_COUNT; i++)
    {
        status.LED[i].physicalPinId = pins[i];
        status.LED[i].delaytimer = ((PATTERN_STEPS_COUNT * i) / LED_COUNT);
        status.LED[i].step = 0;
    }
   
    status.stepDuration = (time / PATTERN_STEPS_COUNT);
    status.pPattern = pattern;
}

void LED_Task()
{
    for (int i = 0; i < LED_COUNT; i++)
    {
        if (status.LED[i].delaytimer == 0)
        {
            if (status.LED[i].step < PATTERN_STEPS_COUNT)
            {
                analogWrite( status.LED[i].physicalPinId, status.pPattern[ status.LED[i].step ]);
                status.LED[i].step++;
            }
        }
        else
        {
            status.LED[i].delaytimer--;
        }
    }
   
    delay( status.stepDuration );
}

boolean IsPatternFinished()
{
    for (int i = 0; i < LED_COUNT; i++)
    {
        if (status.LED[i].step != PATTERN_STEPS_COUNT)
        {
            return false;
        }
    }
   
    return true;
}


Пет Яну 12, 2018 9:15 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 26 мнения ]  Отиди на страница Предишна  1, 2

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 4 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни