Annons

Arduino trafikljus är ett roligt litet projekt som du kan bygga in under en timme. Så här bygger du din egen med en Arduino och hur du ändrar kretsen för en avancerad variation.

Om du hellre vill titta på detta som självstudie som en video, har vi täckt:

Vad du behöver för att bygga en Arduino trafikljuskontroller

Förutom den grundläggande Arduino behöver du:

  • 1 x 10k-ohm-motstånd
  • 1 x knappknapp
  • 6 x 220 ohm-motstånd
  • En brödskiva
  • Anslutande ledningar
  • Röda, gula och gröna lysdioder

Nästan alla Arduino kommer att arbeta för detta projekt, förutsatt att det har tillräckligt med stift. Se till att du läser vår Arduino köpguide Arduino Buying Guide: Vilket styrelse ska du få?Det finns så många olika typer av Arduino-brädor där ute, du skulle bli förlåten för att du är förvirrad. Vilket ska du köpa för ditt projekt? Låt oss hjälpa till med denna Arduino-köpguide! Läs mer om du inte är säker på vilken modell du behöver. Du kanske redan har dessa delar i din Arduino startpaket Vad finns i ditt Arduino-startpaket? [Arduino nybörjare]

Inför en låda full av elektroniska komponenter är det lätt att bli överväldigad. Här är en guide till exakt vad du hittar i ditt kit. Läs mer .

Arduino Traffic Light: Grunderna

Låt oss börja i det små. Ett grundläggande, enda trafikljus är ett bra ställe att börja. Här är kretsen:

Kretsschema för grundläggande Arduino-trafikljus

Anslut anoden (lång ben) på varje LED till digitala stift åtta, nio och tio (via ett 220 ohm-motstånd). Anslut katoderna (korta benet) till Arduino's mark.

Kod för Arduino trafikljus

Börja med att definiera variabler så att du kan adressera lamporna med namn snarare än ett nummer. Börja ett nytt Arduino-projekt och börja med följande linjer:

int röd = 10; int gul = 9; int grön = 8;

Därefter lägger vi till installationsfunktionen, där du konfigurerar de röda, gula och gröna lysdioderna som utgångar. Eftersom du har skapat variabler för att representera stiftnumren kan du nu hänvisa till stiften med namn istället:

void setup () {pinMode (röd, UTGÅNG); pinMode (gul, UTGÅNG); pinMode (grön, UTGÅNG); }

De pinMode -funktionen konfigurerar Arduino för att använda en given stift som utgång. Du måste göra detta för att dina lysdioder ska fungera alls. Nu för trafikljusets logik. Här är koden du behöver. Lägg till detta under dina variabla definitioner och installationsfunktion:

