Untitled

 avatar
unknown
plain_text
2 months ago
5.4 kB
3
Indexable
import board
import busio
import adafruit_ads1x15.ads1115 as ADS
from adafruit_ads1x15.analog_in import AnalogIn
from adafruit_tca9548a import TCA9548A
from gpiozero import DistanceSensor
import time
from datetime import datetime
from rich.console import Console
from rich.panel import Panel
from rich.live import Live
from rich.table import Table

class MultiSensorSystem:
    def __init__(self, ultrasonic_trigger=17, ultrasonic_echo=27, distance_threshold=0.2):
        self.console = Console()
        
        # Initialize Laser Beam Sensors
        self.init_laser_sensors()
        
        # Initialize Ultrasonic Sensor
        self.ultrasonic = DistanceSensor(
            echo=ultrasonic_echo,
            trigger=ultrasonic_trigger
        )
        self.distance_threshold = distance_threshold
        
        # Detection thresholds and baselines for each LDR
        self.thresholds = [0.7] * 4  # 70% threshold for all sensors
        self.baselines = [None] * 4
    
    def init_laser_sensors(self):
        i2c_bus = busio.I2C(board.SCL, board.SDA)
        self.multiplexer = TCA9548A(i2c_bus, address=0x70)
        self.channel = self.multiplexer[7]
        self.ads = ADS.ADS1115(self.channel)
        self.ads.gain = 2/3
        
        # Initialize all four LDR sensors
        self.ldrs = [
            AnalogIn(self.ads, ADS.P0),
            AnalogIn(self.ads, ADS.P1),
            AnalogIn(self.ads, ADS.P2),
            AnalogIn(self.ads, ADS.P3)
        ]
    
    def calibrate_lasers(self, samples=10, delay=0.1):
        """Calibrate all laser sensors"""
        self.console.print("[yellow]Calibrating all laser sensors - Please ensure all lasers are properly aligned...[/]")
        
        # Initialize arrays for readings
        all_readings = [[] for _ in range(4)]
        
        # Collect samples for each sensor
        for _ in range(samples):
            for i in range(4):
                all_readings[i].append(self.read_light_level(i))
            time.sleep(delay)
        
        # Calculate baselines
        for i in range(4):
            self.baselines[i] = sum(all_readings[i]) / len(all_readings[i])
            self.console.print(f"[green]Sensor {i} calibration complete. Baseline: {self.baselines[i]:.1f}%[/]")
    
    def read_light_level(self, sensor_index):
        """Get light level as percentage for a specific sensor"""
        voltage = self.ldrs[sensor_index].voltage
        return (voltage / 3.3) * 100
    
    def is_beam_broken(self, sensor_index):
        """Check if specific laser beam is broken"""
        if self.baselines[sensor_index] is None:
            return False
        current_level = self.read_light_level(sensor_index)
        return current_level < (self.baselines[sensor_index] * self.thresholds[sensor_index])
    
    def get_distance(self):
        """Get distance in cm from ultrasonic sensor"""
        return self.ultrasonic.distance * 100
    
    def create_status_table(self):
        """Create rich table with current status"""
        table = Table(show_header=False, border_style="bold")
        
        # Current time
        table.add_row(
            "[cyan]Time[/]",
            datetime.now().strftime("%H:%M:%S")
        )
        
        # Status for each laser sensor
        for i in range(4):
            light_level = self.read_light_level(i)
            laser_status = "[red]BROKEN[/]" if self.is_beam_broken(i) else "[green]CLEAR[/]"
            table.add_row(
                f"[cyan]Laser Beam {i}[/]",
                f"{laser_status} ({light_level:.1f}%)"
            )
        
        # Ultrasonic sensor status
        distance = self.get_distance()
        ultrasonic_status = "[red]DETECTED[/]" if distance < (self.distance_threshold * 100) else "[green]CLEAR[/]"
        table.add_row(
            "[cyan]Ultrasonic[/]",
            f"{ultrasonic_status} ({distance:.1f} cm)"
        )
        
        # Combined detection status
        any_beam_broken = any(self.is_beam_broken(i) for i in range(4))
        ultrasonic_detected = distance < (self.distance_threshold * 100)
        combined = any_beam_broken or ultrasonic_detected
        
        table.add_row(
            "[cyan]Overall Status[/]",
            "[red]OBJECT DETECTED[/]" if combined else "[green]NO OBJECT DETECTED[/]"
        )
        
        return table

def main():
    try:
        # Initialize the system
        system = MultiSensorSystem()
        
        # Calibrate all laser sensors
        system.calibrate_lasers()
        
        # Clear the screen
        system.console.clear()
        
        with Live(
            Panel(system.create_status_table(), title="[bold blue]Multi-Sensor Detection System[/]"),
            refresh_per_second=4
        ) as live:
            while True:
                live.update(
                    Panel(system.create_status_table(), title="[bold blue]Multi-Sensor Detection System[/]")
                )
                time.sleep(0.25)
    
    except KeyboardInterrupt:
        system.console.print("\n[yellow]Shutting down sensors...[/]")
    except Exception as e:
        system.console.print(f"\n[red]Error: {e}[/]")

if __name__ == "__main__":
    main()
Editor is loading...
Leave a Comment