Как включать и выключать светодиодную подсветку по порядку, когда она ниже определенного значения фотозначения?

Я делаю симуляцию светофора с помощью фоторезистора, но он не работает должным образом. Когда фотозначение падает ниже определенной точки (проезжает автомобиль), в течение секунды должен звучать писклявый звук, а затем красный свет должен превратиться в желтый, а затем он должен стать зеленым и оставаться зеленым до тех пор, пока фотозначение не вернется к нормальному, а затем он должен снова стать красным и оставаться красным до тех пор, пока фотовыставка снова падает ниже этой точки (фотовыставка возвращается к нормальному значению при движении автомобиля) . Я попробовал по-другому, но не получил того результата, на который надеялся, желтый индикатор продолжал пульсировать вместо того, чтобы фактически погаснуть, зеленый индикатор был включен, но он не погас, когда должен был. В моей недавней попытке зеленый индикатор не гаснет, в то время как красный и желтый включаются. Что я сделал не так и как мне это исправить?
вот мой код для последней попытки.

This is how my circuit looks like, not the most refined but it works as intended ig

byte PhotoInput= 0;
int PhotoValue;
int Pin = 8;
void PlayTone( int freq,  int duration) {
  
delay( duration);
tone ( Pin ,freq, duration ); 


}


int red = 10;
int yellow= 7; 
int green= 5; 



 void setup() {
  pinMode(red, OUTPUT);
  pinMode( yellow, OUTPUT); 
  pinMode( green, OUTPUT); 
  Serial.begin(9600);
}

void loop() {
  

  PhotoValue = analogRead(PhotoInput);
    ;Serial.println(PhotoValue); 
    delay(50);

    if ( PhotoValue < 100 ) { 
      digitalWrite  (red, HIGH); 
      delay ( 500);
      digitalWrite ( red,LOW);  
      digitalWrite (yellow,HIGH);
      delay(1000);
      PlayTone( 100, 50);
        
    
      digitalWrite(green,HIGH);
     digitalWrite ( yellow, LOW);
      
    
    }else if ( PhotoValue > 100) { 
       digitalWrite ( red,HIGH);
      digitalWrite(yellow,LOW);
      digitalWrite(green,LOW);
    
     
    }

   if (PhotoValue > 50 ){ 
    PlayTone( 100, 50);
   }else if ( PhotoValue > 60 )   { 
    PlayTone ( 300, 50); 
   }else if ( PhotoValue > 120 )   { 
    PlayTone ( 600, 50); 
    }else if ( PhotoValue > 160) {
    PlayTone ( 900, 50); 
    }else if ( PhotoValue < 180 )   { 
    PlayTone ( 1100, 50); 
    }else if ( PhotoValue > 200)   { 
    PlayTone ( 1300, 50); 
    }else if ( PhotoValue < 240 )   { 
    PlayTone ( 1600, 50); 
    }else if ( PhotoValue > 260 )   { 
    PlayTone ( 1000, 50); 
    }else if ( PhotoValue < 80 )   { 
    PlayTone ( 600, 50); 
   }
}

, 👍-1

Обсуждение

Только что сделал это, спасибо, что указали на это. Я новичок как в arduino, так и в этом сообществе, поэтому я действительно не знаю, что важно упомянуть, а что нет., @Mansour

Что произойдет, если вы удалите эту строку кода "задержка (длительность)"?, @VE7JRO

у вас нет кода для "оставайтесь зелеными, пока фотооценка не вернется к нормальному значению"., @jsotola

вы понимаете, что цикл () повторяется до тех пор, пока Arduino не будет сброшен? .... внимательно посмотрите на свой код ... если вы прикроете датчик, желтый цвет будет мигать, а зеленый включится и останется включенным, @jsotola

если вы хотите, чтобы раздел кода выполнялся только один раз для выполнения действия, то вам необходимо использовать флаги, @jsotola

