← Back to CoursesStemExpert
StemExpert
Intermediate · Oplossingen · 32. Toestandsmachines
StemExpert · Brecht Corbeel · schoolium.me
StemExpert
I32. Toestandsmachines — oplossingen
IIntermediate · deel I8 · Regelen en robotica

Oplossingen · hoofdstuk 32Toestandsmachines

Een programma dat onthoudt waar het is: van verkeerslicht tot de modi van de klimaatmodule

Uitgewerkte oplossingen bij de 16 opdrachten van het werkboek. Voor de leerkracht, en voor wie zichzelf wil verbeteren nadat hij het eerst zelf probeerde.

5× oefenen7× toepassen4× uitdagen± 427 min
Een knop, een paar lampen en een klok: het klassieke voorbeeld van een toestandsmachine.
Een knop, een paar lampen en een klok: het klassieke voorbeeld van een toestandsmachine.
Voor de leerkrachtDeze pagina bevat de antwoorden. Druk het werkboek af zonder deze pagina.
Oefenen

Oefenen

één stap, direct toepassen
32.1

Toestand, gebeurtenis of actie?

Oefenen3Begrijpen10 min
Het gaat telkens over het kasdak of het voetgangerslicht.
  1. a
    OPENEN
    • Atoestand
    • Bgebeurtenis
    • Cactie
    toestand
  2. b
    De eindeloopschakelaar 'open' wordt ingedrukt.
    • Atoestand
    • Bgebeurtenis
    • Cactie
    gebeurtenis
  3. c
    De motor stilzetten.
    • Atoestand
    • Bgebeurtenis
    • Cactie
    actie
  4. d
    12 s voorbij zonder eindpunt.
    • Atoestand
    • Bgebeurtenis
    • Cactie
    gebeurtenis (een voorwaarde op de tijd)
  5. e
    Wachten tot de voetgangers overgestoken zijn (alles rood).
    • Atoestand
    • Bgebeurtenis
    • Cactie
    toestand (ALLES_ROOD_2)
  6. f
    Het lampje 'wacht' aanzetten.
    • Atoestand
    • Bgebeurtenis
    • Cactie
    actie
32.2

Een diagram volgen

Oefenen3Analyseren12 min
De deur staat DICHT. Dit gebeurt na elkaar: beweging, eindeloop open, 5 s niemand, fotocel, eindeloop open, beweging, 5 s niemand, eindeloop dicht.
DICHTOPENENmotor: openOPENtimer startSLUITENmotor: dichtbewegingeindeloop open[5 s niemand]eindeloop dichtbeweging of fotocelbeweging offotocel /timer opnieuw
De automatische deur uit het handboek.
  1. a
    Vul de tabel in: na elke gebeurtenis de nieuwe toestand en de actie.
    beweging → OPENEN (motor open); eindeloop open → OPEN (motor stil, timer); 5 s niemand → SLUITEN (motor dicht); fotocel → OPENEN (motor open); eindeloop open → OPEN (timer); beweging → OPEN (timer opnieuw); 5 s niemand → SLUITEN (motor dicht); eindeloop dicht → DICHT (motor stil).
  2. b
    Waarom is de overgang na 'fotocel' belangrijk?
    Er staat iemand in de opening terwijl de deur sluit: de deur keert om, niemand raakt gekneld.
32.3

Van diagram naar tabel

Oefenen4Tekenen20 min
Maak zelf de toestandstabel van het dak, zonder in het handboek te kijken.
DICHTOPENENmotor: openenOPENGESTOPTmotor stilSLUITENmotor: dichtDAK_FOUTmotor stilwens openeindeloop openwens dichteindeloop dichtknop[t > 12 s]knopknop / wens = dicht[t > 12 s]herstel
Het kasdak als toestandsmachine.
  1. a
    Vul de tabel in. Schrijf in elk vakje de nieuwe toestand, of een streepje.
    toestandknopwens openwens dichteindeloop openeindeloop dichtt > 12 s
    DICHT– (wens = open)OPENEN––––
    OPENENGESTOPT––OPEN–DAK_FOUT
    OPEN– (wens = dicht)–SLUITEN–––
    SLUITENGESTOPT–––DICHTDAK_FOUT
    GESTOPTSLUITEN (wens = dicht)–––––
    DAK_FOUT––––––

    DAK_FOUT verlaat je alleen met dakHerstel(), na een bevestigd alarm.

  2. b
    In DICHT staat bij 'knop' geen overgang in het diagram. Wat doet een knopdruk dan toch (kijk in dak.cpp)?
    Hij zet de wens op 'open'. In de volgende ronde ziet DICHT de gebeurtenis 'wens open' en gaat naar OPENEN. Knop en temperatuurregeling werken zo via dezelfde weg.
  3. c
    Welk vakje zou je veranderen als het dak in DAK_FOUT elke minuut opnieuw moet proberen? Is dat een goed idee?
    DAK_FOUT met [t > 60 s] naar SLUITEN. Liever niet: als er iets klemt (ijs, een tak, een hand), duwt de motor er elke minuut opnieuw tegen. Beter: één poging na een bevestiging door een mens.
