мигаем двумя светодиодами
- Войдите на сайт для отправки комментариев
Чт, 28/03/2013 - 17:37
/////////////////////////////////////////////////////////////////////////////////////////// int ledStateRED = LOW; // этой переменной устанавливаем состояние светодиода int ledStateIR = LOW; long previousMillis = 0; // храним время последнего переключения светодиода int ledPinRED =2; // светодиод подключается к digital pin 10 int ledPinIR =3; // IR светодиод подключается к digital pin 11 int photoPin = 2; // фотодиод подключен 2-му аналоговому входу long interval=1000; //интервал между включениями светодиода int valRED = 0; // переменная для хранения значения входного напряжения int valIR = 0; // переменная для хранения значения входного напряжения ///////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// void setup() { Serial.begin(9600); pinMode(photoPin, INPUT); pinMode(ledPinRED, OUTPUT); pinMode(ledPinIR, OUTPUT); } void loop() { unsigned long currentMillis = millis(); //проверяем не прошел ли нужный интервал, если прошел то if(currentMillis - previousMillis > interval){ // сохраняем время последнего переключения previousMillis = currentMillis; // если светодиод не горит, то зажигаем, и наоборот if (ledStateRED == LOW){ ledStateRED = HIGH;//взял код из мигания светодиодами без delay ledStateIR = LOW;//попеременно мигаем то красным то инфракрасным светодиодом valRED = analogRead(photoPin);//считываем значение с фотодиода при включенном красном } else ledStateRED = LOW; ledStateIR = HIGH;//теперь всё наоборот valIR = analogRead(photoPin);//считываем значение с фотодиода при включенном ик светодиоде digitalWrite(ledPinRED, ledStateRED); digitalWrite(ledPinIR, ledStateIR); Serial.print(valRED);//печатаем значения с фотодиода при включенном красном светодиоде Serial.print(" "); Serial.print(valIR);//печатаем значения с фотодиода при включенном инфракрасном светодиоде Serial.print(" "); Serial.println(millis());//печатаем время Serial.println(); }}
Изложу свою проблему.
Нужно мигать двумя светодиодами красным и инфракрасным, когда горит красный-ик не горит считываем значение с фотодиода как переменную valRED, затем выключаем красный включем ик, повторяем процедуру только теперь переменная valIR.В будущем желательно это делать с частотой хотябы 500 Гц.Ну ещё пишем значения valRED, valIR, время в миллисекундах в последовательный порт.
Но вот какой вылез косяк, красный светодиодик горит постоянно, а моргает только ик, глянул осцилографом.
Обьясните где косяк пожалуйста?
Что должно выполняться, если условие
if
(ledStateRED == LOW) ложно?
что реально выпонтяется
в этом коде?Вывод - не забываем об аккуратной и правильной расстановке фигурных скобок и отступов.
Еще и запятые в тексте описания не помешают.
Судя по коду гореть постоянно должен инфракрасный светодиод.
Не забываем раставлять скобки. Иначе выполняется не блок а только оператор сразу за сравнением.
Что должно выполняться, если условие
if
(ledStateRED == LOW) ложно?
что реально выпонтяется
в этом коде?Должен гаснуть красный светодиод, загораться ИК и считываться значение с фотодиода.
код в последнем сообщении работает так же(
косяк был в LCD шилде похоже, без него включил и заработало, странно)
Сейчас вылезла друга проблема: при повышении частоты до 100 герц импульсы не одинаковой продолжительности, а имменно, один из 10 длиннее по времени и это периодично.
Нет ли способа мигать с фиксированной частотой?
Если у вас много Serial.println - они могут давать задержку. Попробуйте без них. Вывод в Serial - тоже занимает время. ПРичем разное (в зависимости от того насколько заполнен буффер)
Или гуглите библиотеки таймеров. По идее они должны обеспечить приоритетность мигания на выводом в Serial.
P.S. А вообще "длинее" - это как-то не серьезно. Длинее на 100 миллисекунд или длинее на 3 микросекунды? Это, извините, большая разница. И причины будут - совсем разные.
ну раза в полтора он длиннее т.е. вместо 10 15-17миллисекунд
Ну 15-17 - такое вполне могут print-ты, вы
> Serial.println - они могут давать задержку. Попробуйте без них.
попробовали?
не помогло(
Звучит как фантастика. Я могу предположить следующие варианты:
1. Вы работаете с каким-то другим вариантом кода, не с примером Максима. Который не опубликован в ветке (были упоминания про LCD шилд, но в скетчах его не видно).
2. Задержки, на самом деле нет, а проблема в способе измерения (не на глаз же вы это замечаете)
3. Железная проблема (где-то есть или образовалась RC-цепочка)
4. Переменную задержку дает analogRead (не представляю как, но больше-то в видимых скетчах ничего нет).