İçindekiler:
Video: Akıllı İnteraktif Trafik Işığı: 5 Adım (Resimlerle)
2025 Yazar: John Day | [email protected]. Son düzenleme: 2025-01-13 06:58
Dünyanın en iyi ve en etkileşimli trafik ışığını oluşturmaya hazır mısınız? İyi! Bu eğitimde, Arduino kullanarak kendi başınıza nasıl bir tane oluşturabileceğinizi açıklayacağız.
Gerekli bileşenler:- Arduino (..duh)- LM317 Mosfet- 2x 60cm Analog RGB LED Şeritler (12V)- PVC tüp (1m x 125mm)- Kablolar (kırmızı ve siyah)- Işık kapakları için metal plakalar- Işık için akrilik -simgeler (.svg simgeleri için flaticon.com'a bakın)- Spreycan siyah beyaz boya.- Elektrik bandı- Gerekli tüm lehimleme bileşenleri- Gerekli kalkanlı ekran (eğitimde kullanılmaz)
1. Adım: 1. Adım: Işık Başlıklarını Yapın
Tasarım tamamen size kalmış. Işıkları tutmak için 15x15cm'lik bir kapak yaptık. Metal plakaları doğru boyutta kestik ve kapakları doğru şekillerde bükmek için metal bir bükücü (hayır, Avatar'dan değil) kullandık. Arka plakalar farklı bir bileşenden yapılmıştır.
Adım 2: Adım 2: PVC Direği Hazırlama
Işık kapaklarına uyması için PVC direğe 2 delik açın. Sonra her şeyi siyaha boyamak için siyah boya spreyi kullanın. Dilerseniz direğin alt kısmına beyaz şeritler ekleyebilirsiniz (Hollanda'da yaygındır).
Adım 3: Adım 3: RGB LED Şeritlerinin Birleştirilmesi ve Akrilik Plakaların Kumlanması
Ardından, RGB LED şeritlerini ışık başlığının içine monte etmeniz gerekecek. Bunları kapağın etrafına sıkıca oturtun ve mümkün olduğunca öne yakın yerleştirin.
Sırada, akrilik plaka üzerinde seçilen sembolü kumlamanız gerekecek. Biraz bant alın ve tüm akrilik plakayı kaplayın. Ardından istediğiniz şekli/şekli kesin. Bundan sonra, buzlu cam benzeri bir etki elde etmek için plakayı kumlayabilirsiniz.
Adım 4: Adım 4: RGB LED Şeritlerini Arduino'ya bağlayın
Şimdi zor kısım geliyor: RGB LED Şeritlerini Arduino'ya bağlamak. Pinleri bağlarken 12v'yi şeridinizin 12v'sine koyduğunuzdan emin olun. Her rengin arasına, yani kırmızı veya yeşil, bir mosfet koymanız gerekiyor. Led şeridin verilerini mosfet'in orta pimine ve sol pimi Arduino'nuza bağlayın. Sağ pin Arduino'nun zeminine geri dönmelidir.
Adım 5: Adım 5: Arduino Kodunu Yazın
Bu Arduino kodu bluetooth ile kontrol edilir, çünkü dahili bir ekran kullanmadık. Böylece kod, loop() işlevindeki bluetooth mesajları aracılığıyla kontrol edilir.
#define r 6#define g 11 #dahil
SoftwareSerial mySerial(10, 11); // RX, TX
#define kızgınUzunluk 4
#define düşmeUzunluğu 3 #mutluLength'i tanımla 4 #PhoneLength'i tanımla 13 #konuşmaUzunluğunu tanımla 5 #yürüyüş uzunluğunu tanımla 4 #yürümeUzunluğunu tanımla 4 #sallamaUzunluğunu tanımla 6
bool düğmesiBasılı;
int akımMillis; int öncekiMillis;
int animasyon1Gecikme;
int animasyon2Gecikme; int animasyon3Gecikme; int animasyon4Delay;
bool animasyon1Done = yanlış;
bool animasyon2Done = yanlış; bool animasyon3Done = yanlış; bool animasyon4Done = yanlış; bool animasyon5Bitti = yanlış;
bool blockLight = yanlış;
bool lightRed = doğru;
int currentAnimationDelay;
geçersiz kurulum() {
// bir kez çalıştırmak için kurulum kodunuzu buraya koyun: pinMode(r, OUTPUT); pinMode(g, ÇIKIŞ);
Seri.başla(9600);
mySerial.begin(38400); Seri.setTimeout(25); buttonPressed = yanlış; akımMillis = 0; öncekiMillis = 0;
animasyon1Gecikme = yürümeUzunluğu * 1000;
animasyon2Delay = wavingLength * 1000; animasyon3Delay = mutluUzunluk * 1000; animasyon4Delay = yürüyüşOutLength * 1000;
//currentAnimationDelay = animasyon1Gecikme * 1000;
lightRed = doğru; }
boşluk döngüsü () {
//gecikme(20);
// tekrar tekrar çalıştırmak için ana kodunuzu buraya koyun: unsigned long currentMillis = millis(); if(buttonPressed == true) { if(animation1Done == false) { if(currentMillis - öncekiMillis > animasyon1Delay) { Serial.println("0"); öncekiMillis = şimdikiMillis; animasyon1Done = doğru; } } else if(animation2Done == false ve animasyon1Done == true) { if(currentMillis - öncekiMillis > animasyon2Delay) { Serial.println("1"); öncekiMillis = şimdikiMillis; animasyon2Done = doğru; } } else if(animation3Done == false ve animasyon2Done == true) { if(currentMillis - öncekiMillis > animasyon3Delay) { Serial.println("2"); //Serial.println("ses:yeşil"); öncekiMillis = şimdikiMillis; animasyon3Done = doğru; lightRed = yanlış; } } else if(animation4Done == false ve animasyon3Done == true) { if(currentMillis - öncekiMillis > animasyon4Delay) { öncekiMillis = currentMillis; animasyon4Done = doğru; Serial.println("FLSH"); } } }
if (Serial.available()) {
String str = Serial.readString(); if(str == "CMD:BUTTON_PRESSED") {
animasyon1Done = yanlış;
animasyon2Done = yanlış; animasyon3Done = yanlış; animasyon4Done = yanlış; animasyon5Done = yanlış;
animasyon1Gecikme = yürümeUzunluğu * 1000;
animasyon2Delay = wavingLength * 1000; animasyon3Delay = mutluUzunluk * 1000; animasyon4Delay = yürüyüşOutLength * 1000;
//currentAnimationDelay = animasyon1Gecikme * 1000;
lightRed = doğru; Seri.println("3"); buttonPressed = doğru; öncekiMillis = şimdikiMillis; }
if(str == "KIRMIZI") {
blokLight = yanlış; lightRed = doğru; }
if(str == "YEŞİL") {
blokLight = yanlış; lightRed = yanlış; }
if(str == "IŞIK:YEŞİL:KAPALI") {
blokIşık = doğru; analogWrite(g, 255); } if(str == "IŞIK:YEŞİL:AÇIK") { blockLight = true; analogWrite(g, 0); } //Serial.println(str); }
if(blockLight == yanlış) {
if(lightRed == doğru) {
analogWrite(r, 0); analogWrite(g, 255); } if(lightRed == false) { analogWrite(r, 255); analogWrite(g, 0); } } }