Arduino-programmering for begyndere: Traffic Light Controller-projektvejledning
Reklame
Arduino-trafiklyset er et sjovt lille projekt, som du kan bygge i under en time. Her er, hvordan du bygger din egen ved hjælp af en Arduino, og hvordan du ændrer kredsløb for en avanceret variation.
Hvis du hellere vil se dette som tutorial som en video, har vi dig dækket:
Hvad du har brug for for at opbygge en Arduino-trafiklyscontroller
Bortset fra den grundlæggende Arduino, har du brug for:
- 1 x 10k-ohm-modstand
- 1 x knapkontakt
- 6 x 220 ohm-modstande
- En brødbræt
- Tilslutning af ledninger
- Røde, gule og grønne lysdioder
Næsten enhver Arduino vil arbejde for dette projekt, forudsat at det har nok stifter. Sørg for at læse vores Arduino-købsguide Arduino-købsvejledning: Hvilket bord skal du få? Arduino Købsvejledning: Hvilket bord skal du få? Der er så mange forskellige slags Arduino-tavler derude, du vil blive tilgitt for at blive forvirret. Hvilket skal du købe til dit projekt? Lad os hjælpe med denne Arduino-købsguide! Læs mere, hvis du ikke er sikker på, hvilken model du har brug for. Du har muligvis allerede disse dele i dit Arduino-startkit Hvad er der i dit Arduino Starter Kit? [Arduino-begyndere] Hvad er der i dit Arduino-startkit? [Arduino-begyndere] Det er let at blive overvældet overfor en kasse fuld af elektroniske komponenter. Her er en guide til nøjagtigt, hvad du finder i dit sæt. Læs mere .
Arduino trafiklys: det grundlæggende
Lad os begynde i det små. Et grundlæggende, enkelt trafiklys er et godt sted at starte. Her er kredsløbet:
Forbind anoden (langbenet) på hver LED til digitale stifter otte, ni og ti (via en 220 ohm-modstand). Forbind katoderne (korte ben) til Arduinos jord.
Kode til Arduino trafiklys
Start med at definere variabler, så du kan adressere lysene ved navn i stedet for et tal. Start et nyt Arduino-projekt, og start med disse linjer:
int red = 10; int yellow = 9; int green = 8;
Lad os derefter tilføje installationsfunktionen, hvor du konfigurerer de røde, gule og grønne LED'er til at være output. Da du har oprettet variabler til at repræsentere pin-numrene, kan du i stedet henvise til stifterne med navn:
void setup(){ pinMode(red, OUTPUT); pinMode(yellow, OUTPUT); pinMode(green, OUTPUT); }
PinMode- funktionen konfigurerer Arduino til at bruge en given pin som output. Du skal gøre dette for, at dine lysdioder overhovedet fungerer. Nu for trafiklysets faktiske logik. Her er den kode, du har brug for. Tilføj dette under dine variable definitioner og opsætningsfunktion:
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); }
Upload denne kode til din Arduino, og kør (sørg for at vælge det rigtige kort og port fra Værktøjer > Kort og værktøjer > Portmenuer). Du skal have et fungerende trafiklys, der skifter hvert 15. sekund, som dette (fremskyndet):
Lad os fordele denne kode. ChangeLights- funktionen udfører alt det hårde arbejde. Dette drejer trafiklyset gennem gult og rødt og derefter tilbage til grønt. Idet dette kaldes inde i loop- funktionen, kører Arduino denne kode for evigt med en 15-sekunders pause hver gang.
ChangeLights- funktionen består af fire forskellige trin:
- Grøn på, gul fra
- Gul fra, rød på
- Gul på, rød på
- Grøn på, rød slukket, gul slukket
Disse fire trin gentager processen, der bruges i rigtige trafiklys. For hvert trin er koden meget ens. Den passende LED tændes eller slukkes ved hjælp af digitalWrite . Dette er en Arduino-funktion, der bruges til at indstille outputstifterne til HØJ (for til) eller LAV (for slukket).
Efter aktivering eller deaktivering af de krævede lysdioder får forsinkelsen Arduino til at vente i et givet tidsrum. Tre sekunder i dette tilfælde.
Gå dybere: Arduino fodgængerovergang
Nu hvor du kender det grundlæggende, lad os forbedre det. Tilføj en trykknap til fodgængere til at skifte lys, når de vil:
Bemærk, hvordan lyskrydset er nøjagtigt det samme som det foregående eksempel. Slut knappen til den digitale pin 12. Du vil bemærke, at kontakten har en 10-ohm-modstand med høj impedans knyttet til den, og du spekulerer måske på, hvorfor. Dette er en pull-down modstand.
En switch muliggør enten strømmen eller ikke. Dette virker simpelt nok, men i et logisk kredsløb skal strømmen altid flyde i enten en høj eller lav tilstand (husk, 1 eller 0, HØJ eller LAV). Du kan antage, at en trykknapafbryder, der ikke er faktisk trykket, vil være i LAV tilstand, men faktisk siges den at være 'flydende', fordi der ikke bliver trukket nogen strøm overhovedet.
I denne flydende tilstand er det muligt, at der forekommer en falsk aflæsning, da den svinger med elektrisk interferens. Med andre ord giver en flydende switch hverken en pålidelig HØJ eller LAV aflæsning. En pull-down modstand holder en lille mængde strømmen flyder, når afbryderen lukkes, hvilket sikrer en nøjagtig aflæsning i lav tilstand.
I andre logiske kredsløb finder du muligvis en pull-up-modstand i stedet, og dette fungerer på samme princip, men omvendt, og sørg for, at den særlige logikport er standard til høj.
Nu, i løkken del af koden, i stedet for at skifte lys hvert 15. sekund, vil du læse tilstanden af trykknappen i stedet for og kun skifte lysene, når det er aktiveret.
Kode til Arduino fodgængerovergang
Start med at tilføje en ny variabel til at gemme din knapnål:
int button = 12; // switch is on pin 12
Tilføj nu en ny linje i installationsfunktionen for at erklære kontakten som en input. Tilføj en linje for at indstille trafiklys til det grønne trin. Uden denne oprindelige indstilling ville de slukke, indtil første gang ændringslysene kører.
pinMode(button, INPUT); digitalWrite(green, HIGH);
Skift i stedet hele loop-funktionen til følgende:
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 skulle gøre det. Du spekulerer måske på, hvorfor knapkontrol sker to gange ( digitalRead (knap) ), adskilt af en lille forsinkelse. Dette udbryder. Ligesom rullemodstanden for knappen stopper denne enkle kontrol koden, der registrerer mindre interferens som et knaptryk.
Ved at vente inde i if- sætningen i 15 sekunder, kan trafiklysene ikke ændres i mindst denne varighed. Når 15 sekunder er gået, starter loopen igen. Hver genstart af loopen læser den status på knappen igen, men hvis den ikke trykkes på, aktiveres hvis sætningen aldrig, lysene skifter aldrig, og programmet genstarter igen.
Sådan ser det ud (fremskyndes):
Arduino trafiklys med kryds
Lad os prøve en mere avanceret model. I stedet for et fodgængerfelt, skal du skifte dit kredsløb til at have to trafiklys:
Tilslut det andet lyskryds til digitale stifter 11, 12 og 13.
Kode til Arduino trafiklys med kryds
Tildel først dine nye trafiklysstifter til variabler og konfigurer dem som output, som i det første eksempel:
// 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); }
Opdater nu din loop for at bruge koden fra det første eksempel (i stedet for fodgængerovergangen):
void loop(){ changeLights(); delay(15000); }
Endnu en gang udføres alt arbejde i ChangeLights- funktionen. I stedet for at gå rødt > rødt & gult > grønt, vil denne kode skifte trafiklys. Når den ene er på grøn, er den anden på rød. Her er 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); }
Her er hvordan det ser ud (fremskyndet):
Arduino trafiklys næste trin
Det er alt for i dag. Din nye forståelse af Arduino LED'er og knapper gælder for alle slags forskellige projekter. Hvis du vil udvide disse trafiklys, hvorfor ikke bygge et fire-vejs (eller mere) kryds, komplet med mange fodgængerovergange og fodgængere trafiklys?
Eller hvorfor ikke udvide dine nye færdigheder med et større projekt som denne DIY MIDI-controller eller Arduino-robot med Xod? Du kan også se på Arduino-kodning med VS-kode og PlatformIO Bedre Arduino-kodning med VS-kode og PlatformIO Bedre Arduino-kodning med VS-kode og PlatformIO Vil du have en nem måde at starte kodning af Arduino? Med PlatformIO og VS-kode kan du forenkle Arduino-projekter og lære hurtigere. Læs mere .
Billedkredit: androsvector / Shutterstock
Udforsk mere om: Arduino, DIY-projektvejledninger, programmering.