Proiectul consta intr-un speedometru ce va intoarce viteza actuala si poate fi setata o anumita viteza pe care daca o depaseste va opri motorul unei masini si va afisa un mesaj de eroare pe display timp de 5 secunde.Acesta il voi monta pe o masina ce functioneaza din keyoad si poate merge doar in fata.Acesta are rolul de a fi montat pe masini ca un semnal de alarma in cazul depasiri vitezei.
Pe display cu ajutorul modului gps vom afisa viteza.Acestea vor fi montate pe masina astfel incat viteza afisata sa fie aceea a masinutei.Vom putea pune o limita de viteza astfel pe display va aparea si limita si viteza actuala.Daca limita este depasita atunci se va afisa pe display un mesaj de avertizare si masina va fi oprita 5 secunde.Voi folosi un keypad cu ajutorul caruia se va selecta modul de limitare al vitezei,superior sau inferior, apoi se va introduce viteza care nu se vrea depasita sau scazuta.Totodata cu ajutorul sau poti selecta ce unitate de masura vrei cum ar fi km/h,m/s etc si poti porni si deplasarea masini
Mediu de dezvoltare: Arduin Ide
Bibilioteci suplimentare pe care le-am folosit:
Setup:
void setup() {
pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); Serial.begin(9600); ss.begin(9600); tft.initR(INITR_BLACKTAB); tft.fillScreen(ST7735_BLACK); tft.setTextColor(ST7735_WHITE); }
Loop:
void loop() {
char key = keypad.getKey(); unsigned long currentMillis = millis(); if(key) { if(key == '1' && tip != 0 && !speedmode && !option && mod == 0){ tft.fillRect(0, 110, 70, 10, ST7735_BLACK); tft.fillRect(0, 100, 70, 10, ST7735_BLACK); tft.fillScreen(ST7735_BLACK); prevspeed = -1; prevAlt = -1; tip = 0; speeddisplay = true; } if(key == '*') { pinstate = !pinstate; } if(key == '#') { speeddisplay = !speeddisplay; if(speeddisplay){ option = false; }else{ option = true; } mod = 0; speedmode = false; tft.fillScreen(ST7735_BLACK); prevspeed = -1; prevAlt = -1; } } while (ss.available() > 0) { gps.encode(ss.read()); } float currspeed = 0; if(unit == 1){ currspeed = gps.speed.isValid() ? gps.speed.kmph() : 0.0; }else{ currspeed = gps.speed.isValid() ? gps.speed.mps() : 0.0; } float currAlt = gps.altitude.isValid() ? gps.altitude.meters() : 0.0; if(speeddisplay){ if (currspeed != prevspeed) { tft.fillRect(20, 40, 128, 20, ST7735_BLACK); tft.setTextSize(2); tft.setCursor(20, 40); tft.print(currspeed); if(unit == 1){ tft.print(" km/h"); }else { tft.print(" m/s"); } prevspeed = currspeed; }
if (currAlt != prevAlt) { tft.fillRect(70, 110, 128, 10, ST7735_BLACK); tft.setTextSize(1); tft.setCursor(65, 110); tft.print("Alt:"); tft.print(currAlt); tft.print(" m"); prevAlt = currAlt; } if(tip != 0){ tft.setTextSize(1); tft.setCursor(5, 110); tft.setTextColor(ST7735_WHITE); tft.print(limitspeed); if(unit == 1){ tft.print(" km/h"); }else { tft.print(" m/s"); } tft.setCursor(5, 100); tft.print("Limit:"); } } if(speedmode){ tft.setTextSize(1); tft.setCursor(5, 50); tft.print("Introdu viteza"); tft.setCursor(10, 70); tft.print(limitspeed); if (key && key >= '0' && key <= '9') { int number = key - '0'; limitspeed = limitspeed * 10 + number; tft.fillRect(10, 70, 50, 10, ST7735_BLACK); tft.setCursor(10, 70); tft.print(limitspeed); } } if (tip == 2 && limitspeed > gps.speed.kmph() && !option && !speedmode) { tft.fillScreen(ST7735_RED); tft.setTextSize(1); tft.setCursor(20, 50); tft.setTextColor(ST7735_WHITE); tft.print("Pick up the pace"); speeddisplay = false; } if (tip == 2 && limitspeed < gps.speed.kmph() && !option && !speedmode){ tft.fillScreen(ST7735_BLACK); speeddisplay = true; } if(mod == 1){ tft.setTextSize(1); tft.setCursor(5, 50); tft.print("Alege tipul limitarii"); tft.setCursor(10, 70); tft.print("1-superior"); tft.setCursor(10, 90); tft.print("2-inferior"); if(key == '1'){ tip = 1; tft.fillScreen(ST7735_BLACK); mod = 0; Serial.print(F("intra")); speedmode = true; delay(200); } if(key == '2'){ tip = 2; tft.fillScreen(ST7735_BLACK); mod = 0; speedmode = true; delay(200); } } if(mod == 2){ tft.setTextSize(1); tft.setCursor(10, 50); tft.print("Alege unitatea de masura"); tft.setCursor(10, 70); tft.print("1-km/h"); tft.setCursor(10, 90); tft.print("2-m/s"); if(key == '1'){ unit = 1; tft.fillScreen(ST7735_BLACK); mod = 0; speeddisplay = true; prevspeed = -1; delay(200); } if(key == '2'){ unit = 2; tft.fillScreen(ST7735_BLACK); mod = 0; prevspeed = -1; speeddisplay = true; delay(200); } } if(option) { tft.setTextSize(1); tft.setCursor(10, 50); tft.print("Alege optiunea"); tft.setCursor(10, 70); tft.print("1-limitare"); tft.setCursor(10, 90); tft.print("2-unitate"); if(key == '1'){ mod = 1; tft.fillScreen(ST7735_BLACK); option = false; limitspeed = 0; tip = 0; delay(200); } if(key == '2'){ mod = 2; tft.fillScreen(ST7735_BLACK); option = false; delay(200); } }
if(pinstate) { if (tip == 1 && limitspeed < gps.speed.kmph()) { stop(); tft.fillScreen(ST7735_RED); tft.setTextSize(1); tft.setCursor(20, 50); tft.setTextColor(ST7735_WHITE); tft.print("LIMIT EXCEEDED"); if (currentMillis - previousMillis >= interval) { tip = 0; limitspeed = 0; prevspeed = -1; prevAlt = -1; tft.fillScreen(ST7735_BLACK); } } else { moveForward(); } }else { stop(); }
}
Move Forward:
void moveForward() {
digitalWrite(in1, LOW); digitalWrite(in2, HIGH); digitalWrite(in3, HIGH); digitalWrite(in4, LOW); }
Stop:
void stop() {
digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, LOW); }
Rezultatele obtinute au fost cele asteptate gps-ul fiind testat merge pentru viteze mici cum ar fi cele ale masinutei ,dar la viteze destul de mari prinde un anumit delay.Overall Masina functioneaza exact cum ar trebui gps-ul functionand pentru masina,meniul functioneaza pentru a adauga constrangerile necesare vitezei si pentru a schimba viteza masinii.