Sunteți pe pagina 1din 5

Tema: Automate Finite.

Sarcina: Sa se realizeze o aplicatie ce va implementa Automatele finite dupa cum urmeaza:


1. Proiectare Automat Finit aplicatie Button-Led.
2. Proiectare Automat Finit aplicatie Semafor

Realizarea lucrarii
Partea 1
Materiale necesare
a) Arduino UNO
b) LED
c) 200 ohm resistor
d) Pushbutton
e) 10 k ohm resistor

Figura 1 – Schema circuitului partii intai

Rezultate:
1. La apasarea butonului, se schimba starea activa și butonul își schimba starea din conectat în deconectat.
Partea 2
Materiale necesare
a) Arduino Uno
b) Red LED x2
c) Green LED x2
d) Yellow LED
e) 200 ohm Resistor x5
f) Pushbutton
g) 10 k ohm resistor

Figura 2 – Schema circuitului semafor

Rezultate:
Starea 1: Led pietoni roșu – conectat, Led automobile verde – conectat. Starea se chimba la apasarea
butonului. Automobilele au un timp minim de 10 secunde pana când se poate activa starea următoare.
Dacă, de exemplu, starea s-a început cu 5 secunde în urma, la apasarea butonului, automobilele vor mai
avea 5 secunde pana se începe următoarea stare, care avertizeaza despre faptul ca pietonii vor sa treacă
strada.
Starea 2: Led pietoni roșu – conectat, led automobile verde – intermitent
Starea 3: Led pietoni roșu – conectat, led automobile galben – inclus
Starea 4: Led pietoni verde – conectat, led automobile roșu – conectat. Starea se schimba după timpul
setat pentru pietoni, care este de 5 secunde.
Starea 5: Led pietoni verde – intermitent, led automobile roșu – conectat.
Starea 6: Led pietoni roșu – conectat, led automobile galben – conectat, led automobile roșu – conectat.
După starea 6 se trece din nou la prima, care deja se va schimba doar la apasarea butonului.

Concluzii: La aceasta lucrare de laborator am realizat doua aplicații pe baza MCU care implementeaza un
automatele finite. În prima parte a fost efectuata o simpla aplicație care schimba starea unui led prin
apasarea unui buton, iar în a doua un semafor ce conține 6 stari în automat. Aceste stari pot fi reordonate,
deoarece ele actioneaza independent și nu țin cont de cele precedente sau următoare.

Anexa A
Codul sursa a sarcinii 1

enum class Lightstate {RED, REDYELLOW, YELLOW, GREEN}; // for future use: YELLOWBLINK, GREENBLINK, BLACK ...
// the patterns to be shown on the crossing
Lightstate pattern[4][4]
{ // carsVertical carsHorizontal pedestrainVertical pedestrainHorizontal
{Lightstate::RED, Lightstate::GREEN, Lightstate::GREEN, Lightstate::RED}, // 0
{Lightstate::REDYELLOW, Lightstate::YELLOW, Lightstate::RED, Lightstate::RED}, // 1
{Lightstate::GREEN, Lightstate::RED, Lightstate::RED, Lightstate::GREEN}, // 2
{Lightstate::YELLOW, Lightstate::REDYELLOW, Lightstate::RED, Lightstate::RED} // 3
};
// one traffic light needs up to three pins:
struct Light {
const byte redPin;
const byte yellowPin;
const byte greenPin;
};
// lets create 4 traffic lights (in reality there might be 8, but left/right, up/down are the same currently
Light light[4] { // assign pins to the 4 lights:
{2, 3, 4}, // carsVertical
{4, 5, 6}, // carsHorizontal
{7, 255, 8}, // pedestrainVertical (255 - no LED connected)
{9, 255, 10} // pedestrainHorizontal
};
constexpr byte requestVerticalPin = A0; // pedestrain request
constexpr byte requestHorizontalPin = A1; // pedestrain request
const size_t noOfLights = sizeof(light) / sizeof(light[0]); // total number of (individual) traffic
lights
const size_t noOfPatterns = sizeof(pattern) / sizeof(pattern[0]); // total number of traffic light pattern
uint32_t previousMillis = -5000; // time management
size_t currentPattern = 0; // actual state of crossing

void show(byte index, Lightstate lightstate) // helper function to output one traffic light
{
byte red = LOW , green = LOW, yellow = LOW;
switch (lightstate)
{
case Lightstate::RED :
red = HIGH;
break;
case Lightstate::REDYELLOW :
red = HIGH;
yellow = HIGH;
break;
case Lightstate::GREEN :
green = HIGH;
break;
case Lightstate::YELLOW :
yellow = HIGH;
break;
}
Serial.print(index); Serial.print(" "); Serial.print(" r"); Serial.print(red); Serial.print(" y");
Serial.print(yellow); Serial.print(" g"); Serial.println(green);
if (light[index].redPin < 255) digitalWrite(light[index].redPin, red);
if (light[index].greenPin < 255) digitalWrite(light[index].greenPin, green);
if (light[index].yellowPin < 255) digitalWrite(light[index].yellowPin, yellow);
}

void timerTraffic() // time management


{
if (millis() - previousMillis > 3000) {
previousMillis = millis();
if (++currentPattern >= noOfPatterns) currentPattern = 0;
setPattern(currentPattern);
}
}

void setPattern(byte newPattern) // set a new state / pattern for the crossing
{
currentPattern = newPattern;
previousMillis = millis();
Serial.print(F("currentPattern=")); Serial.println(currentPattern);
for (size_t i = 0; i < noOfLights; i++) show(i, pattern[currentPattern][i]); // activate the fitting pattern
for each light
}

void readButton()
{
if (digitalRead(requestHorizontalPin) == LOW && currentPattern == 0) setPattern(1); // magic numbers ;-(
if (digitalRead(requestVerticalPin) == LOW && currentPattern == 2) setPattern(3); // magic numbers ;-(
}

void setup(void)
{
Serial.begin(115200);
pinMode(requestHorizontalPin, INPUT_PULLUP);
pinMode(requestVerticalPin, INPUT_PULLUP);
for (size_t i = 0; i < noOfLights; i++) {
if (light[i].redPin < 255) pinMode(light[i].redPin, OUTPUT);
if (light[i].yellowPin < 255) pinMode(light[i].yellowPin, OUTPUT);
if (light[i].greenPin < 255) pinMode(light[i].greenPin, OUTPUT);
show(i, Lightstate::YELLOW);
}
}

void loop(void)
{
timerTraffic();
readButton();
}

S-ar putea să vă placă și