Semana 5

Esta semana terminaremos de abordar la técnica de programación de sistemas embebidos usando máquinas de estado.

Sesión 1

Actividades

En esta sesión veremos cómo modelar un problema usado máquinas de estado.

Material

Presentación sobre modelado de sistemas embebidos usando máquinas de estado.

Sesión 2

Actividad

En esta sesión se propondrá la construcción del modelo para la bomba y luego solucionaremos el problema entre todos.

Aquí queda el trabajo realizado entre todos el día de hoy:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
 uint32_t Timer = 20;

 enum class BOMBEVS {UP, DOWN, EVTIMER, ARM};
 BOMBEVS bombEvs;
 bool bombEvsFlag = false;


 bool timerInitCount = false;
 uint32_t timeOld = 0;

 void setup() {
 Serial.begin(115200);
 }

 void initCount() {
 timerInitCount = true;
 timeOld = millis();
 }

 void stopCount() {
 timerInitCount = false;
 Timer = 20;
 }

 void taskBomb() {
 enum class BombStates {SETTING, COUNTING};
 static BombStates stateVar =  BombStates::SETTING;
 static uint32_t keyInput[5] = {1, 2, 3, 4, 5};
 static uint8_t counter = 0;
 static uint32_t keyCode = 0;

 switch (stateVar) {
     case BombStates::SETTING:
     if (bombEvs == BOMBEVS::UP) {
         if (Timer < 60) {
         Timer++;
         Serial.println(Timer);
         }
     } else if (bombEvs == BOMBEVS::DOWN) {
         if (Timer > 10) {
         Timer--;
         Serial.println(Timer);
         }

     } else if (bombEvs == BOMBEVS::ARM) {
         initCount();
         stateVar = BombStates::COUNTING;
     }
     break;

     case BombStates::COUNTING:
     if (bombEvs == BOMBEVS::EVTIMER) {

         Timer--;

         if (Timer == 0) {
         Serial.println("RIP");
         for (;;);
         }
         else {

         Serial.println(Timer);
         }
     }
     else if (bombEvs == BOMBEVS::UP) {
         if (counter < 5) {
         keyCode = keyCode + 8 * keyInput[counter];
         counter++;
         }
     } else if (bombEvs == BOMBEVS::DOWN) {
         if (counter < 5) {
         keyCode = keyCode + 17 * keyInput[counter];
         counter++;
         }
     } else if (bombEvs == BOMBEVS::ARM) {
         if(keyCode == 165){
                 keyCode = 0;
                 counter = 0;
                 Serial.println(":)");
                 stopCount();
                 stateVar = BombStates::SETTING;
         }
         else{
             counter = 0;
             keyCode = 0;
         }
     }

     break;

 }
 }

 void taskInputSerial() {
 if (Serial.available()) {
     int dataRx = Serial.read();
     if (dataRx == 'u') {
     bombEvs  = BOMBEVS::UP;
     bombEvsFlag = true;
     }
     else if (dataRx == 'd') {
     bombEvs  = BOMBEVS::DOWN;
     bombEvsFlag = true;
     }
     else if (dataRx == 'a') {
     bombEvs  = BOMBEVS::ARM;
     bombEvsFlag = true;
     }


 }
 }

 void taskTime() {
 if (timerInitCount == true) {
     uint32_t timeNow = millis();
     if ( (timeNow - timeOld) >= 1000 ) {
     timeOld = timeNow;
     bombEvs = BOMBEVS::EVTIMER;
     bombEvsFlag = true;
     }
 }
 }

 void loop() {


 taskInputSerial();

 taskTime();

 if (bombEvsFlag == true) {
     bombEvsFlag = false;
     taskBomb();
 }

 }

Material

Para la evaluación formativa se propone implementar el modelo que muestra en esta imagen:

../_images/SM.jpeg