32.4

Voorspel de uitvoer

Oefenen4Programmeren15 min
Een kleine toestandsmachine in C++. De functie stap() krijgt na elkaar de tekens k, x, k, x, x, k, k, x, x.
enum T { ROOD, GROEN, ORANJE };
T t = ROOD;
int teller = 0;

void stap(char g) {             // g: 'k' = knop, 'x' = tijd voorbij
  switch (t) {
    case ROOD:   if (g == 'k') { t = GROEN; teller++; } break;
    case GROEN:  if (g == 'x') t = ORANJE; break;
    case ORANJE: if (g == 'x') t = ROOD; else if (g == 'k') teller += 10; break;
  }
}
  1. a
    Volg de machine stap voor stap. In welke toestand eindigt ze, en wat is teller?
    k: GROEN, 1; x: ORANJE, 1; k: ORANJE, 11; x: ROOD, 11; x: ROOD, 11; k: GROEN, 12; k: GROEN, 12; x: ORANJE, 12; x: ROOD, 12. Eindtoestand ROOD, teller 12.
  2. b
    Wat verandert er als de break na de case ROOD ontbreekt? Geef een teken waarbij het verschil zichtbaar wordt.
    Zonder break loopt de code na case ROOD door in case GROEN. Bij 'x' in ROOD test ze dan g == 'x' in GROEN en springt ROOD meteen naar ORANJE: een overgang die niet in het ontwerp staat. Bij 'k' is er toevallig geen verschil.
32.5

De waterkoker

Oefenen4Tekenen15 min
Een waterkoker heeft een schakelaar die je naar beneden duwt, een bimetaal dat hem terug omhoog laat springen als het water kookt, en een beveiliging die hem uitschakelt als hij zonder water staat (de bodem wordt dan veel heter dan 100 °C).
  1. a
    Teken het toestandsdiagram met toestanden, gebeurtenissen, acties en een beginpunt.
    Begin → UIT. UIT --schakelaar omlaag / element aan--> VERWARMEN. VERWARMEN --kookpunt (bimetaal) / element uit--> UIT. VERWARMEN --schakelaar omhoog / element uit--> UIT. VERWARMEN --te heet (droog) / element uit--> BEVEILIGD. BEVEILIGD --afgekoeld--> UIT (bij veel toestellen).
  2. b
    Welke toestand is de veilige toestand? Is de droogkookbeveiliging fail-safe?
    UIT: het element krijgt geen stroom. De beveiliging is een bimetaal dat bij een te hoge temperatuur de kring verbreekt: ze werkt zonder elektronica en zonder software, dus fail-safe voor het oververhitten. Een beveiliging die zelf stroom nodig had om uit te schakelen, zou dat niet zijn.
Toepassen

Toepassen

meerdere stappen, in een context
32.6

Maak: het voetgangerslicht met een nachtstand

