выполнил 3эксперимент, почитал про ответ на вопрос, сделал задание но. захотел сделать так 1й диод моргает 2й управляемый резистором. код прописал. не пойму что не так. Моргать моргает а вот на резистор реагирует криво ( в одном положении выкл в другом вкл - плавной рез не выходит) в чем причина? // 1н моргает пин 9 2й регулируется потенциометром пин 5 #define LED_PIN9 9 #define POT_PIN A0 #define LED_PIN5 5 void setup() { pinMode(LED_PIN9, OUTPUT); pinMode(LED_PIN5, OUTPUT); pinMode(POT_PIN, INPUT); } void loop() { int rotation, brightness; rotation = analogRead(POT_PIN); brightness = rotation/4; analogWrite(LED_PIN5, brightness); digitalWrite(9, HIGH); delay(100); digitalWrite(9, LOW); delay(900); }
Либо delay(30);, думаю не заметите дрожания. и последний delay(900); можно убрать) UPD2: Получается, что вы хотите 2 процесса одновременно делать, ардуино так не может.
У меня своя библиотека написана. Мигающую лампочку вывожу так. Код (Text): #include <Meander.h> #define LED_PIN 7 //PIN светодиода #define Period 1000 //Период меандра #define Duration 500 //Импульс меандра Meander P_1s; void setup() { //Режимы выходов pinMode(LED_PIN, OUTPUT); } void loop() { P_1s.MeanderV(Period, Duration); digitalWrite(LED_PIN, P_1s.Q0()); //Выводим меандр на лампочку. }
Всего-то написать собственную многозадачность, которая будет переключать контекст между функциями процессов по вызову специальной функции (корпоративная) или по таймеру (уже привычная нам). А если серьезно, то надо просто разбить действия, которые надо производить параллельно, на небольшие атомарные элементы и выполнять их по очереди. В общем случае примерно так: Код (Text): # define maxprocessA 4 # define maxprocessB 1 void processA(){ static unsigned int iA=0; switch(iA % (maxprocessA+1)) { case 0: Serial.print("0");break; case 1: Serial.print("1");break; case 2: Serial.print("2");break; case 3: Serial.print("3");break; case 4: Serial.print("4");break; } iA++; if (iA>=(maxprocessA+1)) iA=0; } void processB(){ static unsigned int iB=0; switch(iB % (maxprocessB+1)) { case 0: Serial.print("A");break; case 1: Serial.print("B");break; } iB++; if (iB>=(maxprocessB+1)) iB=0; } void setup(){ Serial.begin (9600); } void loop(){ processA(); processB(); }
Собрал, оно реагирует правильно и можно менять потенциометром яркость диода с одним НО: Считывание потенциометра раз в один цикл (порядка одной секунды в вашем случае). Можно, например, привязаться к таймеру для обхода этой ситуации.
Вот топорный вариант накидал Код (Text): // 1н моргает пин 9 2й регулируется потенциометром пин 5 #define LED_PIN9 9 #define POT_PIN A0 #define LED_PIN5 5 void setup() { pinMode(LED_PIN9, OUTPUT); pinMode(LED_PIN5, OUTPUT); pinMode(POT_PIN, INPUT); } void loop() { int rotation, brightness,doptime; rotation = analogRead(POT_PIN); brightness = rotation/4; analogWrite(LED_PIN5, brightness); doptime = millis() % 1000; //когда остаток от деления значения в таймере на 1000 будет меньше 100 //один из диодов вкл, иначе будет выключен - тем самым //мы ушли от использования delay //что позволяет постоянно проверять А0 и выставлять яркость диода if (doptime < 100) {digitalWrite(LED_PIN9, HIGH); } else { digitalWrite(LED_PIN9, LOW); } }
В данном простом случае Код (Text): #define LED_PIN9 9 #define POT_PIN A0 #define LED_PIN5 5 void setup() { pinMode(LED_PIN9, OUTPUT); pinMode(LED_PIN5, OUTPUT); pinMode(POT_PIN, INPUT); } void processLed9() { static int state=0 static unsigned long int time=0; switch(state){ case 0: digitalWrite(LED_PIN9, HIGH); if (time-millis()>=100) { state=1; time=millis(); } break; case 1: digitalWrite(LED_PIN9, LOW); if (time-millis()>=900) { state=0; time=millis(); } break; } } void processLed5() { int rotation, brightness; rotation = analogRead(POT_PIN); brightness = rotation/4; analogWrite(LED_PIN5, brightness); } void loop() { void processLed5() void processLed9() }
Код (Text): doptime = millis() % 1000; if (doptime < 100) {digitalWrite(LED_PIN9, HIGH); } else { digitalWrite(LED_PIN9, LOW); } Гениально простое решение получения настраиваемого меандра. Требует на порядок меньше ресурсов чем у меня. Пошел переписывать библиотеку.
В принципе, ща прикинул, там и новая переменная не нужна. Сразу в if впихнуть условие ((millis() % 1000) < 100).