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();
}
}
|