Загрузка данных
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:
t, h = self.sensors.read_dht()
if t is not None:
self.update_display_text(t, h)
except OSError:
pass
self.last_dht_time = now
# 2. Проверка края стола (Высший приоритет)
if self.current_state != self.STATE_EMERGENCY:
if self.sensors.check_edge():
self.execute_emergency()
continue
# 3. Логика состояний
if self.current_state == self.STATE_IDLE:
elapsed = time.ticks_diff(now, self.state_timer)
# 3.1 Моргание
if elapsed >= 10000 and not self.has_blinked:
play_animation(self.display, 'BLINK.bin', fps=30)
self.has_blinked = True
# 3.2 Осмотр
if elapsed >= 10000 and not self.has_looked:
wait_seconds = self.wait_duration // 1000
if wait_seconds >= 14:
print(f"[ОСМОТР] Крутим шеей...")
self.servo.set_angle(180); time.sleep(2)
self.servo.set_angle(0); time.sleep(4)
self.servo.set_angle(90); time.sleep(1)
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)
if action == 'forward':
self.action_type = 'forward'
self.action_timer = time.ticks_add(now, int(duration * 1000))
self.current_state = self.STATE_MOVING
print(f"[ДВИЖЕНИЕ] Едем вперед ({duration:.1f} сек)")
elif action == 'left' or action == 'right':
self.action_type = action + '_turn'
self.action_timer = time.ticks_add(now, 500)
self.current_state = self.STATE_MOVING
self.action_after_turn = 'forward'
self.action_after_turn_duration = duration
print(f"[ПОВОРОТ] {action} (0.5 сек)")
elif self.current_state == self.STATE_MOVING:
# Проверяем, закончилось ли время текущего действия
if time.ticks_diff(now, self.action_timer) >= 0:
self.motors.stop()
# Если мы только что закончили поворот - начинаем ехать прямо
if self.action_type in ['left_turn', 'right_turn']:
self.action_type = self.action_after_turn
self.action_timer = time.ticks_add(now, int(self.action_after_turn_duration * 1000))
print(f"[ДВИЖЕНИЕ] Теперь едем прямо ({self.action_after_turn_duration:.1f} сек)")
else:
# Если закончили ехать прямо - уходим на покой
self.start_new_wait_cycle()
else:
# Выполняем микро-шаги
if self.action_type == 'left_turn':
self.motors.turn_left()
time.sleep_ms(20)
self.motors.stop()
elif self.action_type == 'right_turn':
self.motors.turn_right()
time.sleep_ms(20)
self.motors.stop()
elif self.action_type == 'forward':
self.motors.forward()
time.sleep_ms(20)
self.motors.stop()
time.sleep_ms(10)