У меня есть этот фрагмент кода, который я хотел бы отменить: я хочу убедиться, что даже через ± 1,5 секунды показания будут такими же (если это так, сделайте что-нибудь, иначе сделайте что-нибудь еще ...) .
Функция Winning_check () получает битовую маску в качестве входных данных и запускается внутри l oop ().
void winning_check(uint16_t mask) {
if ((mask & 0b11111000000000) == 0b11111000000000) { // btm row winning sequence
digitalWrite(WINNING_SENSOR_PIN, HIGH);
digitalWrite(BTM_ROW_MOTOR_PIN, LOW); // =turn on
} else {
// digitalWrite(WINNING_SENSOR_PIN, LOW);
if (!digitalRead(BTM_ROW_SENSOR_PIN)) digitalWrite(BTM_ROW_MOTOR_PIN, HIGH);
}
if ((mask & 0b00000111110000) == 0b00000111110000) { // mid row winning sequence
digitalWrite(WINNING_SENSOR_PIN, HIGH);
digitalWrite(MID_ROW_MOTOR_PIN, LOW); // =turn on
} else {
// digitalWrite(WINNING_SENSOR_PIN, LOW);
if (!digitalRead(MID_ROW_SENSOR_PIN)) digitalWrite(MID_ROW_MOTOR_PIN, HIGH);
}
if ((mask & 0b00000000001111) == 0b00000000001111) { // top row winning sequence
digitalWrite(WINNING_SENSOR_PIN, HIGH);
digitalWrite(TOP_ROW_MOTOR_PIN, LOW); // =turn on
} else {
// digitalWrite(WINNING_SENSOR_PIN, LOW);
if (!digitalRead(TOP_ROW_SENSOR_PIN)) digitalWrite(TOP_ROW_MOTOR_PIN, HIGH);
}
}
Я пробовал это, но это не не похоже на работу:
void winning_check(uint16_t mask) {
if ((mask & 0b11111000000000) == 0b11111000000000) { // btm row winning sequence
last_debounce_time = millis();
if ((millis() - last_debounce_time) >= DEBOUNCE_DELAY_MS) {
if ((mask & 0b11111000000000) == 0b11111000000000) {
digitalWrite(WINNING_SENSOR_PIN, HIGH);
digitalWrite(BTM_ROW_MOTOR_PIN, LOW); // =turn on
}
}
} else {
// digitalWrite(WINNING_SENSOR_PIN, LOW);
if (!digitalRead(BTM_ROW_SENSOR_PIN)) digitalWrite(BTM_ROW_MOTOR_PIN, HIGH);
}
if ((mask & 0b00000111110000) == 0b00000111110000) { // mid row winning sequence
digitalWrite(WINNING_SENSOR_PIN, HIGH);
digitalWrite(MID_ROW_MOTOR_PIN, LOW); // =turn on
} else {
// digitalWrite(WINNING_SENSOR_PIN, LOW);
if (!digitalRead(MID_ROW_SENSOR_PIN)) digitalWrite(MID_ROW_MOTOR_PIN, HIGH);
}
if ((mask & 0b00000000001111) == 0b00000000001111) { // top row winning sequence
digitalWrite(WINNING_SENSOR_PIN, HIGH);
digitalWrite(TOP_ROW_MOTOR_PIN, LOW); // =turn on
} else {
// digitalWrite(WINNING_SENSOR_PIN, LOW);
if (!digitalRead(TOP_ROW_SENSOR_PIN)) digitalWrite(TOP_ROW_MOTOR_PIN, HIGH);
}
}
спасибо заранее.
РЕДАКТИРОВАТЬ
Вот новый код : Я хотел бы отметить, что маска принадлежит механическим переключателям, поэтому они не сбрасываются до тех пор, пока не будет обнаружено определение выигрыша строки, а затем двигатель (например, MID_ROW_MOTOR_PIN) сбрасывает точно такую же строку.
О программе Сброс WinningState на LOW, у меня есть функция сброса, которая вызывается, когда игра заканчивается - то есть, когда я сбрасываю WinningState.
Новая проблема заключается в том, что когда я сбрасываю Arduino, запускаю игру и достигнув правильной маски победы, код работает в первый раз с время отката, которое мы сделали, но когда я делаю это снова, он не считает снова, а сразу сбрасывает маску строки ...
Еще одна вещь, которая может вызвать это, - то, что всегда вызывается оператор else. Я проверил это в последовательном мониторе, используя Serial.println ().
void winning_check(uint16_t mask) {
if (((mask & 0b11111000000000) == 0b11111000000000 || (mask & 0b00000111110000) == 0b00000111110000 || (mask & 0b00000000001111) == 0b00000000001111) && (winning_state == false)) {
Serial.println("Win detected");
winning_state = true;
last_debounce_time = millis();
}
if ((millis() - last_debounce_time) >= DEBOUNCE_DELAY_MS && (mask & 0b11111000000000) == 0b11111000000000) { // btm row winning sequence
Serial.println("btm row win confirmed");
digitalWrite(WINNING_SENSOR_PIN, HIGH);
digitalWrite(BTM_ROW_MOTOR_PIN, LOW); // =turn on
} else {
Serial.println(".");
// digitalWrite(WINNING_SENSOR_PIN, LOW);
if (!digitalRead(BTM_ROW_SENSOR_PIN)) digitalWrite(BTM_ROW_MOTOR_PIN, HIGH);
}
if ((millis() - last_debounce_time) >= DEBOUNCE_DELAY_MS && (mask & 0b00000111110000) == 0b00000111110000) { // mid row winning sequence
digitalWrite(WINNING_SENSOR_PIN, HIGH);
digitalWrite(MID_ROW_MOTOR_PIN, LOW); // =turn on
} else {
// digitalWrite(WINNING_SENSOR_PIN, LOW);
if (!digitalRead(MID_ROW_SENSOR_PIN)) digitalWrite(MID_ROW_MOTOR_PIN, HIGH);
}
if ((millis() - last_debounce_time) >= DEBOUNCE_DELAY_MS && (mask & 0b00000000001111) == 0b00000000001111) { // top row winning sequence
digitalWrite(WINNING_SENSOR_PIN, HIGH);
digitalWrite(TOP_ROW_MOTOR_PIN, LOW); // =turn on
} else {
// digitalWrite(WINNING_SENSOR_PIN, LOW);
if (!digitalRead(TOP_ROW_SENSOR_PIN)) digitalWrite(TOP_ROW_MOTOR_PIN, HIGH);
}
}
Вот функция, которая вызывает последовательность:
uint16_t get_clowns_state() {
uint16_t clowns_mask = 0;
for (uint16_t i = 0; i < 14; i++) {
clowns_mask |= (uint16_t)(digitalRead(clowns_pins[i]) << i);
}
return clowns_mask;
}
и внутри l oop (), которую я вызываю: victory_check (get_clowns_state ());