Toepassen5Maken60 min
Bouw het voetgangerslicht uit het handboek op een breadboard (vijf leds met 220 Ω, een lampje 'wacht', een knop naar GND). Voeg daarna een nachtstand toe: van 23 tot 6 uur knippert het oranje licht voor de auto's (1 s aan, 1 s uit), de voetgangerslichten zijn uit en de knop doet niets. Om 6 uur gaat het licht eerst 5 s alles rood, dan AUTO_GROEN. Neem aan dat er een functie uur() bestaat (voor een test kan ze de minuten van millis() teruggeven).
  1. a
    Teken de uitbreiding in het toestandsdiagram: nieuwe toestand, overgangen, acties.
    Nieuwe toestand NACHT_KNIPPER (bij binnenkomen: alle lampen uit, aanvraag = nee). AUTO_GROEN --[uur ≥ 23 of uur < 6]--> NACHT_KNIPPER. NACHT_KNIPPER --[uur = 6]--> ALLES_ROOD_2 (5 s) --> AUTO_GROEN.
  2. b
    Schrijf de nieuwe case en de aanpassingen in naar() en in de knop.
    case NACHT_KNIPPER:
      digitalWrite(A_ORANJE, (t / 1000) % 2 == 0 ? HIGH : LOW);   // 1 s aan, 1 s uit
      if (uur() == 6) naar(ALLES_ROOD_2, nu);
      break;
    
    // in case AUTO_GROEN, voor de andere test:
    if (uur() >= 23 || uur() < 6) naar(NACHT_KNIPPER, nu);
    
    // in naar(): case NACHT_KNIPPER: lampen(0, 0, 0, 0, 0); aanvraag = false;
    //            digitalWrite(WACHT, LOW); break;
    // bij de knop: && toestand != NACHT_KNIPPER
  3. c
    Uit welke toestand(en) mag de nachtstand beginnen? Waarom niet uit elke toestand?
    Alleen uit AUTO_GROEN: dan hebben de voetgangers rood en de auto's groen, en gaat er niemand verrast van groen naar knipperend oranje terwijl hij oversteekt. Uit VOETGANGER_GROEN zou een voetganger midden op de weg staan terwijl de auto's al 'voorrang van rechts' krijgen.
  4. d
    Test je programma en beschrijf je scenario: wat heb je gedaan om elke nieuwe overgang te zien gebeuren?
    Bijvoorbeeld: uur() tijdelijk laten afhangen van millis() (1 minuut = 1 uur), knop drukken voor en na 23 uur, kijken naar de seriële monitor en de leds.
Zo wordt dit beoordeeld
SchakelingAlle leds werken met een weerstand, knop naar GND met INPUT_PULLUP.
DiagramNACHT_KNIPPER met overgangen [uur ≥ 23] uit AUTO_GROEN en [uur = 6] naar ALLES_ROOD_2, acties benoemd.
CodeEén nieuwe waarde in de enum, een case met break, knipperen met millis() zonder delay(), knop genegeerd.
TestElke nieuwe overgang aantoonbaar getest (bv. met een versnelde klok).
32.7

Vind de fouten: de CO₂-klep

Toepassen5Programmeren20 min
Een leerling programmeerde de CO₂-klep als toestandsmachine: onder 800 ppm de klep 30 s open, dan 5 minuten wachten zodat de CO₂ zich mengt.
enum Klep { DICHT, OPEN, WACHTEN };
Klep klep = DICHT;
unsigned long sinds = 0;

void taakCo2(unsigned long nu, float co2) {
  switch (klep) {
    case DICHT:
      if (co2 < 800) { klep = OPEN; sinds = nu; digitalWrite(CO2_KLEP, HIGH); }
    case OPEN:
      if (nu - sinds >= 30000) { klep = WACHTEN; digitalWrite(CO2_KLEP, LOW); }
      break;
    case WACHTEN:
      if (nu - sinds >= 300000) klep = DICHT;
      break;
  }
}
  1. a
    Er ontbreekt een break. Wat gebeurt er daardoor als de klep DICHT is en het CO₂-gehalte 900 ppm is?
    De code loopt door in case OPEN. Daar is nu − sinds groot (sinds is oud), dus springt DICHT meteen naar WACHTEN en zet de klep 'dicht'. Na 5 minuten terug naar DICHT, enzovoort: de machine wandelt door toestanden die ze niet hoort te bezoeken.
  2. b
    Hoe lang wacht de machine echt in WACHTEN? Waarom?
    4,5 minuten: bij de overgang naar WACHTEN wordt sinds niet opnieuw gezet, dus telt de wachttijd vanaf het openen van de klep (30 s eerder).
  3. c
    Welke veiligheidsvoorwaarde ontbreekt (denk aan de modi en het dak)?
    De klep mag alleen open in DAG, met het dak dicht en zonder koelen, en nooit in ONDERHOUD of ALARM.
  4. d
    Schrijf de verbeterde versie.
    enum Klep { DICHT, OPEN, WACHTEN };
    Klep klep = DICHT;
    unsigned long sinds = 0;
    
    void naar(Klep nieuw, unsigned long nu) {
      klep = nieuw;
      sinds = nu;                                     // fout 2: bij elke overgang de tijd onthouden
      digitalWrite(CO2_KLEP, nieuw == OPEN ? HIGH : LOW);
    }
    
    void taakCo2(unsigned long nu, float co2, bool mag) {    // mag: DAG, dak dicht, niet koelen
      switch (klep) {
        case DICHT:
          if (mag && co2 < 800) naar(OPEN, nu);       // fout 3: alleen als het veilig en zinvol is
          break;                                      // fout 1: break
        case OPEN:
          if (!mag || nu - sinds >= 30000) naar(WACHTEN, nu);
          break;
        case WACHTEN:
          if (nu - sinds >= 300000) naar(DICHT, nu);
          break;
      }
    }
