waste — ESP32-S3 simulation

An interactive ESP32-S3 circuit simulation you can run free in your browser on Velxio, by harshad.

Components

Sketch code

#include <Arduino.h>
#include <Wire.h>
#include <ESP32Servo.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// ============================================================
// AI WASTE SORTING SYSTEM — NO PUSH BUTTONS / NO PCA9685
// Three XIAO ESP32-S3 Sense camera nodes -> ESP32-S3 controller
// -> 5 direct PWM servo outputs -> robotic arm
//
// Velxio note:
// The three camera nodes represent the physical XIAO ESP32S3
// Sense camera/AI nodes. In the simulator, their AI result is
// generated automatically and transmitted over UART.
// ============================================================

#define BASE_SERVO       1
#define SHOULDER_SERVO   2
#define ELBOW_SERVO      3
#define WRIST_SERVO      4
#define GRIPPER_SERVO    7

#define LED_DRY          5
#define LED_WET          6
#define LED_METAL        8

#define OLED_SDA         21
#define OLED_SCL         22
#define OLED_ADDR        0x3C

Servo baseServo, shoulderServo, elbowServo, wristServo, gripperServo;
Adafruit_SSD1306 display(128, 64, &Wire, -1);

// Three camera UART receivers.
// Camera 1 -> GPIO16
// Camera 2 -> GPIO18
// Camera 3 -> GPIO19
HardwareSerial Cam1(1);
HardwareSerial Cam2(2);
HardwareSerial Cam3(0);

String classifyConsensus(String a, String b, String c) {
  a.trim(); b.trim(); c.trim();
  a.toUpperCase(); b.toUpperCase(); c.toUpperCase();

  if (a == b) return a;
  if (a == c) return a;
  if (b == c) return b;
  return "UNKNOWN";
}

void oled(String title, String value) {
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.println(title);
  display.setTextSize(2);
  display.setCursor(0, 25);
  display.println(value);
  display.display();
}

void home() {
  baseServo.write(90);
  shoulderServo.write(90);
  elbowServo.write(90);
  wristServo.write(90);
  gripperServo.write(20); // open
  delay(300);
}

void pickWaste() {
  shoulderServo.write(110);
  delay(300);
  elbowServo.write(70);
  delay(300);
  gripperServo.write(85); // close
  delay(500);
}

void dropAt(int baseAngle) {
  baseServo.write(baseAngle);
  delay(700);
  gripperServo.write(20); // open
  delay(500);
  home();
}

void sortWaste(String waste) {
  digitalWrite(LED_DRY, LOW);
  digitalWrite(LED_WET, LOW);
  digitalWrite(LED_METAL, LOW);

  if (waste == "DRY") {
    digitalWrite(LED_DRY, HIGH);
    oled("AI DETECTED", "DRY WASTE");
    Serial.println("FINAL DECISION: DRY WASTE");
    pickWaste();
    dropAt(45);
  } else if (waste == "WET") {
    digitalWrite(LED_WET, HIGH);
    oled("AI DETECTED", "WET WASTE");
    Serial.println("FINAL DECISION: WET WASTE");
    pickWaste();
    dropAt(90);
  } else if (waste == "METAL") {
    digitalWrite(LED_METAL, HIGH);
    oled("AI DETECTED", "METAL");
    Serial.println("FINAL DECISION: METAL WASTE");
    pickWaste();
    dropAt(135);
  } else {
    oled("AI RESULT", "UNKNOWN");
    Serial.println("UNKNOWN RESULT - ARM HOLD");
    home();
  }
}

String readLine(HardwareSerial

More projects by harshad