1. Een stoplicht maken
In dit deel zul je meer moeten gaan nadenken over je schakeling en wordt het wat abstracter. We gaan een volledig werkend stoplicht maken. Ook introduceren we een andere vorm van een meten namelijk de analoge input. We zullen een lichtgevoelige weerstand aansluiten op onze installatie die maakt dat de schakeling in het donker anders reageert dan in het licht.
Het stoplicht in de onderstaande afbeelding werkt als volgt.
- Auto's mogen doorrijden als het verkeerslicht (de drie leds aan de linkerkant) op groen staat;
- De tram mag doorrijden als het verkeerslicht op rood staat en de blauwe led brand;
- In het wegdek zit een schakelaar die detecteert dat er een auto langs rijdt. Zodra er een auto is gedetecteerd springt het verkeerslicht op groen.
- In de tramrails zit een schakelaar die detecteert dat er een tram aankomt. Zodra er een tram is gedetecteerd springt het verkeerslicht op rood en de blauwe led is aan zodat de tram mag doorrijden.
- Standaard brandt de blauwe led niet en staat het verkeerslicht op rood.
- De schakeling werkt alleen als het overdag is. 's Avonds gaat het gele licht van het verkeerslicht knipperen. Ga er vanuit dat de lichtgevoelige weerstand bij daglicht "aan" is. Je mag de werking van de lichtgevoelige weerstand verwerken als een pushbutton. Vindt je dit te moeilijk? Laat deze optie dan zitten.
2. Variabelen maken
De eerste stap is nu het maken van variabelen. We geven niet de volledige code. Deze zul je deels zelf moeten maken. Denk dus na hoe de leds aangesloten zitten.
const int greenLedPin = ..;
const int yellowLedPin = ..;
const int redLedPin = ..;
const int carButtonPin = ..;
Je ziet ook het keyword const in de code staan. Dit houdt in dat de waarde van de variabele verderop in de code niet meer gewijzigd kan worden.
Vervolgens de variablen voor de tram
const int blueLedPin = ..;
... ... tramButtonPin = ..;
3. De setup
In de setup "enable" je de poorten met behulp van de methode pinMode(). Deze methode heeft 2 parameters nodig. Het nummer van de poort en of deze op INPUT of OUTPUT moet worden gezet. Hieronder zie je de code voor de methode setup().
void setup() {
//dit zijn de buttons dus die moeten op INPUT worden gezet
pinMode(LDR, INPUT);
pinMode(carButtonPin, INPUT);
pinMode(tramButtonPin, INPUT);
//hieronder de code voor de OUTPUT
}
4. een boolean in de loop
Maak nu eerst een nieuwe loop. In deze loop vragen we ons af of het nacht of dag is. Dan doen we met een if-constructie en een hulpvariable. Deze hulpvariabele is een boolean en wordt als volgt ingevoerd:
boolean day = digitalRead(LDR)
;
Vervolgens maken we in de loop een constructie met if, dus:
void loop() {
//is it night or day?
boolean day = digitalRead(LDR);
if (....) {
// If it is day do normal traffic control
}else {
// Execute this part of the loop whenever it is night
{
5. de code als het dag is
We gaan nu verder met de code als het dag is, dus als de lichtgevoelige schakelaar (die nu nog een pusbutton is) niet aan staat. We hadden in het if-statement al een onderscheid gemaakt tussen nacht en dag. We gaan in het gedeelte voor de dag twee boolean hulpvariabelen toevoegen die bepalen of er een auto of een tram aankomt of staat te wachten, dus:
if (day == true) {
boolean carWaiting = digitalRead(..);
boolean tramWaiting = digitalRead(..);
//rest van de code
....
6. Vier situaties die mogelijk zijn
Met de twee boolean variabelen kunnen zich nu vier situaties voordoen.
boolean carWaiting |
boolean tramWaiting |
situatie |
code voor |
0 |
0 |
geen tram, geen auto |
stoplicht op rood, tramlicht uit |
1 |
0 |
er is een auto |
stoplicht op groen, tramlicht aan |
0 |
1 |
er is een tram |
stoplicht op rood, tramlicht uit |
1 |
1 |
er is zowel een auto als een tram |
stoplicht op rood, tramlicht uit |
Je ziet nu al dat je code moet maken voor de volgende situaties:
- stoplicht op rood
- stoplicht op groen
- tramlicht aan
- tramlicht uit
Dit gaan we vast in de code invoeren op de volgende manier:
if (tramWaiting == true && carWaiting == false) {
turnTrafficLightRed();
} else if (tramWaiting == false && carWaiting == true) {
turnTrafficLightGreen();
} else if (....){
} else () {
turnTrafficLightRed();
}
Let op het && teken binnen het if-statement. Dit betekent dat zowel de linker- als de rechterkant waar moet zijn. Je hebt dit al gehad binnen de Greenfoot cursus.
De code vergt verder uitleg. Er wordt namelijk gebruik gemaakt van hulpmethoden. De hulpmethode turnTrafficLigthRed() ziet er als volgt uit:
/**
* traffic light setting on red
*/
void turnTrafficLightRed() {
//turn on orange light for 5 seconds
digitalWrite(greenLedPin, LOW);
digitalWrite(yellowLedPin, HIGH);
delay(5000);
//turn off orange light and turn on red light
digitalWrite(yellowLedPin, LOW);
digitalWrite(redLedPin, HIGH);
//turn off the tram light
turnTramLightOff();
}
In de cursus Greenfoot heb je al gehad van een methode is in Java. In deze taal (C++) is dit nagenoeg hetzelfde. Binnen een methode kan weer een andere methode worden aangeroepen. Dat is in dit geval turnTramLigthOff().
Je ziet dat de namen van de hulpmethoden voor zichzelf spreken. Hoe duidelijker je dit doet, hoe makkelijker het wordt om code te produceren. Dit geldt ook voor de namen van de variabelen.
7. De code afmaken
De laatste stap is niet meer zo moeilijk. Je moet nu zorgen dat de hulpmethoden op de juiste plaats worden gebruikt. Voor de veiligheid plaatsen we de hulpmethoden turnTramLightOn en -Off binnen de hulpmethode van de methoden turnTrafficLightRed en -Green. Dit is een stukje veiligheid. Als het stoplicht op groen wordt gezet mag pas het tramlicht aan. Zorg ook, met behulp van een delay, dat het even duurt voordat het tramlicht op uit springt. Ook dat is veiligheid. Er kan immers een auto nog net door oranje rijden.
8. Een testscript
Hieronder een script om je schakeling te testen.
//auto
const int greenLedPin = 9;
const int yellowLedPin = 10;
const int redLedPin = 11;
const int carButtonPin = 5;
//tram
const int blueLedPin = 8;
const int tramButtonPin = 6;
//dag of nacht
const int LDR = 7;
void setup() {
Serial.begin(9600);
pinMode(LDR, INPUT);
pinMode(carButtonPin, INPUT);
pinMode(tramButtonPin, INPUT);
pinMode (greenLedPin, OUTPUT);
pinMode (yellowLedPin, OUTPUT);
pinMode (redLedPin, OUTPUT);
pinMode (blueLedPin, OUTPUT);
}
void loop() {
boolean day = digitalRead(LDR);
Serial.println(day);
if (day) {
testAllLeds();
Serial.println("het is dag");
boolean carWaiting = digitalRead(carButtonPin);
boolean tramWaiting = digitalRead(tramButtonPin);
if (tramWaiting == true && carWaiting == false) {
Serial.println("er is een tram en geen auto");
} else if (tramWaiting == false && carWaiting == true) {
Serial.println("er is een auto en geen tram");
} else if (tramWaiting == true && carWaiting == true) {
Serial.println("er is een tram en een auto, de tram gaat voor");
}
else {
Serial.println("geen verkeer, zet alle stoplichten op rood");
}
} else {
Serial.println("het is nacht");
}
delay(1000);
}
void testAllLeds() {
for (int i = 6; i < 13; i++) {
Serial.print("test port: ");
Serial.print(i);
Serial.print(" ");
digitalWrite(i, HIGH);
delay(100);
digitalWrite(i, LOW);
}
}
9. een oplossing
Dit onderdeel is uitgeschakeld door de docent.