Arduino-programmering för nybörjare: Tutorial för trafikljuskontroller
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-köpguide: Vilket styrelse ska du få? 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 ditt Arduino-startpaket Vad finns i ditt Arduino-startpaket? [Arduino-nybörjare] Vad finns i ditt Arduino-startpaket? [Arduino-nybörjare] Det är lätt att bli överväldig inför en låda full av elektroniska komponenter. 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:
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 istället för ett nummer. Börja ett nytt Arduino-projekt och börja med följande linjer:
int red = 10; int yellow = 9; int green = 8;
Låt oss sedan lägga 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(red, OUTPUT); pinMode(yellow, OUTPUT); pinMode(green, OUTPUT); }
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(); delay(15000); } void changeLights(){ // green off, yellow on for 3 seconds digitalWrite(green, LOW); digitalWrite(yellow, HIGH); delay(3000); // turn off yellow, then turn red on for 5 seconds digitalWrite(yellow, LOW); digitalWrite(red, HIGH); delay(5000); // red and yellow on for 2 seconds (red is already on though) digitalWrite(yellow, HIGH); delay(2000); // turn off red and yellow, then turn on green digitalWrite(yellow, LOW); digitalWrite(red, LOW); digitalWrite(green, HIGH); delay(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 > Kort och Verktyg > Portmenyer). Du bör ha ett fungerande trafikljus som ändras var 15: e sekund, så här (påskyndas):
Låt oss dela upp den här koden. ChangeLights- funktionen utför allt hårt arbete. Detta roterar trafikljuset genom gult och rött och sedan tillbaka till grönt. När detta kallas in i loopfunktionen kommer Arduino att köra denna kod för alltid, med en 15-sekunders paus varje gång.
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ångsstiften till HÖG (för på) eller LÅG (för av).
Efter att ha aktiverat eller inaktiverat de nödvändiga lysdioderna gör förseningen Arduino att vänta i 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:
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 den, och du undrar kanske varför. Detta är ett neddragbart motstånd.
En switch låter antingen strömmen flöda 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 tryckknappströmbrytare som faktiskt inte trycks in 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 elektrisk störning. Med andra ord, en flytande switch ger varken en pålitlig HÖG eller LÅG avläsning. Ett neddragbart motstånd håller en liten mängd ström att flyta när omkopplaren stängs, vilket säkerställer en exakt avläsning av lågt tillstånd.
I andra logikkretsar kanske du hittar ett dragmotstånd istället, och det fungerar på samma princip, men i motsatt riktning, och se till att den specifika logikgrinden är standard.
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 lamporna 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 button = 12; // switch is on pin 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 stängas av tills första lampan förändras .
pinMode(button, INPUT); digitalWrite(green, HIGH);
Ändra hela slingfunktionen till följande istället:
void loop() { if (digitalRead(button) == HIGH){ delay(15); // software debounce if (digitalRead(button) == HIGH) { // if the switch is HIGH, ie. pushed down - change the lights! changeLights(); delay(15000); // wait for 15 seconds } } }
Det borde göra det. Du undrar kanske varför knappkontrollen sker två gånger ( digitalRead (knapp) ), åtskilda av en liten fördröjning. Det här debatterar. Precis som 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 i if- uttalandet i 15 sekunder kan trafikljuset inte ändras under åtminstone den varaktigheten. När 15 sekunder är över startar öglan igen. Varje omstart av slingan läser den på knappen igen, men om den inte trycks in aktiveras if- satsen aldrig, lamporna ändras aldrig och programmet startas om igen.
Så här ser ut (påskyndas):
Arduino trafikljus med korsning
Låt oss prova en mer avancerad modell. Istället för en övergångsställe, ändra din krets så att du har två trafikljus:
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:
// light one int red1 = 10; int yellow1 = 9; int green1 = 8; // light two int red2 = 13; int yellow2 = 12; int green2 = 11; void setup(){ // light one pinMode(red1, OUTPUT); pinMode(yellow1, OUTPUT); pinMode(green1, OUTPUT); // light two pinMode(red2, OUTPUT); pinMode(yellow2, OUTPUT); 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(); delay(15000); }
Återigen utförs allt arbete i ChangeLights- funktionen. I stället för att bli 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(){ // turn both yellows on digitalWrite(green1, LOW); digitalWrite(yellow1, HIGH); digitalWrite(yellow2, HIGH); delay(5000); // turn both yellows off, and opposite green and red digitalWrite(yellow1, LOW); digitalWrite(red1, HIGH); digitalWrite(yellow2, LOW); digitalWrite(red2, LOW); digitalWrite(green2, HIGH); delay(5000); // both yellows on again digitalWrite(yellow1, HIGH); digitalWrite(yellow2, HIGH); digitalWrite(green2, LOW); delay(3000); // turn both yellows off, and opposite green and red digitalWrite(green1, HIGH); digitalWrite(yellow1, LOW); digitalWrite(red1, LOW); digitalWrite(yellow2, LOW); digitalWrite(red2, HIGH); delay(5000); }
Så här ser ut (påskyndas):
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ägs (eller mer) korsning, 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 denna DIY MIDI-controller eller Arduino-robot med Xod? Du kan också ta en titt på Arduino-kodning med VS-kod och plattformIO Bättre Arduino-kodning med VS-kod och plattformIO Bättre Arduino-kodning med VS-kod och plattformIO Vill du ha ett enkelt sätt att börja koda Arduino? Med PlatformIO och VS-kod kan du förenkla Arduino-projekt och lära dig snabbare. Läs mer .
Bildkredit: androsvector / Shutterstock
Utforska mer om: Arduino, DIY-projektstudier, programmering.