Автоматизированную парковка с воротами, датчиком, кнопкой. Как определить, сколько времени каждая машина провела внутри?

проект требует автоматизированной парковки, я смог подключить и функционировать датчик и кнопку для выхода и входа, а также светодиод(красный свет, когда парковка заполнена, зеленый, когда есть пятна). максимальное количество автомобилей - 5. а жидкокристаллический дисплей печатает доступные места и занятые места. клавиатура также подключена. теперь мне нужно сделать код, который умножает каждый автомобиль, который входит в том порядке, в котором они входят, и для каждого автомобиля, который выходит, он должен ввести свой порядок входа, чтобы рассчитать цену, которую он должен заплатить с помощью этого уравнения: плата за парковку (fils) = время(сек) х 0,29fils вот код, который у меня есть на данный момент:

#include <Servo.h>
#include <LiquidCrystal.h>
#include <Keypad.h>
LiquidCrystal lcd(12,11,5,4,3,2);
Servo myservo;

#define Servo 7
#define exit SDA
#define power 6 // дополнительно
#define ground 10 // дополнительно
#define capacity 5
#define R_led SCL
#define G_led 13
int val;
int n = 5;
int s = 0;

const byte ROWS = 4; //четыре строки
const byte COLS = 3; //три столбца
char keys[ROWS][COLS] = {
 {'1','2','3'},
 {'4','5','6'},
 {'7','8','9'},
 {'*','0','#'}
};
byte rowPins[ROWS] = {A4, A3, A2, A1}; //Arduino Pins
byte colPins[COLS] = {8, 9, 10}; //Контакты Arduino

void setup(){
  for(int i=0;i<4;i++){
    pinMode(rowPins[i],INPUT);  //установить контакты строки в качестве входных данных
    pinMode(colPins[i],OUTPUT); //установить контакты столбца в качестве выходов
  }
  Serial.begin(9600);
  myservo.attach(Servo);
  lcd.begin(16,2);
  pinMode(power,OUTPUT);
  pinMode(ground,OUTPUT);
  pinMode(exit,INPUT);
  pinMode(G_led,OUTPUT);
  pinMode(R_led,OUTPUT);
  digitalWrite(ground,LOW);
  digitalWrite(power,HIGH);
  myservo.write(0);
  digitalWrite(R_led,LOW);
  digitalWrite(G_led,LOW);  
}

void loop(){
  if (n>=1){
    lcd.clear();
    lcd.setCursor(1,0);
    lcd.print("Spots left: ");
    lcd.print(n);
    lcd.setCursor(1,1);
    lcd.print("Cars inside: ");
    lcd.print(s);
    digitalWrite(G_led,HIGH);
    digitalWrite(R_led,LOW);
    delay(30);
    
  }
  else {
    lcd.clear();
    lcd.setCursor(1,0);
    lcd.print("The parking is");
    lcd.setCursor(0,1);
    lcd.print("full!");
    digitalWrite(G_led,LOW);
    digitalWrite(R_led,HIGH);
    delay(30);    
  }
val = analogRead(A0);
// Serial.println(val);
if (val>950)
{
  if (n!=0){
    n--;
    s++;
    myservo.write(90);
    delay(3000);
    myservo.write(0);
  }
}
if (digitalRead(exit)==1)
{
  if (n!=capacity){
    n++;
    s--;
      myservo.write(90);
    delay(3000);
    myservo.write(0);
  }
}
delay(20);
  int keyValue=0;
    digitalWrite(colPins[0],HIGH); //Установить column1 как высокий
    digitalWrite(colPins[1],LOW);
    digitalWrite(colPins[2],LOW);
    digitalWrite(colPins[3],LOW);
    for(int i=0;i<4;i++){             //перебирать строки, чтобы найти, нажата ли клавиша
      keyValue = digitalRead(rowPins[i]);
      if(keyValue== 1){
            //отображение либо 1,4,7, либо *
        Serial.println(keys[i][0]); //нажата клавиша дисплея
        delay(500);
      }
    }
    
    digitalWrite(colPins[0],LOW);
    digitalWrite(colPins[1],HIGH); //Установить column2 как высокий
    digitalWrite(colPins[2],LOW);
    digitalWrite(colPins[3],LOW);
    for(int i=0;i<4;i++){              //перебирать строки, чтобы найти, нажата ли клавиша
      keyValue = digitalRead(rowPins[i]);
      if(keyValue== 1){
        //дисплей либо 2,5,8,0
         Serial.println(keys[i][1]); //нажата клавиша дисплея
        delay(500);
      }
    }
    digitalWrite(colPins[0],LOW);
    digitalWrite(colPins[1],LOW);
    digitalWrite(colPins[2],HIGH);//Установить column3 как высокий
    digitalWrite(colPins[3],LOW);
    for(int i=0;i<4;i++){
      keyValue = digitalRead(rowPins[i]);
      if(keyValue== 1){               //перебор строк, чтобы найти, нажата ли клавиша
        //display either 3,6,9,#
         Serial.println(keys[i][2]); //нажата клавиша display
        delay(500);
      }
    }
    digitalWrite(colPins[0],LOW);
    digitalWrite(colPins[1],LOW);
    digitalWrite(colPins[2],LOW);
    digitalWrite(colPins[3],HIGH);//Установить column4 как высокий
    for(int i=0;i<4;i++){
      keyValue = digitalRead(rowPins[i]);
      if(keyValue== 1){               //перебор строк, чтобы найти, нажата ли клавиша
        //display either A,B,C,D
         Serial.println(keys[i][3]); //нажата клавиша display
        delay(500);
      }
    }
}

