СВЕТОДИОД не загорается несмотря на отображение digitalRead 1
В рамках проекта я создал имитацию перекрестка с 4 светофорами. Время зеленого сигнала устанавливается на основе функции, которая вычисляет его на основе алгоритма (и принимает в качестве входных данных номера автомобилей, мотоциклов, автобусов и грузовиков).
Количество транспортных средств в фактическом проекте рассчитывается с использованием методов глубокого обучения, однако для целей моделирования я использую random() для их генерации.
Планировка всего процесса
- Зеленый свет текущего сигнала остается включенным в течение gst(green signal time) секунд, а красный свет остается включенным для остальных сигналов.
- По истечении gst секунд зеленый свет текущего сигнала меняется на желтый. Остальные все еще красные.
- Желтый индикатор должен гореть в течение 5 секунд. За эти 5 секунд вычисляется gst для следующего сигнала.
- Через 5 секунд после шага 3 желтый сигнал превращается в красный, а следующий сигнал из красного становится зеленым (для суммы, которая была вычислена).
- Этот процесс продолжается. Когда мы достигнем 4-го сигнала, следующий сигнал должен быть установлен на 1.
Объяснение кода
gst был инициализирован до 20, а sn (текущий номер сигнала) был инициализирован до 1.
Блок if для вычисления следующего номера сигнала (и next2next,next2next2next) находится вместо точки 5.
сигнал
-это массив, содержащий все контакты светодиода. Цветамкрасному,желтому,зеленому
были присвоены номера 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
@satan 29, 👍2
Обсуждение0
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Ошибка "collect2.exe: error: ld returned 1 exit status"
- Поддерживают ли чипы ATMega 328/2560 JTAG-программатор и аппаратный отладчик?
- Proteus - Как отладить недопустимый код операции?
- Мой код кажется крушением поезда
- Как выполнить отладку на чипе с помощью Arduino?
- Использование последовательного плоттера с Visual Studio Code
- Простой ЖК-таймер обратного отсчета
хорошо, но есть какие-нибудь подсказки, почему зеленый светодиод не загорается сразу? Ваше предложение определенно поможет "очистить код", но даже с моим кодом digitalRead()..равен 1, и все же светодиод не загорается.., @satan 29
следуя вашему совету, я отредактировал код и использовал 2D-массив, надеюсь, это упростит задачу.., @satan 29
уменьшите код, чтобы зажечь все светодиоды в " настройка ()"... вы обнаружите, что вверху слева красный и зеленый цвета не горят .... вы не подключали резисторы к заземлению для этих двух светодиодов ... это проблема Tinkercad, которая не произошла бы в реальной жизни, @jsotola
Я понимаю...какое решение вы предлагаете?, @satan 29
Что ты имеешь в виду? ... вы не подключили резисторы на верхнем конце ... для этого есть только одно исправление, @jsotola
одна вещь, которая могла бы еще немного очистить код, - это пронумеровать светофоры 0, 1, 2, 3, @jsotola
о боже, это ужасная ошибка. Резисторы не подключены. Большое спасибо @jsotola., @satan 29