32.8

De automatische deur veiliger

Toepassen5Ontwerpen25 min
De deur zit in de gang tussen de woonmodule en de rest van het station. Het is ook een vluchtweg bij brand.
DICHTOPENENmotor: openOPENtimer startSLUITENmotor: dichtbewegingeindeloop open[5 s niemand]eindeloop dichtbeweging of fotocelbeweging offotocel /timer opnieuw
De deur uit het handboek.
  1. a
    Voeg een toestand FOUT toe. Welke gebeurtenissen en time-outs leiden ernaartoe?
    Onmogelijke combinaties: OPENEN + eindeloop dicht, SLUITEN + eindeloop open, beide eindeloopschakelaars tegelijk. Time-outs: OPENEN of SLUITEN langer dan bv. 8 s. FOUT: motor stil, alarm; de deur blijft met de hand te bedienen.
  2. b
    In welke toestand start de deur na een stroomuitval? Hoe weet het programma dat?
    Het programma leest de eindeloopschakelaars: 'dicht' → DICHT, 'open' → OPEN (timer start). Geen van beide: OPENEN, want op een vluchtweg is open veiliger dan dicht, en wie in de opening staat, wordt niet geraakt.
  3. c
    Wat moet de deur doen als de stroom wegvalt, en hoe doe je dat zonder elektronica?
    Open gaan, of met de hand te openen zijn. Zonder elektronica: een veer of gewicht die de deur openduwt zodra de motor geen kracht meer geeft, of een koppeling die bij stroomuitval loskomt, zodat de deur vrij schuift. Net als de rem van Otis: het defect zelf brengt de deur in de veilige toestand.
Zo wordt dit beoordeeld
FoutenOnmogelijke combinaties en time-outs (bv. OPENEN langer dan 8 s) leiden naar FOUT; FOUT zet de motor stil en geeft alarm.
StartDe eindeloopschakelaars bepalen de begintoestand; onbekende stand: een veilige keuze met uitleg.
Fail-safeEen vluchtdeur gaat open of is met de hand te openen zonder stroom (veer, vrijloop).
32.9

De wasmachine uitbreiden

Toepassen5Tekenen20 min
Pas het diagram aan.
KLAARdeur losVULLENklep openVERWARMEN40 °C (hysterese)WASSENtrommel draaitPOMPENpomp aanSPOELENklep open, draaienCENTRIFUGEREN1200 omw/minFOUTalles uit, deur op slotstartniveau40 °C30 minleeg10 min8 min /deur los[t > 5 min][t > 3 min]
De wasmachine uit het handboek.
  1. a
    De machine moet twee keer spoelen. Voeg een teller toe en pas de overgangen aan, zonder toestanden te kopiëren.
    Bij binnenkomen van VULLEN (vanuit KLAAR): spoelbeurt = 0. POMPEN --leeg [spoelbeurt < 2] / spoelbeurt + 1--> SPOELEN; POMPEN --leeg [spoelbeurt = 2]--> CENTRIFUGEREN; SPOELEN --10 min / pomp aan--> POMPEN (in plaats van rechtstreeks naar CENTRIFUGEREN).
  2. b
    In FOUT blijft de deur op slot zolang er water in de trommel staat. Hoe komt het water eruit? Voeg toe wat nodig is.
    Een toestand FOUT_LEEGPOMPEN: pomp aan tot 'leeg', met een eigen time-out; daarna FOUT_LEEG met de deur los. Lukt het leegpompen niet (pomp stuk), dan blijft de deur op slot en moet een technicus het water via het noodslangetje aflaten.
  3. c
    Het water moet ook tijdens WASSEN op 40 °C blijven. Waar hoort de regeling met hysterese thuis?
    In VERWARMEN én in WASSEN: in beide toestanden draait dezelfde regeling (aan onder 39, uit boven 41 °C). Een regeling mag in meerdere toestanden actief zijn; de toestandsmachine bepaalt het setpoint en wanneer ze aan staat.
