robot — Arduino Uno simulation

An interactive Arduino Uno circuit simulation you can run free in your browser on Velxio, by dave.

Components

Sketch code

/**
 * Ojos de Robot cuadrados + Hora/Temp/Humedad al presionar botón
 * 
 * Conexiones:
 *   OLED SSD1306 I2C: SDA→A4, SCL→A5, VCC→5V, GND→GND
 *   DHT22: DATA→Pin 2, VCC→5V, GND→GND
 *   RTC DS1307: SDA→A4, SCL→A5, VCC→5V, GND→GND
 *   Botón: un lado→Pin 3, otro lado→GND (usa PULLUP interno)
 */

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

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET    -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

RTC_DS1307 rtc;

const int BOTON = 3;  // Volvemos al Pin 3 con cableado diagonal seguro
bool modoInfo = false;

// Ojos
float pxL = 0, pyL = 0, pxR = 0, pyR = 0;
float txL = 0, tyL = 0, txR = 0, tyR = 0;
unsigned long tMove = 0, tPest = 0, tPestIni = 0;
bool pestaniando = false;

void setup() {
  Serial.begin(9600);
  pinMode(BOTON, INPUT_PULLUP);

  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    for (;;);
  }

  dht.begin();
  
  if (!rtc.begin()) {
    Serial.println("RTC no encontrado");
  }
  if (!rtc.isrunning()) {
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }

  display.clearDisplay();
  display.display();
}

void loop() {
  // PULLUP: botón suelto = HIGH, presionado = LOW
  if (digitalRead(BOTON) == LOW) {
    mostrarInfo();
  } else {
    mostrarOjos();
  }
}

void mostrarInfo() {
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  
  DateTime now = rtc.now();
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  // Hora
  display.setCursor(0, 0);
  if (now.hour() < 10) display.print('0');
  display.print(now.hour());
  display.print(':');
  if (now.minute() < 10) display.print('0');
  display.print(now.minute());
  display.print(':');
  if (now.second() < 10) display.print('0');
  display.println(now.second());

  // Temperatura
  display.setCursor(0, 25);
  display.print("Temp: ");
  if (isnan(t)) display.print("--");
  else { display.print(t, 1); display.print(" C"); }

  // Humedad
  display.setCursor(0, 45);
  display.print("Hum:  ");
  if (isnan(h)) display.print("--");
  else { display.print(h, 1); display.print(" %"); }

  display.display();
  delay(50);
}

void mostrarOjos() {
  // Pestañeo
  if (!pestaniando && millis() - tPest > random(3000, 7000)) {
    pestaniando = true;
    tPestIni = millis();
  }
  if (pestaniando && millis() - tPestIni > 150) {
    pestaniando = false;
    tPest = millis();
  }

  // Movimiento de pupilas
  if (millis() - tMove > 2000) {
    txL = random(-6, 7); tyL = random(-6, 7);
    txR = random(-6, 7); tyR = random(-6, 7);
    tMove = millis();
  }
  pxL += (txL - pxL) * 0.1;
  pyL += (tyL - pyL) * 0.1;
  pxR += (txR - pxR) * 0.1;
  pyR += (tyR - pyR) * 0.1;

  display.clearDisplay();
  
  if (pestaniando) {
    // Ojos cerrados: línea horizontal
    display.drawFastHLine(12, 32, 40, SSD1306_WHITE);
    displa

More projects by dave