СВЕТОДИОД не загорается несмотря на отображение digitalRead 1

В рамках проекта я создал имитацию перекрестка с 4 светофорами. Время зеленого сигнала устанавливается на основе функции, которая вычисляет его на основе алгоритма (и принимает в качестве входных данных номера автомобилей, мотоциклов, автобусов и грузовиков).

Количество транспортных средств в фактическом проекте рассчитывается с использованием методов глубокого обучения, однако для целей моделирования я использую random() для их генерации.

Планировка всего процесса

  1. Зеленый свет текущего сигнала остается включенным в течение gst(green signal time) секунд, а красный свет остается включенным для остальных сигналов.
  2. По истечении gst секунд зеленый свет текущего сигнала меняется на желтый. Остальные все еще красные.
  3. Желтый индикатор должен гореть в течение 5 секунд. За эти 5 секунд вычисляется gst для следующего сигнала.
  4. Через 5 секунд после шага 3 желтый сигнал превращается в красный, а следующий сигнал из красного становится зеленым (для суммы, которая была вычислена).
  5. Этот процесс продолжается. Когда мы достигнем 4-го сигнала, следующий сигнал должен быть установлен на 1.

Объяснение кода

  1. gst был инициализирован до 20, а sn (текущий номер сигнала) был инициализирован до 1.

  2. Блок if для вычисления следующего номера сигнала (и next2next,next2next2next) находится вместо точки 5.

  3. сигнал-это массив, содержащий все контакты светодиода. Цветам красному,желтому,зеленому были присвоены номера 0,1,2 , так что контактный номер "цветного" светодиода сигнала "i-й" может быть задан как сигнал[i-1][цвет].

например: "красный" светодиод "2-го" сигнала подается пин-сигналом[1][0], то есть пин-кодом 5 .

Проводка и код

int gst=20; //время зеленого сигнала
int ns=4; //количество сигналов
int sn=1; //текущий номер сигнала



//номера контактов для светодиодов: {{RYG for signal1},{RYG forr signal2}..}
int signal[4][3]={{2,3,4},{5,6,7},{8,9,10},{11,12,13}};

//индексы сигнального массива
int red=0;
int yellow=1;
int green=2;

//pin number of "colour" of signal "i" is given by signal[i][colour]
//example: red led of signal 3: signal[2][0]

int c; //легковые автомобили
int b; //автобусы
int m; //мотоциклы
int t; //грузовики


void setup()
{
  for(int i=2;i<=13;i++){
    pinMode(i,OUTPUT);
  }
  Serial.begin(9600);
  randomSeed(analogRead(0));
}
  
void loop()
{
    int next_sn= sn+1; //следующий сигнал
    if(next_sn==5)
      next_sn=1;
  
    int next2_sn= next_sn+1; //next2next
    if(next2_sn==5)
      next2_sn=1;
  
    int next3_sn= next2_sn+1; //next2next2next
     if(next3_sn==5)
      next3_sn=1;
   
  
    //текущий сигнал зеленый (для секунд gst), остальные красные.
  
    digitalWrite(signal[sn-1][green],HIGH);
    digitalWrite(signal[sn-1][red],LOW); //this line will make sense 
                                      //for the 2nd iteration
  
    digitalWrite(signal[next_sn-1][red],HIGH);
    digitalWrite(signal[next2_sn-1][red],HIGH);
    digitalWrite(signal[next3_sn-1][red],HIGH);
    
    //for debugging purposes
   
    Serial.println(digitalRead(signal[sn-1][green]));
  
    delay(gst*1000);
  
    //gst секунды истекли, теперь текущий сигнал должен стать желтым
  
    digitalWrite(signal[sn-1][green],LOW);
    digitalWrite(signal[sn-1][yellow],HIGH);
  
    delay(5*1000);
    
    
    //снимок сделан для расчета количества автомобилей, автобусов и т. Д
    //на данный момент используются случайные числа 
    
     c=random(10,17);
     m=random(5,10);
     b=random(0,5);
     t=random(0,5);
  
     //calculate gst
  
     gst=calc_gst(c,m,b,t);
  
  //make current signal red
   
    digitalWrite(signal[sn-1][red],HIGH);
    digitalWrite(signal[sn-1][yellow],LOW);
  
  
  //the next signal is our current signal for the next iteration
  //the green signal should turns on for gst seconds in the next
  //iteration,and the red signal turns off
    sn=next_sn;
     
  }

//function for calculating green signal time

int calc_gst(int c,int m,int b,int t)  //car bus motorcycle truck
{
  
int vehicle[4]={c,m,b,t};
int avgtime[4]={2,1,2.5,2.5};
int x=0;
for(int i=0;i<4;i++){
x+=vehicle[i]*avgtime[i];
int gst= x/(ns+1);
return gst;
  
}
  
  
 
}

Проблемы

В начале моделирования зеленый свет первого сигнала не загорается. (Однако остальные трое-красные, и это правильно). Через 20 секунд первый сигнал становится желтым правильно. Затем, через 5 секунд, второй сигнал становится зеленым правильно, но первый сигнал не становится красным. Впоследствии есть много случаев, когда в общей сложности загораются только 3 светодиода вместо 4.

Чтобы проверить, почему зеленый свет не загорается, я добавил строку:

    //for debugging purposes
    Serial.println(digitalRead((3*(sn-1)+green)));

Последовательный монитор показывает 1, так почему же светодиод не загорается??

Если в моем процессе есть какие-либо предложения/исправления, я буду обязан, если кто-то сможет указать на это.Мой код сильно комментируется, и он объясняет весь процесс.

Ссылка на Tinkercad, если кто-то хочет попробовать симуляцию: https://www.tinkercad.com/things/1Le8m5ouHPc

, 👍2

Обсуждение

хорошо, но есть какие-нибудь подсказки, почему зеленый светодиод не загорается сразу? Ваше предложение определенно поможет "очистить код", но даже с моим кодом digitalRead()..равен 1, и все же светодиод не загорается.., @satan 29

следуя вашему совету, я отредактировал код и использовал 2D-массив, надеюсь, это упростит задачу.., @satan 29

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

Я понимаю...какое решение вы предлагаете?, @satan 29

Что ты имеешь в виду? ... вы не подключили резисторы на верхнем конце ... для этого есть только одно исправление, @jsotola

одна вещь, которая могла бы еще немного очистить код, - это пронумеровать светофоры 0, 1, 2, 3, @jsotola

о боже, это ужасная ошибка. Резисторы не подключены. Большое спасибо @jsotola., @satan 29