Автоматизированную парковка с воротами, датчиком, кнопкой. Как определить, сколько времени каждая машина провела внутри?
проект требует автоматизированной парковки, я смог подключить и функционировать датчик и кнопку для выхода и входа, а также светодиод(красный свет, когда парковка заполнена, зеленый, когда есть пятна). максимальное количество автомобилей - 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);
}
}
}
@Faisal Alrafaei, 👍-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
- Как использовать SPI на Arduino?
- Разница между массивом char и массивом unsigned char
- Отправка строки из RPi в Arduino - Рабочий код
- Сбой связи SPI
- GPS автономный робот
- Создать номер
- Нужна помощь с моими кодами? для моего проекта: Наполнение и укупорка с помощью Arduino uno
- Как сбросить или отформатировать Arduino?
Зависит от требуемой точности. Вы можете использовать
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