мигаем двумя светодиодами
- Войдите на сайт для отправки комментариев
Чт, 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) ложно?что реально выпонтяетсяв этом коде?Вывод - не забываем об аккуратной и правильной расстановке фигурных скобок и отступов.
Еще и запятые в тексте описания не помешают.
Судя по коду гореть постоянно должен инфракрасный светодиод.
Не забываем раставлять скобки. Иначе выполняется не блок а только оператор сразу за сравнением.
else { ledStateRED = LOW; ledStateIR = HIGH;//теперь всё наоборот valIR = analogRead(photoPin);//считываем значение с фотодиода при включенном ик светодиоде }/////////////////////////////////////////////////////////////////////////////////////////// #define ledPinRED 2 // светодиод подключается к digital pin 10 #define ledPinIR 3 // IR светодиод подключается к digital pin 11 #define photoPin 2 // фотодиод подключен 2-му аналоговому входу long previousMillis = 0; // храним время последнего переключения светодиода long interval = 1000; //интервал между включениями светодиода int valRED = 0; // переменная для хранения значения входного напряжения int valIR = 0; // переменная для хранения значения входного напряжения ///////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// void setup() { Serial.begin(9600); pinMode(ledPinRED, OUTPUT); pinMode(ledPinIR, OUTPUT); } void loop() { //проверяем не прошел ли нужный интервал, если прошел то if(millis() - previousMillis > interval) { static bool state; state = !state; if(state) { digitalWrite(ledPinRED, HIGH);//взял код из мигания светодиодами без delay digitalWrite(ledPinIR, LOW);//попеременно мигаем то красным то инфракрасным светодиодом valRED = analogRead(photoPin);//считываем значение с фотодиода при включенном красном } else { digitalWrite(ledPinRED, LOW); digitalWrite(ledPinIR, HIGH);//теперь всё наоборот valIR = analogRead(photoPin);//считываем значение с фотодиода при включенном ик светодиоде } Serial.print(valRED);//печатаем значения с фотодиода при включенном красном светодиоде Serial.print(" "); Serial.print(valIR);//печатаем значения с фотодиода при включенном инфракрасном светодиоде Serial.print(" "); Serial.println(millis());//печатаем время Serial.println(); // сохраняем время последнего переключения previousMillis = millis(); } }Что должно выполняться, если условие
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 (не представляю как, но больше-то в видимых скетчах ничего нет).