ваша трудность возникает из - за того , как вы обрабатываете поток программ после считывания показаний датчика ... если (ярко), то включите красный светодиод" - это негибкий способ сделать это .... вставьте слой разделения между ощущением и действием... используйте флаги ... попробуйте if (яркий), затем установите флаг isBright ... если (dim), то установите флаг isDim" ... `если (isDim и isBright), то отключите isBright; мигать желтым светодиодом" .... таким образом, желтый светодиод мигает только один раз, когда датчик обнаруживает тусклый свет, @jsotola

Я действительно не знаю, какие флаги есть в arduino, как уже было сказано ранее, я новичок в этом. Но исходя из того, что вы сказали, мне нужно разбить этот процесс. Сначала он должен определить значение фотографии, а затем он будет действовать на основе того, что следует за флагом как для тусклого, так и для яркого. Создав оператор if как для dim, так и для bright, он должен стать более гибким. Но разве это не сложнее, чем на самом деле сделать оператор and if, в котором желтый светодиод зависит от зеленого светодиода. Есть ли какой-нибудь YouTube, который вы рекомендуете о том, как работают флаги. @jsotola ?, @Mansour

`разве это не сложнее, чем на самом деле сделать оператор and if, в котором желтый светодиод зависит от зеленого светодиода"... но от чего зависит ваш зеленый светодиод?, @jsotola

какие флаги есть в arduino... не Arduino ... на любом языке программирования ... флаг - это просто переменная, которой вы присваиваете определенное значение, чтобы что-то запомнить, например bool isBright = true; ... в реальной жизни это может быть записка , прикрепленная к холодильнику , или запись о встрече , записанная в календаре ... или даже светофор, @jsotola


1 ответ


0

Чтобы упростить задачу, я убрал зуммер из кода, чтобы просто сосредоточиться на освещении (судя по вашей схеме, зуммер все равно не был подключен!). Я также постарался сохранить как можно больше вашего кода и просто ввести один флаг, для которого устанавливается значение true при обнаружении автомобиля.

При первом запуске программы значение car_detected равно false, и в коде setup() включается красный индикатор. Когда значение PhotoValue имеет низкое значение (<100), он установит для car_detected значение true и проследит последовательность огней, после чего, наконец, включится зеленый. Пока световой поток низкий, он увидит, что флаг car_detected остается верным и не будет выполнять никаких дальнейших действий.

Когда автомобиль отъезжает и фотооценка снова становится высокой (> 100), флажок снимается, и красный свет снова включается. Опять же - из-за флага никаких дальнейших действий не будет выполняться до тех пор, пока уровень освещенности снова не изменится.

Это упрощенный пример того, как вы можете использовать флаг для управления состоянием вашей программы, и, надеюсь, это позволит вам прогрессировать.

byte PhotoInput=0;
int PhotoValue;
bool car_detected = false ;

int red = 10;
int yellow= 7; 
int green= 5; 

void setup() {
  pinMode(red, OUTPUT);
  pinMode(yellow, OUTPUT); 
  pinMode(green, OUTPUT); 

  digitalWrite(red,HIGH);
  digitalWrite(yellow,LOW);
  digitalWrite(green,LOW);

  Serial.begin(9600);
}

void loop() {
  
  PhotoValue = analogRead(PhotoInput);
  Serial.println(PhotoValue); 

  if ( PhotoValue < 100 ) {
    
    if ( !car_detected ) {
      car_detected = true ;

      digitalWrite(red, HIGH); 
      delay (500);
      digitalWrite(red,LOW);  
      digitalWrite(yellow,HIGH);
      delay(1000);

      digitalWrite(green,HIGH);
      digitalWrite(yellow, LOW);
    }
  }else if ( PhotoValue >= 100) { 
    if ( car_detected ) {
      car_detected = false ;
      digitalWrite(red,HIGH);
      digitalWrite(yellow,LOW);
      digitalWrite(green,LOW);
    }
  }
}
,