/**
* /arduino-simulator — SEO landing page
* Target keywords: "arduino simulator", "arduino simulator free"
*/
import React from 'react';
import { Link } from 'react-router-dom';
import { useTranslation } from 'react-i18next';
import { AppHeader } from '../components/layout/AppHeader';
import { useLocalizedHref } from '../i18n/useLocalizedNavigate';
import { useSEO } from '../utils/useSEO';
import { getSeoMeta } from '../seoRoutes';
import { trackClickCTA } from '../utils/analytics';
import './SEOPage.css';
const META = getSeoMeta('/arduino-simulator')!;
const FAQ_ITEMS = [
{
q: 'Is this Arduino simulator free?',
a: 'Yes. Velxio is completely free and open-source (GNU AGPLv3). No account, no payment, no cloud subscription — run it in your browser or self-host it with one Docker command.',
},
{
q: 'Does the Arduino simulator work without installing anything?',
a: 'The simulation engine runs entirely in your browser. Compiling code requires the arduino-cli backend, which you can run locally or via Docker. No IDE installation is needed.',
},
{
q: 'What Arduino boards can I simulate?',
a: 'Velxio supports 19 boards: Arduino Uno (ATmega328P), Arduino Nano, Arduino Mega 2560, ATtiny85, Arduino Leonardo, Arduino Pro Mini (AVR8) — plus Raspberry Pi Pico (RP2040), ESP32-C3 / XIAO ESP32-C3 / CH32V003 (RISC-V), ESP32 / ESP32-S3 / ESP32-CAM (Xtensa via QEMU), and Raspberry Pi 3B (Linux via QEMU).',
},
{
q: 'Can I simulate LEDs, sensors, and displays?',
a: 'Yes. Velxio includes 48+ interactive wokwi-elements: LEDs, resistors, buttons, servo motors, ultrasonic sensors, ILI9341 TFT displays, LCD, NeoPixel strips, buzzers, DHT22, and more.',
},
{
q: 'Is Velxio a Wokwi alternative?',
a: 'Yes. Velxio is a free, self-hosted alternative to Wokwi. It uses the same avr8js emulation library and wokwi-elements visual components, but runs entirely on your own machine with no cloud dependency.',
},
];
const JSON_LD: object[] = [
{
'@context': 'https://schema.org',
'@type': 'SoftwareApplication',
name: 'Velxio — Free Online Arduino Simulator',
applicationCategory: 'DeveloperApplication',
operatingSystem: 'Any (browser-based)',
description:
'Free online Arduino simulator with real AVR8 emulation at 16 MHz. Simulate Arduino code with 48+ interactive electronic components directly in your browser — no install, no account.',
url: 'https://velxio.dev/arduino-simulator',
offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
author: { '@type': 'Person', name: 'David Montero Crespo' },
license: 'https://www.gnu.org/licenses/agpl-3.0.html',
},
{
'@context': 'https://schema.org',
'@type': 'FAQPage',
mainEntity: FAQ_ITEMS.map(({ q, a }) => ({
'@type': 'Question',
name: q,
acceptedAnswer: { '@type': 'Answer', text: a },
})),
},
{
'@context': 'https://schema.org',
'@type': 'BreadcrumbList',
itemListElement: [
{ '@type': 'ListItem', position: 1, name: 'Velxio', item: 'https://velxio.dev/' },
{
'@type': 'ListItem',
position: 2,
name: 'Arduino Simulator',
item: 'https://velxio.dev/arduino-simulator',
},
],
},
];
export const ArduinoSimulatorPage: React.FC = () => {
const { t } = useTranslation();
const localize = useLocalizedHref();
useSEO({ ...META, jsonLd: JSON_LD });
const faqKeys = ['1', '2', '3', '4', '5'] as const;
return (
{/* Hero */}
{t('seo.arduino.hero.title')}
{t('seo.arduino.hero.accent')}
{t('seo.arduino.hero.subtitle')}
trackClickCTA('arduino-simulator', '/editor')}
>
{t('seo.arduino.hero.ctaPrimary')} →
{t('seo.arduino.hero.ctaSecondary')}
{t('seo.arduino.hero.trust')}
{/* What you can simulate */}
{t('seo.arduino.what.heading')}
{t('seo.arduino.what.lead')}
{t('seo.arduino.what.unoTitle')}
{t('seo.arduino.what.unoBody')}
{t('seo.arduino.what.megaTitle')}
{t('seo.arduino.what.megaBody')}
{t('seo.arduino.what.componentsTitle')}
{t('seo.arduino.what.componentsBody')}
{t('seo.arduino.what.serialTitle')}
{t('seo.arduino.what.serialBodyPrefix')}
{t('seo.arduino.what.serialBodyCode')}
{t('seo.arduino.what.serialBodySuffix')}
{t('seo.arduino.what.multiTitle')}
{t('seo.arduino.what.multiBody')}
{t('seo.arduino.what.libTitle')}
{t('seo.arduino.what.libBody')}
{/* How it works */}
{t('seo.arduino.how.heading')}
{t('seo.arduino.how.leadPrefix')}
{t('seo.arduino.how.leadHighlight')}
{t('seo.arduino.how.leadSuffix')}
{t('seo.arduino.how.writeTitle')}
{t('seo.arduino.how.writeBody')}
{t('seo.arduino.how.compileTitle')}
{t('seo.arduino.how.compileBody')}
{t('seo.arduino.how.simulateTitle')}
{t('seo.arduino.how.simulateBody')}
{/* FAQ */}
{t('seo.arduino.faq.heading')}
{faqKeys.map((k) => (
- {t(`seo.arduino.faq.q${k}`)}
- {t(`seo.arduino.faq.a${k}`)}
))}
{/* Bottom CTA */}
{t('seo.arduino.bottom.title')}
{t('seo.arduino.bottom.body')}
trackClickCTA('arduino-simulator', '/editor')}
>
{t('seo.arduino.bottom.cta')} →
{t('seo.links.examples')}
{t('seo.links.arduinoEmu')}
{t('seo.links.atmega')}
{t('seo.links.mega')}
{t('seo.links.esp32')}
{t('seo.links.rpiPico')}
);
};