32.10

Een tijdsdiagram lezen

Toepassen5Analyseren15 min
Lees de antwoorden af in het tijdsdiagram.
knoplampje 'wacht'auto groenauto oranjeauto roodvoetg. groenvoetg. rood0102030405060708090t (s)
De test van het voetgangerslicht.
  1. a
    Op welke tijdstippen wordt de knop ingedrukt? Welke druk heeft geen effect, en waarom?
    Op 5 s, 29 s en 41 s. De druk op 29 s valt in VOETGANGER_GROEN (25 tot 33 s): daar wordt de knop genegeerd.
  2. b
    Hoe lang wacht de voetganger die op 41 s drukt tot hij groen krijgt?
    Van 41 s tot 63 s: 22 s. De auto's kregen groen op 38 s en moeten het minstens tot 58 s houden; dan 3 s oranje en 2 s alles rood.
  3. c
    Waarom gaat het lampje 'wacht' aan op 5 s en uit op 25 s?
    Aan bij de aanvraag (knop op 5 s), uit bij het binnenkomen van VOETGANGER_GROEN (25 s): de aanvraag is dan beantwoord.
  4. d
    In welke toestand is de machine op 60 s? En op 35 s?
    Op 60 s: AUTO_ORANJE (58 tot 61 s). Op 35 s: ALLES_ROOD_2 (33 tot 38 s).
32.11

Fail-safe of niet?

Toepassen6Begrijpen20 min
Beoordeel telkens: wat gebeurt er als de draad breekt of de stroom wegvalt? Is dat de veilige toestand?
  1. a
    De vlotter op D2 met INPUT_PULLUP: contact dicht (LOW) = genoeg water.
    Fail-safe: een gebroken draad leest HIGH = droog, de pomp stopt. Hoogstens een vals alarm.
  2. b
    Een CO₂-klep die open staat zonder stroom (normaal open), gestuurd met een MOSFET.
    Niet fail-safe: bij een stroomuitval of een losse draad blijft de klep open en loopt de CO₂-fles leeg in de module: gevaarlijk voor wie binnenkomt. Kies een normaal gesloten klep.
  3. c
    De MOSFET van de verwarming met 10 kΩ pull-down: als de Mega uitvalt, is de verwarming uit. Is dat in januari veilig?
    Voor de verwarming zelf wel (geen oververhitting, geen brand), voor de sla niet: in januari koelt de module af. Daarom herstart de waakhond de Mega, en heeft het station een eigen vorstbeveiliging. Fail-safe hangt dus af van welk gevaar je bekijkt.
  4. d
    Een eindeloopschakelaar als maakcontact: ingedrukt = LOW.
    Niet fail-safe: een gebroken draad geeft nooit LOW, het programma ziet het eindpunt nooit en de motor duwt door tot de time-out (die dan de enige bescherming is). Met een verbreekcontact stopt de motor meteen.
32.12

De deur als tabel in Python