void loop () {ChangeLights (); fördröjning (15000); } void changeLights () {// grön av, gul tänd i 3 sekunder digitalWrite (grön, LÅG); digitalWrite (gul, HÖG); fördröjning (3000); // stäng av gult och slå sedan rött på i 5 sekunder. DigitalWrite (gul, LÅG); digitalWrite (röd, HÖG); fördröjning (5000); // röd och gul på i 2 sekunder (röd är redan på) digitalWrite (gul, HÖG); försening (2000); // stäng av rött och gult, slå sedan på green digitalWrite (gul, LOW); digitalWrite (röd, LÅG); digitalWrite (grön, HÖG); fördröjning (3000); }

Ladda upp den här koden till din Arduino och kör (se till att välja rätt kort och port från Verktyg > Styrelse och Verktyg > Hamn menyer). Du bör ha ett fungerande trafikljus som ändras var 15: e sekund, så här (påskyndas):

Arduino trafikljus i aktion

Låt oss dela upp den här koden. De changeLights funktion utför allt hårt arbete. Detta roterar trafikljuset genom gult och rött och sedan tillbaka till grönt. När detta kallas inuti slinga Arduino kör denna kod för alltid, med en 15-sekunders paus varje gång.

De changeLights funktionen består av fyra distinkta steg:

  • Grön på, gul av
  • Gul av, röd på
  • Gul på, röd på
  • Grön på, röd av, gul av

Dessa fyra steg replikerar processen som används i riktiga trafikljus. För varje steg är koden mycket lik. Den lämpliga lysdioden slås på eller av med digitalWrite. Detta är en Arduino-funktion som används för att ställa in utgångsstift på HÖG (för på) eller LÅG (för av).

Efter att ha aktiverat eller inaktiverat de nödvändiga lysdioderna, fördröjning får Arduino att vänta på en viss tid. Tre sekunder i det här fallet.

Gå djupare: Arduino fotgängare

Nu när du känner till grunderna, låt oss förbättra det. Lägg i en tryckknapp för fotgängare att byta ljus närhelst de vill:

Kretsschema för Arduino gångväg

Lägg märke till hur trafikljuset är exakt samma som föregående exempel. Anslut knappen till den digitala stift 12. Du kommer att märka att omkopplaren har en högimpedans 10k-ohm-motstånd ansluten till det, och du undrar kanske varför. Detta är ett neddragbart motstånd.

En switch låter antingen det aktuella flödet eller inte. Detta verkar tillräckligt enkelt, men i en logisk krets bör strömmen alltid flyta i antingen ett högt eller lågt tillstånd (kom ihåg, 1 eller 0, HÖG eller LÅG). Du kan anta att en knappbrytare som inte trycks in verkligen skulle vara i LÅGT tillstånd, men i själva verket sägs den vara "flytande", eftersom ingen ström dras alls.

I detta flytande tillstånd är det möjligt att en falsk avläsning kommer att inträffa när den fluktuerar med elektriska störningar. Med andra ord ger en flytande strömbrytare varken en pålitlig HÖG eller LÅG avläsning. Ett neddragbart motstånd håller en liten mängd ström att strömma när omkopplaren stängs, vilket säkerställer en exakt avläsning av lågt tillstånd.

I andra logiska kretsar kan du hitta ett dragmotstånd istället, och det fungerar enligt samma princip, men i motsatt riktning, och se till att den specifika logikgrinden är hög.

Nu, i slingdelen av koden, istället för att byta lampor var 15: e sekund, kommer du att läsa statusen för tryckknappen i stället och bara byta lampor när den är aktiverad.

Kod för Arduino fotgängare

Börja med att lägga till en ny variabel för att lagra din knappstift:

int-knapp = 12; // omkopplaren är på stift 12. 

Lägg nu till en ny linje i installationsfunktionen för att deklarera omkopplaren som ingång. Lägg till en linje för att ställa in trafikljuset till det gröna scenen. Utan den här första inställningen skulle de stanna till första gången changeLights körs.

pinMode (knapp, INPUT); digitalWrite (grön, HÖG);

Ändra hela slingfunktionen till följande istället:

void loop () {if (digitalRead (knapp) == HÖG) {fördröjning (15); // mjukvara debounce if (digitalRead (knapp) == HÖG) {// om omkopplaren är HÖG, dvs. tryckt ner - byt ljus! changeLights (); fördröjning (15000); // vänta i 15 sekunder}} }

Det borde göra det. Du undrar kanske varför knappkontrollen sker två gånger (digitalRead (knapp)), åtskilda med en liten fördröjning. Det här debatterar. Liksom det neddragbara motståndet för knappen, stoppar denna enkla kontroll koden som upptäcker mindre störningar som ett knapptryck.

Genom att vänta inuti om på 15 sekunder, kan trafikljuset inte ändras under åtminstone den varaktigheten. När 15 sekunder är över startar öglan igen. Vid varje omstart av slingan läser den status på knappen igen, men om den inte trycks in, kommer om uttalandet aktiveras aldrig, lamporna ändras aldrig och programmet startar om igen.

Så här ser ut (påskyndas):

Gångkorsning Arduino i aktion

Arduino trafikljus med korsning

Låt oss prova en mer avancerad modell. Istället för en gångväg, byt din krets så att du har två trafikljus:

Cricuit diagram för Arduino trafikljus med korsning

Anslut det andra trafikljuset till digitala stift 11, 12 och 13.

Kod för Arduino trafikljus med korsning

Tilldela först dina nya trafikljusstift till variabler och konfigurera dem som utgångar, som i det första exemplet:

// lätt en. int red1 = 10; int gul1 = 9; int grön1 = 8; // ljus två. int red2 = 13; int gul2 = 12; int grön2 = 11; void setup () {// tänd en pinMode (red1, OUTPUT); pinMode (gul1, UTGÅNG); pinMode (grön1, UTGÅNG); // tänd två pinMode (red2, OUTPUT); pinMode (gul2, UTGÅNG); pinMode (green2, OUTPUT); }

Uppdatera nu din slinga för att använda koden från det första exemplet (istället för fotgängare):

void loop () {ChangeLights (); fördröjning (15000); }

Återigen utförs allt arbete i changeLights fungera. Snarare än att gå röd > röd & gul > grön, kommer den här koden att växla trafikljuset. När den ena är på grön är den andra på röd. Här är koden:

void changeLights () {// vrid båda gula på digitalWrite (grön1, LÅG); digitalWrite (gul1, HÖG); digitalWrite (gul2, HÖG); fördröjning (5000); // stäng av både gula gula och motsatta gröna och röda digitala skrivningar (gul1, LÅG); digitalWrite (red1, HIGH); digitalWrite (gul2, LÅG); digitalWrite (red2, LOW); digitalWrite (green2, HIGH); fördröjning (5000); // båda gula på igen digitalWrite (gul1, HÖG); digitalWrite (gul2, HÖG); digitalWrite (green2, LOW); fördröjning (3000); // stäng av både gula gula och motsatta gröna och röda digitala skrivningar (grön1, hög); digitalWrite (gul1, LÅG); digitalWrite (red1, LOW); digitalWrite (gul2, LÅG); digitalWrite (red2, HIGH); fördröjning (5000); }

Så här ser ut (påskyndas):

Arduino trafikljus med korsning i aktion

Arduino trafikljus Nästa steg

Det är allt för idag. Din nya förståelse av Arduino-lysdioder och knappar gäller alla typer av olika projekt. Om du vill utöka dessa trafikljus, varför inte bygga en fyrvägskorsning (eller mer), komplett med många gångvägar och trafikljus för fotgängare?

Eller varför inte utöka dina nya färdigheter med ett större projekt som detta DIY MIDI-styrenhet eller Arduino-robot med Xod? Du kan också titta på Arduino-kodning med VS-kod och plattformIO Bättre Arduino-kodning med VS-kod och plattformIOVill du ha ett enkelt sätt att börja koda Arduino? Med PlatformIO och VS Code kan du förenkla Arduino-projekt och lära dig snabbare. Läs mer .

Bildkredit: androsvector / Shutterstock

Joe är en examen i datavetenskap från University of Lincoln, Storbritannien. Han är en professionell mjukvaruutvecklare, och när han inte flyger drönare eller skriver musik kan han ofta hitta foton eller producera videor.