Επανέρχομαι για λίγο, ανεβάζοντας και τα σχετικά αεχεία της κατασκευής αν χρειαστούν σε κάποιον. Είναι το δάπεδο σε 2 τμήματα και σε μορφή εικόνας & pdf (για να μπορεί να μεγεθυνθεί όσο χρειάζεται) και τα αρχεία του κώδικα (για μελέτη).
Lot_10.ino
Κώδικας:
#include <LiquidCrystal_I2C.h> //https://www.arduinolibraries.info/libraries/liquid-crystal-i2-c
#include <Wire.h> //Ενσωματωμένη βιβλιοθήκη
#include <Servo.h> //Ενσωματωμένη βιβλιοθήκη
#include <TimerOne.h> //https://www.arduinolibraries.info/libraries/timer-one
#include "defines.h" //Αρχείο header που θα τοποθετηθεί στον ίδιο φάκελο με το αρχείο Lot_10.ino
//================================================================
Servo myservo; //Αντικείμενο κλάσσης Servo
LiquidCrystal_I2C lcd(0x27,20,4); //Αντικείμενο κλάσσης σειριακής οθόνης, δηλώνεται address, χαρακτήρες και γραμμές
//================================================================
void setup()
{
Serial.begin(9600);
lcd.init();
lcd.backlight();
Timer1.initialize(1000000); //Αρχικοποίηση του Timer1 για να προκαλεί διακοπές ανά 1 sec
Timer1.attachInterrupt(xmit_ISR); //Ορισμός ρουτίνας διακοπής του Timer1
pinMode(EXIT_IR, INPUT_PULLUP); //Ορισμός pin D4 ως εισόδου PULL UP για ανίχνευση εξόδου οχήματος
pinMode(ENTRANCE_IR, INPUT_PULLUP); //Ορισμός pin D5 ως εισόδου PULL UP για ανίχνευση εισόδου οχήματος
pinMode(LedA, OUTPUT); //Ορισμός εισόδων A,B,C,D για το CD4511 4bit to 7 segment decoder
pinMode(LedB, OUTPUT); //(βλέπε defines.h για τα definitions)
pinMode(LedC, OUTPUT); //
pinMode(LedD, OUTPUT); //
digitalWrite(LedA, 0); //
digitalWrite(LedB, 0);
digitalWrite(LedC, 0);
digitalWrite(LedD, 0);
pinMode(PARKING_1, INPUT_PULLUP); //Ορισμός εισόδων για ανίχνευση θέσεων στάθμευσης
pinMode(PARKING_2, INPUT_PULLUP); //(βλέπε defines.h για τα definitions)
pinMode(PARKING_3, INPUT_PULLUP); //
pinMode(PARKING_4, INPUT_PULLUP); //
pinMode(PARKING_5, INPUT_PULLUP); //
pinMode(PARKING_6, INPUT_PULLUP); //
pinMode(PARKING_7, INPUT_PULLUP); //
pinMode(PARKING_8, INPUT_PULLUP); //
splashScreen();
myservo.attach(BAR);
myservo.write(BAR_LOW);
delay(2000);
moveDown();
}
//================================================================
void loop()
{
checkEntrance();
checkExit();
scrollDataDisplay(3,250);
}
//================================================================
void xmit_ISR()
{
Serial.write("@\n");
}
Utilities.ino
Κώδικας:
//================================================================
void setNumber(const uint8_t n)
{
static const struct number
{
uint8_t d;
uint8_t c;
uint8_t b;
uint8_t a;
}numbers[] = {
{0, 0, 0, 0},
{0, 0, 0 ,1},
{0, 0, 1, 0},
{0, 0, 1, 1},
{0, 1, 0, 0},
{0, 1, 0 ,1},
{0, 1, 1, 0},
{0, 1, 1, 1},
{1, 0, 0, 0},
{1, 0, 0 ,1},
};
digitalWrite(LedA, numbers[n%10].a);
digitalWrite(LedB, numbers[n%10].b);
digitalWrite(LedC, numbers[n%10].c);
digitalWrite(LedD, numbers[n%10].d);
}
//================================================================
void checkEntrance()//pin 5
{
if (digitalRead(ENTRANCE_IR) == HIGH)
{
if(Availiable != 0)
{
Availiable--;
upMessage();
moveUp();
lcd.setCursor(6,2);
lcd.print("ENTRANCE");
delay(3000);
downMessage();
moveDown();
}
if(Availiable == 0)
{
noMoreCars();
delay(4000);
}
}
}
//================================================================
void checkExit()//pin 4
{
if (digitalRead(EXIT_IR) == HIGH)
{
if(Availiable != MAX_CARS)
{
Availiable++;
upMessage();
moveUp();
lcd.setCursor(8,2);
lcd.print("EXIT");
delay(3000);
downMessage();
moveDown();
}
}
}
//================================================================
void moveDown()
{
for (int counter = BAR_HIGH; counter <= BAR_LOW; counter += 1)
{
myservo.write(counter);
delay(20);
}
delay(4000);
checkEmpty();
}
//================================================================
void moveUp()
{
for (int counter = BAR_LOW; counter >= BAR_HIGH; counter -= 1)
{
myservo.write(counter);
delay(20);
}
delay(1000);
}
//================================================================
void scrollDataDisplay(int line, int speed)
{
int i;
if(g_nPosition < DATA_LENGTH - DISPLAY_WIDTH)
{
for(i=0; i<DISPLAY_WIDTH; i++)
{
lcd.setCursor(i, line);
lcd.print(dataBuffer[g_nPosition + i]);
lcd.print(dataBuffer[63] = ' ');
}
}
else
{
int nChars = DATA_LENGTH - g_nPosition;
for(i=0; i<nChars; i++)
{
lcd.setCursor(i, line);
lcd.print(dataBuffer[g_nPosition + i]);
lcd.print(dataBuffer[63] = ' ');
}
for(i=0; i<(DISPLAY_WIDTH - nChars); i++)
{
lcd.setCursor(nChars + i, line);
lcd.print(dataBuffer[i]);
lcd.print(dataBuffer[63] = ' ');
}
}
g_nPosition++;
if(g_nPosition >= DATA_LENGTH)
{
g_nPosition = 0;
}
delay(speed);
}
//================================================================
void checkParkings()
{
for(int position = 1; position < 9; position++)
{
switch(position)
{
case(1):
if(digitalRead(PARKING_1)==HIGH)
{
Serial.println("ΘΕΣΗ #1 ΚΑΤΗΛΕΙΜΜΕΝΗ");
lcd.setCursor(2,1);
lcd.print(" ");
}
else
{
Serial.println("ΘΕΣΗ #1 ΕΛΕΥΘΕΡΗ");
lcd.setCursor(2,1);
lcd.print("X");
}
break;
case(2):
if(digitalRead(PARKING_2)==HIGH)
{
Serial.println("ΘΕΣΗ #2 ΚΑΤΗΛΕΙΜΜΕΝΗ");
lcd.setCursor(7,1);
lcd.print(" ");
}
else
{
Serial.println("ΘΕΣΗ #2 ΕΛΕΥΘΕΡΗ");
lcd.setCursor(7,1);
lcd.print("X");
}
break;
case(3):
if(digitalRead(PARKING_3)==HIGH)
{
Serial.println("ΘΕΣΗ #3 ΚΑΤΗΛΕΙΜΜΕΝΗ");
lcd.setCursor(12,1);
lcd.print(" ");
}
else
{
Serial.println("ΘΕΣΗ #3 ΕΛΕΥΘΕΡΗ");
lcd.setCursor(12,1);
lcd.print("X");
}
break;
case(4):
if(digitalRead(PARKING_4)==HIGH)
{
Serial.println("ΘΕΣΗ #4 ΚΑΤΗΛΕΙΜΜΕΝΗ");
lcd.setCursor(17,1);
lcd.print(" ");
}
else
{
Serial.println("ΘΕΣΗ #4 ΕΛΕΥΘΕΡΗ");
lcd.setCursor(17,1);
lcd.print("X");
}
break;
case(5):
if(digitalRead(PARKING_5)==HIGH)
{
Serial.println("ΘΕΣΗ #5 ΚΑΤΗΛΕΙΜΜΕΝΗ");
lcd.setCursor(2,2);
lcd.print(" ");
}
else
{
Serial.println("ΘΕΣΗ #5 ΕΛΕΥΘΕΡΗ");
lcd.setCursor(2,2);
lcd.print("X");
}
break;
case(6):
if(digitalRead(PARKING_6)==HIGHUI)
{
Serial.println("ΘΕΣΗ #6 ΚΑΤΗΛΕΙΜΜΕΝΗ");
lcd.setCursor(7,2);
lcd.print(" ");
}
else
{
Serial.println("ΘΕΣΗ #6 ΕΛΕΥΘΕΡΗ");
lcd.setCursor(7,2);
lcd.print("X");
}
break;
case(7):
if(digitalRead(PARKING_7)==HIGH)
{
Serial.println("ΘΕΣΗ #7 ΚΑΤΗΛΕΙΜΜΕΝΗ");
lcd.setCursor(12,2);
lcd.print(" ");
}
else
{
Serial.println("ΘΕΣΗ #7 ΕΛΕΥΘΕΡΗ");
lcd.setCursor(12,2);
lcd.print("X");
}
break;
case(8):
if(digitalRead(PARKING_8)==HIGH)
{
Serial.println("ΘΕΣΗ #8 ΚΑΤΗΛΕΙΜΜΕΝΗ");
lcd.setCursor(17,2);
lcd.print(" ");
}
else
{
Serial.println("ΘΕΣΗ #8 ΕΛΕΥΘΕΡΗ");
lcd.setCursor(17,2);
lcd.print("X");
}
break;
}
}
}
//================================================================
//================================================================
//================================================================
Lcd.ino
Κώδικας:
//================================================================
void splashScreen()
{
lcd.createChar(fi, FI);
lcd.createChar(psi, PSI);
lcd.createChar(omega, OMEGA);
lcd.createChar(gamma, GAMMA);
lcd.createChar(delta, DELTA);
lcd.createChar(lamda, LAMDA);
lcd.createChar(ksi, KSI);
lcd.createChar(pi, PEE);
Serial.println("ΑΥΤΟΜΑΤΗ ΔΙΑΧΕΙΡΗΣΗ");
Serial.println("PARKING ΑΥΤΟΚΙΝΗΤΩΝ\n");
Serial.println("ΑΓΓΕΛΟΣ ΜΑΡΑΓΚΑΚΗΣ");
Serial.println("ΤΑΞΗ Α2 - 4ο ΓΥΜΝΑΣΙΟ ΕΛΕΥΣΙΝΑΣ");
Serial.println("ΕΤΟΣ 2019 - 2020\n");
lcd.clear();
lcd.print(F(" AYTOMATH"));
lcd.setCursor(0, 1);
lcd.print(F(" "));
lcd.write(delta);
lcd.print(F("IAXEIPH"));
lcd.write(sigma);
lcd.print(F("H"));
lcd.setCursor(0, 2);
lcd.print(F(" PARKING"));
lcd.setCursor(0, 3);
lcd.print(F(" AYTOKINHT"));
lcd.write(omega);
lcd.print(F("N"));
delay(3000);
lcd.clear();
lcd.print(F(" A"));
lcd.write(gamma);
lcd.write(gamma);
lcd.print(F("E"));
lcd.write(lamda);
lcd.print(F("O"));
lcd.write(sigma);
lcd.print(F(" A2"));
lcd.setCursor(0, 1);
lcd.print(F(" MAPA"));
lcd.write(gamma);
lcd.print(F("KAKH"));
lcd.write(sigma);
lcd.setCursor(0, 2);
lcd.print(F("A' "));
lcd.write(gamma);
lcd.print(F("YMNA"));
lcd.write(sigma);
lcd.print(F("IOY-4"));
lcd.write(degrees);
lcd.print(F(" "));
lcd.write(gamma);
lcd.print(F(".E."));
lcd.setCursor(0, 3);
lcd.print(F(" 2019-2020"));
}
//================================================================
void downMessage()
{
lcd.clear();
lcd.print(F(" H M"));
lcd.write(pi);
lcd.print(F("APA K"));
lcd.write(lamda);
lcd.print(F("EINEI..."));
}
//================================================================
void upMessage()
{
lcd.clear();
lcd.print(F(" H M"));
lcd.write(pi);
lcd.print(F("APA ANOI"));
lcd.write(gamma);
lcd.print(F("EI..."));
}
//================================================================
void checkEmpty()
{
lcd.clear();
lcd.print(F(" KENE"));
lcd.write(sigma);
lcd.print(F(" "));
lcd.write(thita);
lcd.print(F("E"));
lcd.write(sigma);
lcd.print(F("EI"));
lcd.write(sigma);
lcd.print(F(": "));
lcd.print(Availiable, DEC);
if (Serial.available() > 0)
{
incomingByte = Serial.read();
if (incomingByte == '$')
{
Serial.write('@');
Serial.write(Availiable);
}
setNumber(Availiable);
lcd.print(F(" "));
showPlaces();
}
}
//================================================================
void noMoreCars()
{
lcd.clear();
lcd.setCursor(5, 0);
lcd.write(lamda);
lcd.print(F("Y"));
lcd.write(pi);
lcd.print(F("OYMA"));
lcd.write(sigma);
lcd.print(F("TE,"));
lcd.setCursor(3, 1);
lcd.write(delta);
lcd.print(F("EN M"));
lcd.write(pi);
lcd.print(F("OPOYME NA"));
lcd.setCursor(1, 2);
lcd.write(sigma);
lcd.print(F("A"));
lcd.write(sigma);
lcd.print(F(" E"));
lcd.write(ksi);
lcd.print(F("Y"));
lcd.write(pi);
lcd.print(F("PETH"));
lcd.write(sigma);
lcd.print(F("OYME!"));
lcd.setCursor(3, 3);
lcd.print(F("KENE"));
lcd.write(sigma);
lcd.print(F(" "));
lcd.write(thita);
lcd.print(F("E"));
lcd.write(sigma);
lcd.print(F("EI"));
lcd.write(sigma);
lcd.print(F(": "));
lcd.print(Availiable, DEC);
setNumber(Availiable);
lcd.print(F(" "));
}
//================================================================
void showPlaces()
{
lcd.setCursor(0, 1);
lcd.print(F("1= 2= 3= 4= "));
lcd.setCursor(0, 2);
lcd.print(F("5= 6= 7= 8= "));
checkParkings();
}
defines.h
Κώδικας:
//================================================================
#if defined(ARDUINO) && ARDUINO >= 100
#define printByte(args) write(args);
#else
#define printByte(args) print(args,BYTE);
#endif
#define fi 0
#define psi 1
#define omega 2
#define gamma 3
#define delta 4
#define lamda 5
#define ksi 6
#define pi 7
#define sigma 246
#define thita 242
#define degrees 223
const uint8_t LedA = 11;
const uint8_t LedB = 12;
const uint8_t LedC = 2;
const uint8_t LedD = 3;
#define BAR 9
#define EXIT_IR 4
#define ENTRANCE_IR 5
#define BAR_LOW 171
#define BAR_HIGH 112
#define MAX_CARS 8
#define PARKING_1 A0
#define PARKING_2 A1
#define PARKING_3 A2
#define PARKING_4 A3
#define PARKING_5 6
#define PARKING_6 7
#define PARKING_7 8
#define PARKING_8 10
const int DISPLAY_WIDTH = 20;
int pos;
int Availiable = MAX_CARS;// + 1;
int g_nPosition = 0;
char dataBuffer[] = " ARDUINO AUTOMATED PARKING LOT SYSTEM *** ANGEL MARAGKAKIS 2019";
const int DATA_LENGTH = sizeof(dataBuffer);
uint8_t incomingByte;
//================================================================
byte FI[8] = {
B01110,
B10101,
B10101,
B10101,
B01110,
B00100,
B00100,
B00000
};
byte PSI[8] = {
B10101,
B10101,
B10101,
B01110,
B00100,
B00100,
B00100,
B00000
};
byte OMEGA[8] = {
B01110,
B10001,
B10001,
B10001,
B01110,
B00000,
B11111,
B00000
};
byte GAMMA[8] = {
B11111,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B00000
};
byte DELTA[8] = {
B00100,
B01010,
B10001,
B10001,
B10001,
B10001,
B11111,
B00000
};
byte LAMDA[8] = {
B00100,
B01010,
B10001,
B10001,
B10001,
B10001,
B10001,
B00000
};
byte KSI[8] = {
B11111,
B00000,
B00000,
B01110,
B00000,
B00000,
B11111,
B00000
};
byte PEE[8] = {
B11111,
B10001,
B10001,
B10001,
B10001,
B10001,
B10001,
B00000
};
//================================================================
Μπορούν σε πολλά σημεία του κώδικα να αφαιρεθούν γραμμές που περιέχουν την εντολή Serial.print(); ή Serial.println(); που μπήκαν για ένα υποτυπώδες
debugging, ώστε να κερδηθεί μνήμη προγράμματος (αν και δεν έχει καθόλου σημασία αυτό).
Όπως πάντα, χωρίς σχόλια στον κώδικα...