Toepassen6Programmeren30 min
Maak van de toestandstabel van de automatische deur een Python-programma, zoals de wasmachine in het handboek.
  1. a
    Schrijf het woordenboek OVERGANGEN en de functie verwerk().
    # deur.py - de automatische deur als tabel, met een fout voor onmogelijke gebeurtenissen
    OVERGANGEN = {
        ("DICHT", "beweging"): ("OPENEN", "motor open"),
        ("OPENEN", "eindeloop open"): ("OPEN", "motor stil, timer start"),
        ("OPEN", "beweging"): ("OPEN", "timer opnieuw"),
        ("OPEN", "fotocel"): ("OPEN", "timer opnieuw"),
        ("OPEN", "5 s niemand"): ("SLUITEN", "motor dicht"),
        ("SLUITEN", "beweging"): ("OPENEN", "motor open"),
        ("SLUITEN", "fotocel"): ("OPENEN", "motor open"),
        ("SLUITEN", "eindeloop dicht"): ("DICHT", "motor stil"),
    }
    
  2. b
    Voeg een verzameling ONMOGELIJK toe: combinaties die op een sensorfout wijzen en naar FOUT leiden.
    ONMOGELIJK = {("OPENEN", "eindeloop dicht"), ("SLUITEN", "eindeloop open"), ("DICHT", "eindeloop open")}
    In verwerk() eerst testen: if (toestand, gebeurtenis) in ONMOGELIJK: return "FOUT".
  3. c
    Test met: beweging, eindeloop open, beweging, 5 s niemand, fotocel, eindeloop dicht, eindeloop open. Wat is de uitvoer?
    De uitvoer van het volledige programma:
    DICHT    --beweging--> OPENEN   motor open
    OPENEN   --eindeloop open--> OPEN     motor stil, timer start
    OPEN     --beweging--> OPEN     timer opnieuw
    OPEN     --5 s niemand--> SLUITEN  motor dicht
    SLUITEN  --fotocel--> OPENEN   motor open
    OPENEN   --eindeloop dicht--> FOUT     motor stil, alarm
    FOUT     --eindeloop open--> FOUT     (genegeerd)
    In FOUT reageert de deur op niets meer: een technicus moet kijken.
Uitdagen

Uitdagen

transfer, open problemen, leerlijnen combineren
32.13

Habitat: een zuinige modus

Uitdagen7Habitat75 min
Het energiebeheer van hoofdstuk 20 zegt: boven 40 % laadtoestand mogen de lampen volgens schema branden, tussen 20 en 40 % alleen op het zonne-overschot, onder 20 % niet. Onder 20 % moet de module ook de pomp terugschroeven (5 in plaats van 10 minuten per uur) en de ventilatoren zacht laten draaien. Ontwerp hoe de modi hiermee omgaan.
  1. a
    Een collega wil een zesde modus ZUINIG naast DAG en NACHT. Een ander wil een aparte, kleine toestandsmachine voor de energie. Vergelijk beide: hoeveel toestanden krijg je, en wat gebeurt er als het 's nachts zuinig moet?
    Eén machine: DAG, NACHT, DAG_ZUINIG, NACHT_ZUINIG, en misschien ALARM_ZUINIG ...: het aantal toestanden vermenigvuldigt, en elke overgang (22 uur, alarm, onderhoud) moet dubbel getekend worden. Twee machines naast elkaar (de modi en de energie) blijven elk klein; de acties kijken naar allebei.
  2. b
    Teken de toestandsmachine voor de energie met drie toestanden (VOL, ZON, ZUINIG) en hysterese op de grenzen (bv. terug naar boven pas 5 procentpunt hoger).
    VOL --[soc < 40]--> ZON --[soc < 20]--> ZUINIG; ZUINIG --[soc > 25]--> ZON --[soc > 45]--> VOL. Begin: kies de toestand volgens soc bij het opstarten.
  3. c
    Vul de actietabel aan: wat doen lampen, pomp en ventilatoren in elke combinatie van modus en energietoestand?
    DAG + VOL: lampen volgens schema, pomp 10 min, ventilatoren normaal. DAG + ZON: lampen alleen op overschot. DAG + ZUINIG: lampen uit, pomp 5 min, ventilatoren zacht (tenzij koelen nodig is). NACHT: lampen altijd uit; pomp 10 of 5 min. ONDERHOUD: werklicht blijft (veiligheid), pomp uit. ALARM: de alarmregels gaan voor.
  4. d
    Schrijf de switch van de energiemachine in C++ (de laadtoestand staat in de variabele soc).
    switch (energie) {
      case VOL:    if (soc < 40.0) energie = ZON;    break;
      case ZON:    if (soc < 20.0) energie = ZUINIG;
                   else if (soc > 45.0) energie = VOL;  break;
      case ZUINIG: if (soc > 25.0) energie = ZON;   break;
    }
  5. e
    Beschrijf een testscenario dat elke overgang van de energiemachine laat zien, ook samen met ALARM en ONDERHOUD.
    Bijvoorbeeld: soc van 60 naar 15 % laten dalen en terug naar 50 %, met een uitschieter rond 20 % (19, 21, 19, 23 %) om te zien dat de hysterese het pendelen belet; tijdens ZUINIG een sensoralarm geven en onderhoud aanzetten; nagaan dat werklicht en pompstop blijven gelden.
