Untitled
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