мигаем двумя светодиодами

goha92
Offline
Зарегистрирован: 20.03.2013
///////////////////////////////////////////////////////////////////////////////////////////
  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, время в миллисекундах в последовательный порт.
Но вот какой вылез косяк, красный светодиодик горит постоянно, а моргает только ик, глянул осцилографом.
Обьясните где косяк пожалуйста?

tsostik
Offline
Зарегистрирован: 28.02.2013

Что должно выполняться, если условие if (ledStateRED == LOW) ложно?

 что реально выпонтяется в этом коде?

Вывод - не забываем об аккуратной и правильной расстановке фигурных скобок и отступов.

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Еще и запятые в тексте описания не помешают.

Snubist
Offline
Зарегистрирован: 18.02.2013

Судя по коду гореть постоянно должен инфракрасный светодиод.

Не забываем раставлять скобки. Иначе выполняется не блок а только оператор сразу за сравнением.

    else {
        ledStateRED = LOW;
        ledStateIR = HIGH;//теперь всё наоборот
  
    valIR = analogRead(photoPin);//считываем значение с фотодиода при включенном ик светодиоде
   }

 

maksim
Offline
Зарегистрирован: 12.02.2012
///////////////////////////////////////////////////////////////////////////////////////////
#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(); 
  }
}

 

goha92
Offline
Зарегистрирован: 20.03.2013

 

Что должно выполняться, если условие if (ledStateRED == LOW) ложно?

 что реально выпонтяется в этом коде?

Должен гаснуть красный светодиод, загораться ИК и считываться значение с фотодиода.

 

код в последнем сообщении работает так же(

goha92
Offline
Зарегистрирован: 20.03.2013

косяк был в LCD шилде похоже, без него включил и заработало, странно)

goha92
Offline
Зарегистрирован: 20.03.2013

Сейчас вылезла друга проблема: при повышении частоты до 100 герц импульсы не одинаковой продолжительности, а имменно, один из 10 длиннее по времени и это периодично.
Нет ли способа мигать с фиксированной частотой? 

leshak
Offline
Зарегистрирован: 29.09.2011

Если у вас много Serial.println - они могут давать задержку. Попробуйте без них. Вывод в Serial - тоже занимает время. ПРичем разное (в зависимости от того насколько заполнен буффер)

Или гуглите библиотеки таймеров.  По идее они должны обеспечить приоритетность мигания на выводом в Serial.

P.S. А вообще "длинее" - это как-то не серьезно. Длинее на 100 миллисекунд или длинее на 3 микросекунды? Это, извините, большая разница. И причины будут - совсем разные.

goha92
Offline
Зарегистрирован: 20.03.2013

ну раза в полтора он длиннее т.е. вместо 10 15-17миллисекунд

leshak
Offline
Зарегистрирован: 29.09.2011

Ну 15-17 - такое вполне могут print-ты, вы 

> Serial.println - они могут давать задержку. Попробуйте без них.

попробовали?

goha92
Offline
Зарегистрирован: 20.03.2013

не помогло(

leshak
Offline
Зарегистрирован: 29.09.2011

Звучит как фантастика. Я могу предположить следующие варианты:

1. Вы работаете с каким-то другим вариантом кода, не с примером Максима. Который не опубликован в ветке (были упоминания про LCD шилд, но в скетчах его не видно). 
2. Задержки, на самом деле нет, а проблема в способе измерения (не на глаз же вы это замечаете)
3. Железная проблема (где-то есть или образовалась RC-цепочка)
4. Переменную задержку дает analogRead (не представляю как, но больше-то в видимых скетчах ничего нет).