Виж темите без отговор | Виж активните теми
Дата и час: Чет Апр 18, 2024 8:46 am
Arduino - fadeIn(); fadeOut(); функции
Автор |
Съобщение |
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 5:52 pm Мнения: 10368 Местоположение: Добрич
|
Re: Arduino - fadeIn(); fadeOut(); функции
Първо си оправи кода, после се сърди... Като начало НЕ ползвай sizeof на отворен масив, подавай си размера и/или броя на елементите, след това си оправи циклите.
|
Пет Яну 12, 2018 11:36 am |
|
|
maguss4o
Ранг: Минаващ
Регистриран на: Пон Май 06, 2013 10:58 pm Мнения: 15
|
Re: Arduino - fadeIn(); fadeOut(); функции
Добре де объркал съм се. 125.00 За какво да задавам ръчно колко е голям масива, като искам тази функция независимо колко елемента има като вход на първия параметър (масив) сама да си изчислява. Представи си, че на едно място искам да имам fadeIn на 2 елемента, на друго място на 3 елемента и на друго място на 6 елемента. Какво трябва да направя 3 различни fadeIn функции ли ? Моля Ви се... Вече втора страница само се обяснявам тука и не съм получил никаква помощ. Заебете... Приятен ден.
|
Пет Яну 12, 2018 11:57 am |
|
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 10:22 pm Мнения: 3074
|
Re: Arduino - fadeIn(); fadeOut(); функции
Трябва да предадеш към функцията И броя елементи в масива; Ако помислиш малко, ще разбереш ,че функция, която да определи броят елементи в масив от байтове, интове , лонгове и доблета - не може да се напише ; Приятен ден!
|
Пет Яну 12, 2018 12:21 pm |
|
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 5:52 pm Мнения: 10368 Местоположение: Добрич
|
Re: Arduino - fadeIn(); fadeOut(); функции
Е ти може да искаш много работи, но такава функция няма При Ц/Ц++ типът "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 |
|
|
maguss4o
Ранг: Минаващ
Регистриран на: Пон Май 06, 2013 10:58 pm Мнения: 15
|
Re: Arduino - fadeIn(); fadeOut(); функции
Ок напрвих го това. В момента мигат и трите ЛЕД едновременно. Сега трябва да направя проверка в кой цикъл е (а) и някаква си зависимост да започва самия fade. Ако е в първи цикъл почва първия led. Втори цикъл почва втория лед и трети цикъл почва третия лед. При втори цикъл първи лед е на 100%, трети цикъл втори лед е на 100% и четвърти цикъл трети лед е на 100%. Така ли е ? Това с for и if как би станало ?
|
Пет Яну 12, 2018 12:40 pm |
|
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 5:52 pm Мнения: 10368 Местоположение: Добрич
|
Re: Arduino - fadeIn(); fadeOut(); функции
Искаш да кажеш, че индексът "първи", "втори" и т.н. са относителни и зависят от цикъла? относителен_индекс = (индекс + цикъл) % (брой_индекси+1) ; analogWrite(myArray[относителен_индекс], ...);
|
Пет Яну 12, 2018 2:22 pm |
|
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 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 |
|
|
maguss4o
Ранг: Минаващ
Регистриран на: Пон Май 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 |
|
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 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] Махането на дилея е правилно , тая функция трябва да се ползва много консервативно. Обаче ще ти трябва по-друга организация на програмата . Успех ,,,, и го карай по-кротко. БТВ , за американските и българските форуми - нямаш идея как боцкат и у американските . Просто си трябва и малко късмет - за едно или друго.
|
Пет Яну 12, 2018 7:15 pm |
|
|
ike
Ранг: Форумен бог
Регистриран на: Пет Фев 04, 2005 8:59 pm Мнения: 6019 Местоположение: София
|
Re: Arduino - fadeIn(); fadeOut(); функции
Всъщност той е питал: https://forum.arduino.cc/index.php?topic=520761.0но не съм сигурен дали е американски или италиянски.
_________________ Warriors of the Night, ASSEMBLER!!!
|
Пет Яну 12, 2018 8:20 pm |
|
|
tolstolob
Ранг: Ориентиран
Регистриран на: Вто Фев 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 |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 4 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|