Загрузка данных
def start_new_wait_cycle(self):
"""
ГЛАВНОЕ ИЗМЕНЕНИЕ.
Эта функция запускается ТОЛЬКО тогда, когда робот полностью остановился.
"""
self.current_state = STATE_IDLE
self.state_timer = time.ticks_ms() # Засекаем время старта ожидания
# Генерируем число от 1 до 20
rand_val = random.randint(1, 20)
self.wait_duration = rand_val * 1000 # Переводим в миллисекунды
print(f"[ОЖИДАНИЕ] Выпало число: {rand_val} (Ждем {rand_val} сек)")
self.has_looked = False
self.has_blinked = False
def run(self):
print("Робот LOIK запущен!")
self.start_new_wait_cycle() # Запускаем самый первый цикл при включении
while True:
now = time.ticks_ms()
# 1. Обновление DHT11 (независимо от состояния)
if time.ticks_diff(now, self.last_dht_time) > 3000:
try:
self.dht_sensor.measure()
self.update_display_text(self.dht_sensor.temperature(), self.dht_sensor.humidity())
except OSError: pass
self.last_dht_time = now
# 2. Проверка края стола (наивысший приоритет)
if self.current_state != STATE_EMERGENCY:
if self.check_edge():
self.execute_emergency()
continue # Если спаслись, пропускаем остальную логику кадра
# 3. Логика состояний
if self.current_state == STATE_IDLE:
elapsed = time.ticks_diff(now, self.state_timer)
# 3.1 Моргание (ровно на 10 секунде)
if elapsed >= 10000 and not self.has_blinked:
play_animation(self.tft, 'BLINK.bin', fps=30)
self.has_blinked = True
# 3.2 Осмотр (ровно на 10 секунде, если время ожидания >= 14 сек)
if elapsed >= 10000 and not self.has_looked:
wait_seconds = self.wait_duration // 1000
if wait_seconds >= 14:
print(f"[ОСМОТР] Крутим шеей...")
self.set_servo_angle(180); time.sleep(2)
self.set_servo_angle(0); time.sleep(4)
self.set_servo_angle(90); time.sleep(1)
# ВАЖНО: Мы потратили 7 секунд на осмотр.
# Чтобы робот не поехал сразу, мы сдвигаем время старта назад.
self.state_timer = time.ticks_add(self.state_timer, 7000)
self.has_looked = True
# 3.3 Начало движения
if elapsed >= self.wait_duration:
# Время вышло - едем
action = random.choice(['forward', 'forward', 'forward', 'left', 'right'])
duration = random.uniform(1.0, 2.5)
self.action_type = action
self.action_timer = time.ticks_add(now, int(duration * 1000))
self.current_state = STATE_MOVING
print(f"[ДВИЖЕНИЕ] Едем {action} ({duration:.1f} сек)")
elif self.current_state == STATE_MOVING:
# Проверяем, не закончилась ли поездка
if time.ticks_diff(now, self.action_timer) >= 0:
self.stop_motors()
self.start_new_wait_cycle() # ОСТАНОВИЛИСЬ - ЗАПУСКАЕМ НОВОЕ ОЖИДАНИЕ
else:
# Едем микро-шагами, чтобы не пропустить край
if self.action_type == 'forward':
self.move_forward(); time.sleep_ms(50); self.stop_motors()
elif self.action_type == 'left':
self.turn_left(); time.sleep_ms(50); self.stop_motors()
elif self.action_type == 'right':
self.turn_right(); time.sleep_ms(50); self.stop_motors()
time.sleep_ms(10)