Lektion 7: Trafikljus

Här är ett exempel på ett mycket enkelt trafikljus. Det är inte svårt att skriva kod till ett trafikljus, det är väl bara en massa kod för att tända lysdioder och fördröjningar kanske ni tycker. Vårt exempel höjer ribban något genom att visa lite funktioner i Arduino® såsom millis() samt switch() som är en mycket användbara kommando i C/C++. Fördröjningar är ganska dumma och lömska i Arduino® om du använder funktionen delay() eftersom under den tid du väntar kan du inte göra något annat, programmet bara sitter där och räknar tills tiden du angett gått ut. Det är då millis() kommer in, den funktion som returnerar antalet millisekunder sedan RESET eller POWER UP. Funktionen returnerar en long variabel (32bitar) och gör överslag efter 50 dagar efter RESET. I vårt exempel tar vi inte hänsyn till detta överslag.

Men om då millis() returnerar en tid som löpt sedan start, hur kan vi då använda detta på ett smart sätt. Jo genom att göra egna fördröjningar med hjälp utav denna timer, spara var vi var och sedan gå vidare i koden utan att för den delen stanna och vänta. Sedan genom att ha en variabel som kommer ihåg var vi var i koden och ändra denna variabel när vi vill göra något nytt. Det är då switch() kommer in. Det fina här är att vi kan ha flera switch() i samma program och på det viset sköta flera uppgifter parallellt utan att hänga en uppgift. I vårt exempel har vi en variabel som håller reda på vårt trafikljus, hur detta skall visas (det går givetvis att skriva denna koden mycket mindre och kompaktare, men vi har valt att visa det på detta viset). Sedan har vi en variabel som håller reda på den interna lysdioden och hur den skall lysa eller inte (=blinka), sedan parallellt med dessa två switch() block checkar vi även av seriell kommunikation och vi kan den vägen ställa trafikljuset i ett serviceläge där det blinkar eller återgå till normalt läge oberoende på/när/var vi befinner oss i koden vilket vi annars hade fått vänta på att utföra denna uppgift till eventuella delay() hade utförts i koden vilket blir en jobbig lösning.

Kommer inte att gå in så mycket vad koden gör utan den förklarar sig själv, värt att notera är de två funktioner vi skapat i slutet av källkoden, dessa kan hantera 4 “mjukvarutimers” (vi använder bara 2 av den). Men som vi skrivit koden kan vi faktiskt hantera fler uppgifter parallellt än vad som visas. Låt fantasin flöda!

Koden till projektet hittar du här. Bilden nedan visar vår enkla inkoppling, se koden hur de olika lysdioderna skall kopplas in samt tryckknappen som simulerar att en väg sensor som känner om en bil kommer på bivägen. Vår gatukorsning kan vara en större trafikerad väg som alltid har grönt tills en bil kommer på den mindre trafikerade vägen. Vi har klippt ned lysdioder och motstånd så det skulle se snyggare ut och givetvis behöver ni inte göra detta.

Föregående Sida    –    Nästa Sida