Schema generala a conexiunilor shield-ului |
Voi prezenta modul de lucru al semaforului. In conditii normale, semaforul va fi verde pentru masini si rosu pentru pietoni. In momentul in care este apasat butonul, dupa 10 (10000ms) secunde se stinge becul verde si se aprinde galbenul pentru masini timp de 4 secunde apoi rosu pentru masini; in tot acest timp pentru pietoni este rosu. Din motive de siguranta, verdele pentru pietoni se va aprinde la 3 secunde dupa rosul pentru masini; dupa 20 de secunde verdele pietonilor va incepe sa lumineze intermitent si se stinge becul verde si se aprinde becul rosu; peste 2 secunde se da liber masinilor. Din motive practice, trebuie sa adaugam o functie care sa impiedice schimbarea semaforului pentru fiecare pieton care doreste sa traverseze; asa ca vom adauga in program o conditie care sa contorizeze timpul trecut de la ultima declansare; astfel timp de 2 minute nu se va mai da liber pentru pietoni de oricate ori este apasat butonul.
In timp ce scriam postul, mi-am dat seama ca am omis sa introduc pposibilitatea de a memora apasarea butonului in cele 2 minute si la scuregerea lor sa apeleze functia de schimbare a semaforului.
Rezumatul Proiectului |
Shield-ul pe care l-am construit este conectat la pinii digitali 13, 12, 11, 10, 9, 8 si la pinii de alimentare 5V si GND. Am ales acest layout pentru o fixare mai buna. Desigur, se poate folosi si pin-ul GND de langa pin-ul 13. Pentru buton, alegerea pinului 13 nu este intamplatoare( rol de control); acesta avand un led pe placuta Arduino; astfel pot vedea un efect atunci cand apas butonul din circuit. Voi pune acum si codul complet pe care l-am folosit la realizarea proiectului:
Arduino cu "semafor" shield atasat |
//Interactive Traffic Lights
/*
Author:
THE ARDUINO BLOG
http://thearduinoblog.blogspot.com
*/
// assign the car lights
int carRed = 12;
int carYellow = 11;
int carGreen = 10;
// assign the pedestrian lights
int pedRed = 8;
int pedGreen = 9;
int button = 13; // button pin
int crossTime = 20000; // time allowed to cross
unsigned long changeTime; // time since button pressed
void setup() {
Arduino si "Semafor" Shield |
pinMode(carRed, OUTPUT);
pinMode(carYellow, OUTPUT);
pinMode(carGreen, OUTPUT);
pinMode(pedRed, OUTPUT);
pinMode(pedGreen, OUTPUT);
pinMode(button, INPUT); // button
// turn on the green light
digitalWrite(carGreen, HIGH);
digitalWrite(pedRed, HIGH);
}
void loop() {
int state = digitalRead(button);
/* check if button is pressed and it is
over 2 minutes since last button press */
if (state == HIGH && (millis() - changeTime) > 120000) {
// Call the function to change the lights
delay(10000);
changeLights();
}
}
void changeLights() {
digitalWrite(carGreen, LOW); // carGreen off
digitalWrite(carYellow, HIGH); // carYellow on
delay(4000); // wait 4 seconds
digitalWrite(carYellow, LOW); // carYellow off
digitalWrite(carRed, HIGH); // carRed on
delay(3000); // wait till its safe
digitalWrite(pedRed, LOW); // pedRed off
digitalWrite(pedGreen, HIGH); // pedGreen on
delay(crossTime); // wait for preset time period
// flash the ped green
for (int x=0; x<5; x++) {
digitalWrite(pedGreen, HIGH);
delay(250);
digitalWrite(pedGreen, LOW);
delay(250);
}
// turn pedRed on
digitalWrite(pedRed, HIGH);
delay(2000);
digitalWrite(carYellow, HIGH); // carYellow on
delay(2000);
digitalWrite(carRed, LOW); // carRed off
digitalWrite(carGreen, HIGH); //carGreen on
digitalWrite(carYellow, LOW); // carYellow off
// record the time since last change of lights
changeTime = millis();
}
Conexiunea shield - board |
Fiecare linie de program are un comentariu care arata ce face linia respectiva. Un exercitiu de aplicare a ceea ce a fost prezentat este adaugarea memorarii apasarii butonului in intervalul de 2 minute.
wow that is really awesome man
RăspundețiȘtergereinteresant si multumim ! 10x
RăspundețiȘtergereadaugarea memorarii timp de 2 minute, de la apasarea butonului cum se face ?
este deja inclusa in program.
Ștergereif (state == HIGH && (millis() - changeTime) > 120000)
in variabila changeTime este retinut momentul final al ultimei schimbari. In momentul cand butonul este apasat, se verifica daca intre momentul ultimei schimbari si momentul actual (dat de functia millis()) au trecut 12 000 de milisecunde adica 2 minute. Daca au trecut schimba semaforul, daca nu au trecut pur si simplu ignora apasarea butonului. Se poate adauga o alta variabila care sa retina faptul ca butonul a fost apasat in intervalul de doua minute si care sa activeze functia de schimb cand trec cele doua minute.
Sper ca am inteles bine intrebarea
Zi buna