Zo wordt dit beoordeeld
KeuzeHet nadeel van één grote machine (verdubbeling van toestanden) is gezien; twee machines naast elkaar, elk met één aspect.
DiagramDrie toestanden, overgangen met hysterese (bv. 20/25 % en 40/45 %), begin volgens de laadtoestand.
ActietabelElke combinatie ingevuld; ONDERHOUD en ALARM behouden hun veiligheidsregels ook als het zuinig moet.
Codeenum, switch met break, overgangen alleen bij de grenzen, geen delay().
TestScenario met dalende en stijgende laadtoestand, rond de grenzen heen en weer, en een alarm tijdens ZUINIG.
32.14

Een logboek van de module lezen

Uitdagen6Analyseren30 min
Dit is de seriële monitor van de test uit het handboek (klimaat.ino versie 4).
# 05:50:00 klimaatmodule v4 (hoofdstuk 32)
# 05:50:00 modus OPSTART
# 05:50:00 dak: DICHT
# 05:50:05 modus NACHT
# 06:00:00 modus DAG
# 09:30:03 modus ONDERHOUD
# 09:52:03 modus DAG
# 10:40:28 oorzaak: geen temperatuur
# 10:40:28 modus ALARM
# 10:45:00 dak: OPENEN
# 10:45:07 dak: OPEN
# 10:50:00 modus DAG
# 10:51:38 dak: SLUITEN
# 10:51:45 dak: DICHT
# 11:06:10 dak: OPENEN
# 11:06:17 dak: OPEN
# 11:12:24 dak: SLUITEN
# 11:12:31 dak: DICHT
# 11:21:52 dak: OPENEN
# 11:21:59 dak: OPEN
# 11:30:14 dak: SLUITEN
# 11:30:21 dak: DICHT
# 11:37:30 dak: OPENEN
# 11:37:37 dak: OPEN
# 11:50:54 dak: SLUITEN
# 11:51:01 dak: DICHT
# 11:56:44 dak: OPENEN
# 11:56:51 dak: OPEN
# 15:39:34 dak: SLUITEN
# 15:39:46 dak: DAK_FOUT
# 15:39:48 oorzaak: dak haalt zijn eindpunt niet
# 15:39:48 modus ALARM
# 16:45:00 dak: SLUITEN
# 16:45:00 modus DAG
# 16:45:03 dak: DICHT
# 22:00:00 modus NACHT
# 23:10:08 oorzaak: vlotter droog
# 23:10:08 modus ALARM
# 23:40:00 modus NACHT
  1. a
    Wat gebeurde er tussen 9:30 en 9:52? Waarom kon het dak toen niet bewegen?
    Onderhoud: een lange druk om 9:30 (3 s ingedrukt, dus 9:30:03) en weer om 9:52. In ONDERHOUD is het dak geblokkeerd: niemand mag geraakt worden door een bewegend paneel.
  2. b
    Het stekkertje van de SHT31 ging om 10:40:00 los. Waarom begint het alarm pas om 10:40:28?
    Het programma wacht 15 mislukte metingen (om de 2 s): pas na 30 s geldt het als een fout. Een enkele mislukte meting (storing op de kabel) geeft zo geen alarm.
  3. c
    Het dak ging om 10:45 open terwijl de module in ALARM was. Is dat een fout?
    Nee, zo is het ontworpen: in ALARM werkt de module zo gewoon mogelijk verder. Het alarm ging over de temperatuursensor; toen die om 10:45 weer meetwaarden gaf (boven 27 °C), mocht het dak de temperatuur volgen.
  4. d
    Tussen 11 en 12 uur ging het dak vier keer open. Geef twee manieren om dat pendelen te verminderen.
    Een bredere band voor het dak (bv. open boven 28, dicht onder 24 °C), een minimale tijd open en dicht (bv. 15 minuten), of het dak maar gedeeltelijk openen (een kier) zodat het minder snel afkoelt.
  5. e
    Wat gebeurde er om 15:39 en om 16:45? Hoe lang was de module in totaal in ALARM?
    Om 15:39:34 moest het dak sluiten, maar het klemde: na 12 s DAK_FOUT en ALARM. Om 16:45 bevestigde iemand het alarm met een korte druk: één nieuwe poging, het dak sloot (de klem was weg). ALARM: van 10:40:28 tot 10:50:00, van 15:39:48 tot 16:45:00 en van 23:10:08 tot 23:40:00: samen ongeveer 106 minuten.
