Vizitator Nagy Andrei Postat Ianuarie 13, 2016 Partajează Postat Ianuarie 13, 2016 Salut comunitate! Am de terminat un proiect cu arduino, semafor cu 2 leduri, unul RGB pentru masini iar altul pentru pietoni, iar in caz de cutremur la masini va fi pus pe galben intermitent. ce face programul, pai intitializare pune semafoarele ambele pe rosu timp de 8 secunde, iar cu cele 2 cu care incepe start semafor sunt 10, asa trebuie puse ca sa corespunda cu cerinta, apoi merge verde pietoni, rosu pietoni, verde galben rosu masini M 10s R 15s V 3s G>>>>>>>>>>>>P 8s V, 20s R; programul porneste la apasarea butonului dar nu se mai opreste, iar in legatura cu senzorul de vibratii, daca nu apas butonul de start, merge, iar in timpu functionarii, nu se intampla nimica daca sunt vibratii. #include <Arduino.h>int inPin = 2; // the number of the input pinint outPin = 13; // the number of the output pinint state = HIGH; // the current state of the output pinint reading; // the current reading from the input pinint previous = LOW; // the previous reading from the input pinlong time = 0; // the last time the output pin was toggledlong debounce = 200; // the debounce time, increase if the output flickersclass Semafor{private: int pinLedRosuP; int pinLedVerdeP; int pinLedRosuM; int pinLedVerdeM; int pinLedGalbenM; int pinDifuzor; int pinButon; int pinSenzor; int pinSpeaker;public: Semafor(int rp, int vp, int rm, int vm, int gm, int ps); int initializare();void start_semafor();void cutremur();void stinge_leduri();};void Semafor::stinge_leduri(){ digitalWrite(pinLedRosuP, LOW); digitalWrite(pinLedVerdeP, LOW); digitalWrite(pinLedRosuM, LOW); digitalWrite(pinLedVerdeM, LOW); digitalWrite(pinLedGalbenM, LOW); }int buton(){ reading = digitalRead(inPin); if (reading == HIGH && previous == LOW && millis() - time > debounce) { if (state == HIGH) {state = LOW; return 1;} else {state = HIGH; return 0;} time = millis(); } digitalWrite(outPin, state); previous = reading;}int on=0;int Semafor::initializare(){ if(buton()) on=1;while(on==1){ digitalWrite(4, HIGH); digitalWrite(5, HIGH); delay(8000); on=2; }}Semafor::Semafor(int rp, int vp, int rm, int vm, int gm, int ps): pinLedRosuP(rp), pinLedVerdeP(vp), pinLedRosuM(rm), pinLedVerdeM(vm), pinLedGalbenM(gm), pinSpeaker(ps){ pinMode(rp, OUTPUT); pinMode(vp, OUTPUT); pinMode(rm, OUTPUT); pinMode(vm, OUTPUT); pinMode(gm, OUTPUT);}void Semafor::cutremur(){ digitalWrite(pinLedRosuP, LOW); digitalWrite(pinLedVerdeP, LOW); digitalWrite(pinLedRosuM, LOW); digitalWrite(pinLedVerdeM, LOW); digitalWrite(pinLedGalbenM, HIGH); delay(500); digitalWrite(pinLedGalbenM, LOW); }void Semafor::start_semafor(){ int i=1; delay(2000); digitalWrite(pinLedRosuP, LOW); digitalWrite(pinLedVerdeP, HIGH); for(i;i<=8;i++) {//tone(pinSpeaker, 250); delay(500); noTone(pinSpeaker); delay(500);} digitalWrite(pinLedVerdeP, LOW); digitalWrite(pinLedRosuP, HIGH); delay(2000); digitalWrite(pinLedRosuM, LOW); digitalWrite(pinLedRosuP, HIGH); digitalWrite(pinLedVerdeM, HIGH); delay(15000); digitalWrite(pinLedVerdeM, LOW); digitalWrite(pinLedGalbenM, HIGH); delay(3000); digitalWrite(pinLedGalbenM, LOW); digitalWrite(pinLedRosuM, HIGH);} int speakerPin=8;int SenzorPin=A0;Semafor *a;void setup() { Serial.begin(9600); int rp=4; int vp=3; int rm=5; int vm=9; int gm=6; int ps=8; pinMode(inPin, INPUT); pinMode(outPin, OUTPUT); a = new Semafor(rp,vp,rm,vm,gm,ps);}void loop(){ if(analogRead(SenzorPin)<10){ a->initializare(); if(on == 2) a->start_semafor(); while(buton()) a->stinge_leduri(); } while(analogRead(SenzorPin)>=10) {a->cutremur(); delay(500);} } Link spre comentariu
Liviu M Postat Ianuarie 13, 2016 Partajează Postat Ianuarie 13, 2016 Nu reusesc acum sa parcurg tot programul, dar asa, la repezeala, functia int buton(){ reading = digitalRead(inPin); if (reading == HIGH && previous == LOW && millis() - time > debounce) { if (state == HIGH) {state = LOW; return 1;} else {state = HIGH; return 0;} time = millis(); } digitalWrite(outPin, state); previous = reading;} mi se pare ciudata. Pe de o parte, atunci cand intri in if nu mai schimbi starea lui outPin si nu actualizezi previous, iar cand nu intri in if nu ai nici o valoare de return, asa ca nu stiu exact ce se intampla cu while(buton()) a->stinge_leduri(); } Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum