robi_tests — Xiao Esp32 S3 simulation

tests for creating a small robi

An interactive Xiao Esp32 S3 circuit simulation you can run free in your browser on Velxio, by sushii.

Components

Sketch code

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

// Definition des Displays (128x64 Pixel)
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET    -1 // Kein Reset-Pin verwendet
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// Definiere den Touch-Pin am ESP32-S3
// GPIO 4 ist ein Touch-fähiger Pin (Touch 3) beim ESP32-S3
const int touchPin = 1; 

// Schwellenwert für den Touch-Sensor (je nach Verkabelung anpassen)
// Je niedriger der Wert bei Berührung, desto empfindlicher
const int threshold=40;



//--------------------------------
unsigned long lastAction = 0;
unsigned long blinkInterval = 1000;

bool eyesOpen = true;

//--------------update blinking-----------------------//

  void updateBlink() {

  unsigned long actualTime = millis();

  if (actualTime - lastAction > blinkInterval) {
  lastAction = actualTime;

  if (eyesOpen == true) {
    display.clearDisplay();
    blink();
    display.display();
    eyesOpen=false;
    blinkInterval = random(100,100);
  } else {
    display.clearDisplay();
    normalEyes();
    display.display();
    eyesOpen=true;
    blinkInterval = random(2000,6000);

   }
  }
}

//------------------random angy face-----------------------//

void updateAngy() {

}



void setup() {

  Serial.begin(115200);

  // Starte das OLED-Display (I2C-Adresse meistens 0x3C)
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 Zuweisung fehlgeschlagen"));
    for(;;); // Bei Fehler anhalten
  }
  // Display initial leeren
  display.clearDisplay();
  normalEyes();
  display.display();
}

void loop() {

updateBlink();
delay(20);
}

//----------------------FACE SHAPES-----------------------------

void wMouth () {
display.drawLine(56,50,52,46, SSD1306_WHITE); //short left
 display.drawLine(56,49,52,45, SSD1306_WHITE);
display.drawLine(64,45,56,50, SSD1306_WHITE); //long left
 display.drawLine(64,44,56,49, SSD1306_WHITE);
display.drawLine(65,45,73,50, SSD1306_WHITE); //long right
 display.drawLine(65,44,73,49, SSD1306_WHITE);
display.drawLine(73,50,77,46, SSD1306_WHITE); //short right
 display.drawLine(73,49,77,45, SSD1306_WHITE);
}

void vMouth () {
display.drawLine(64,45,56,50, SSD1306_WHITE); //long left
 display.drawLine(64,44,56,49, SSD1306_WHITE);
display.drawLine(65,45,73,50, SSD1306_WHITE); //long right
 display.drawLine(65,44,73,49, SSD1306_WHITE);
}


void normalEyes() {
display.drawCircle(22, 32, 14, SSD1306_WHITE); //auge links
 display.drawCircle(22, 32, 15, SSD1306_WHITE);
display.drawCircle(106, 32, 14, SSD1306_WHITE); //auge rechts
 display.drawCircle(106, 32, 15, SSD1306_WHITE);
display.fillCircle(25, 31, 10, SSD1306_WHITE); //pupille links
display.fillCircle(103, 31, 10, SSD1306_WHITE); //pupille rechts
wMouth();
}

void blink() {
//display.drawLine(8, 32, 36, 32, SSD1306_WHITE); thin
display.fillRoundRect(8, 32, 28, 3, 2, SSD1306_WHITE);
display.fillRoundRect(92, 32, 28, 3, 2, SSD1306_WHITE);
//display.drawLine(92, 3