32.15

Debat: mag de software de noodstop zijn?

Uitdagen6Argumenteren20 min
In de modi-code stopt een korte druk op S1 een bewegend dak: de knop werkt via de Mega. Een collega zegt: 'Dat is geen echte noodstop. Die moet de motor rechtstreeks spanningsloos maken, ook als het programma hangt.'
  1. a
    Geef twee argumenten voor een noodstop in software en twee voor een noodstop in hardware.
    Software: geen extra onderdelen, de Mega weet dat er gestopt is en kan dat melden en loggen, flexibel. Hardware: werkt ook als het programma hangt of de Mega kapot is, sneller, eenvoudiger te controleren, en voorgeschreven voor machines waar mensen gewond kunnen raken.
  2. b
    Hoe zou je een hardwarenoodstop voor het dak aansluiten (tip: DAK_ENABLE en de voeding van de H-brug)?
    Een noodstopknop met een verbreekcontact in de voeding van de H-brug (of in de lijn van DAK_ENABLE naar de module, met een pull-down): indrukken maakt de motor spanningsloos, los van de software. Een tweede contact kan de Mega laten weten dat de noodstop ingedrukt is (Expert, hoofdstuk 23).
32.16

Ontwerp: een lift met twee verdiepingen

Uitdagen6Ontwerpen40 min
Het station krijgt een goederenlift tussen de kelder (batterijen) en het gelijkvloers. Er is een knop op elke verdieping en in de lift, een sensor per verdieping, een deur met een schakelaar 'deur dicht', een lichtsluis in de deuropening en een motor met rem.
  1. a
    Maak een lijst van toestanden en gebeurtenissen.
    Toestanden: BENEDEN_OPEN, BENEDEN_DICHT, OMHOOG, BOVEN_DICHT, BOVEN_OPEN, OMLAAG, FOUT. Gebeurtenissen: knop beneden/boven/in de lift, deur dicht, deur open, sensor boven, sensor beneden, lichtsluis, time-out.
  2. b
    Teken het toestandsdiagram, met time-outs en een toestand FOUT.
    Bijvoorbeeld: BENEDEN_OPEN --deur dicht [aanvraag boven]--> BENEDEN_DICHT --[deur dicht] / rem los, motor omhoog--> OMHOOG --sensor boven / motor stil, rem erop--> BOVEN_DICHT --deur open--> BOVEN_OPEN (en symmetrisch terug). OMHOOG en OMLAAG --[t > 30 s] / motor stil, rem erop--> FOUT. Deur open tijdens het rijden (onmogelijk) → FOUT.
  3. c
    Welke regels mogen nooit geschonden worden? Hoe zorg je dat de lift ze ook bij een fout in de software niet schendt?
    Nooit rijden met een open deur, nooit voorbij de eindpunten, altijd remmen bij stroomuitval. Afdwingen in hardware: het deurcontact in serie met de motorvoeding, eindschakelaars die de motor rechtstreeks afschakelen, en een rem die sluit zonder stroom (veer), zoals bij Otis.
Zo wordt dit beoordeeld
ToestandenStilstaan beneden/boven met deur open of dicht, rijden omhoog/omlaag, FOUT; logisch benoemd.
OvergangenKnoppen, deur dicht, verdiepingssensor, lichtsluis, time-out tijdens het rijden.
VeiligheidNooit rijden met de deur open; bij een fout stilstaan met de rem erop; rem fail-safe (Otis).