Загрузка данных


    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)