, 👍-1

Обсуждение

Зависит от требуемой точности. Вы можете использовать millis() для измерения времени, хотя это не очень точно в зависимости от внутренних часов. Если вам нужно правильное время, вам нужно использовать модуль часов реального времени (RTC). Насколько это должно быть точно? Какие временные диапазоны вы хотите измерить?, @chrisl

да, я хочу использовать millis (), но я не могу понять, как это сделать в соответствии с требованиями, о которых я упоминал выше, @Faisal Alrafaei

диапазон-это когда автомобиль въезжает на стоянку до тех пор, пока не выедет, @Faisal Alrafaei

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

просто сделайте то, что делает настоящая парковка, запишите время прибытия, @jsotola

хорошо, пожалуйста, дайте мне знать, как записать время прибытия ? Я был бы вам очень признателен, @Faisal Alrafaei

При использовании millis () время прибытия - это возвращаемое значение millis() в момент прибытия. Вот что делает millis (). Это дает вам количество миллисекунд с момента запуска, то есть время. Когда кто-то придет, сохраните значение millis() в переменной. Позже вы можете вычесть это значение из millis() и получить время пребывания в миллисекундах., @chrisl

да, я это понимаю, но я хочу знать, как посчитать время для разных автомобилей одновременно, а точнее 5 автомобилей, и каждый автомобиль, когда он уезжает, вводит номер заказа, который он ввел, чтобы рассчитать плату, @Faisal Alrafaei

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

@FaisalAlrafaei вы написали код, который представили?, @jsotola

во-первых, в рисовании нет необходимости, потому что я использую tinkercad, во-вторых, код, который я собрал, информацию я нашел в Интернете и отредактировал их, @Faisal Alrafaei

@FaisalAlrafaei С рисунком на бумаге jsotola хотел помочь вам решить проблему самостоятельно. Часто вопросы программирования могут быть решены, когда вы ясно даете себе понять, каковы точные шаги в процессе. Затем эти шаги могут быть переведены в код намного проще. Tinkercad не делает этого за вас, и вы, похоже, не имеете в виду каждый шаг этого процесса., @chrisl

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

- код, который я собрал, информацию, которую нашел в Интернете, и отредактировал ее ... вам действительно нужно узнать, что на самом деле делает код ... в скетче много ненужного кода, @jsotola


1 ответ


1

Для измерения времени для каждой стоянки:

Объявите массив unsigned long с одним элементом на стоянку (в данном случае 5) и инициализируйте его нулями:

#define N_PARKING_LOTS 5
unsigned long timestamps[N_PARKING_LOTS] = {0};

Затем перейдите к тому месту в вашем коде, где новый автомобиль прибывает на свою стоянку. Вам нужен номер используемой парковки. Установите соответствующий элемент в массиве в millis() (например, здесь элемент 3, поэтому 4-я парковка):

timestamps[3] = millis();

Когда соответствующий автомобиль уезжает, вы можете получить время, рассчитав разницу, и по этому вычислить цену:

unsigned long park_duration = millis() - timestamp[3];
float price = (park_duration/1000)*0.29;

То, как вы узнаете парковку, зависит от вашего фактического процесса. Трудно понять, что вы хотите сказать в своем вопросе. Вы можете направить прибывший автомобиль к выбранному вами месту парковки.

Кстати: Код станет намного проще для вас, когда вы на самом деле используете библиотеку клавиатуры, а не просто включаете ее. Тогда ваш текущий код станет намного короче.

,

Откуда вы знаете, какая машина какая. Вы можете использовать дальнобойную RFID-метку в каждом из них, тогда при зондировании вы будете знать, кто, и ваши часы скажут вам, когда, и вы, надеюсь, знаете, приходит он или уходит. После этого вы должны быть в состоянии работать с кодом., @Gil