// 426 907 560 792 333 313
// arduino.cc car-counting-how-to-setup-3-cars-max 1368460
// FAILED ONCE!
//OLED # include <Adafruit_GFX.h>
//OLED # include <Adafruit_SSD1306.h>
const byte maxCars = 5;
# include <U8g2lib.h>
U8X8_SSD1306_128X64_NONAME_HW_I2C display(U8X8_PIN_NONE);
# include <Servo.h>
// attempt at a servo gate object
# include "gate.h"
Servo servo[2];
const byte servoPin[] = {A0, A1,};
//const int openAngle = 180;
//const int closedAngle = 90;
const byte entrySwitch = 5;
const byte exitSwitch = 4;
const byte entryBarrier = 3;
const byte exitBarrier = 2;
Gate inCars, outCars;
/* will eventually be in the Gate object class
bool enterSequence(bool hold)
{
return true;
};
*/
//OLED # define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
//OLED # define SCREEN_ADDRESS 0x3C
//OLED # define SCREEN_WIDTH 128 // OLED display width, in pixels
//OLED # define SCREEN_HEIGHT 64 // OLED display height, in pixels
//OLED Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
int numCars = 0; // number of cars inside the parking
bool inFlag; // flag for FlipFlop
bool outFlag; // flag for FlipFlop
void setup()
{
Serial.begin(115200);
Serial.println("\nThree Cars\n");
for (byte ii = 0; ii < 2; ii++)
servo[ii].attach(servoPin[ii]);
inCars.begin(entrySwitch, entryBarrier, servo + 0);
outCars.begin(entrySwitch, exitBarrier, servo + 1);
pinMode(entrySwitch, INPUT_PULLUP);
pinMode(exitSwitch, INPUT_PULLUP);
pinMode(entryBarrier, OUTPUT);
pinMode(exitBarrier, OUTPUT);
digitalWrite(entryBarrier, BCLOSED); //initial close barrier
digitalWrite(exitBarrier, BCLOSED); //initial close barrier
display.begin();
display.setPowerSave(0);
display.setFont(u8x8_font_pxplusibmcgathin_f);
// display.setFont(u8x8_font_5x7_f);
display.setCursor(0, 0);
display.println("alto777 is a genius!");
delay(777);
display.setCursor(0, 0);
display.println(" ");
// for (; ; );
// INIT OLED DISPLAY
//OLED oled.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
//OLED oled.clearDisplay();
//OLED oled.setTextSize(1);
//OLED oled.setTextColor(SSD1306_WHITE);
//OLED oled.setCursor(0, 0);
//OLED oled.println("Galactico Car Park");
//OLED oled.println("24 hours parking");
//OLED oled.display();
//OLED // OLED DISPLAY WORKING
delay(2000); //show initial message on OLED for 2 seconds
}
# define PRESST LOW
bool entrySensor;
bool exitSensor;
void loop() {
// WTF
if (0) {
static long counter;
Serial.print(counter); counter++;
Serial.println(" l o o p"); delay(100);
}
entrySensor = digitalRead(entrySwitch) == PRESST;
if (numCars < maxCars) {
if (entrySensor && !inFlag) {
inFlag = true;
// Serial.println("start add a car process");
inCars.service(true);
}
}
if (inFlag) {
bool done = !inCars.service(entrySensor);
// Serial.println(done ? "done true" : "done false");
if (done) {
// Serial.println(" finished and counted");
inFlag = false;
numCars++;
}
}
exitSensor = digitalRead(exitSwitch) == PRESST;
if (numCars > 0) {
if (exitSensor && !outFlag) {
outFlag = true;
// Serial.println("start car exit process");
outCars.service(exitSensor);
}
}
if (outFlag) {
bool done = !outCars.service(exitSensor);
if (done) {
// Serial.println(" finished and uncounted.");
outFlag = false;
numCars--;
}
}
delay(50);
//OLED // this the debounce delay! otherwise poor man's 50 Hz loop, 'K?
char msg[32];
sprintf(msg, "cars = %d ", numCars);
display.setCursor(0,0);
display.print(msg);
}
/*
struct Gate {
Servo *theServo;
byte state;
unsigned long lastTime;
int servoPosition;
byte iLamp; // any LED function
};
Gate A0ETC;
*/
/*
enum {IDLE = 0, HOLD, WAIT, FINI, CLEAN};
bool enterSequence(bool hold)
{
static int state = IDLE;
static unsigned long lastTime;
static int servoPosition = 90;
switch (state) {
case IDLE : if (!hold) break;
digitalWrite(enterBarrier, BOPEN);
servoPosition = 180;
inServo.write(servoPosition);
state = HOLD;
break;
case HOLD : if (hold) break;
digitalWrite(enterBarrier, BCLOSED);
lastTime = millis();
state = WAIT;
break;
case WAIT : if (lastTime && millis() - lastTime < DWELL) break;
lastTime = millis();
state = FINI;
break;
case FINI : if (millis() - lastTime < SRATE) break;
lastTime = millis();
servoPosition -= SSTEP;
if (servoPosition < 90) servoPosition = 90;
inServo.write(servoPosition);
if (servoPosition <= 90) state = CLEAN;
break; // srsly, you'd miss it if it weren't there.
case CLEAN :
if (!hold) state = IDLE; // YIKES!
break;
}
// busy?
return state != IDLE; // busy. not idle.
}
*/
ENTER............EXIT