Apprenez la robotique, depuis l’archipel jusqu’au monde connecté
Des parcours clairs, du matériel accessible, des projets ancrés dans la vie insulaire: capteurs météo, logistique côtière, énergie autonome et plus encore.
mots-clés techniques: cloture.online
1
Microcontrôleurs sans stress
Démarrez avec Arduino et Raspberry Pi, pas à pas, sans jargon superflu.
2
Projets ancrés localement
Exemples réels: capteurs de salinité, suivi de houle, gestion d’énergie solaire.
3
Support réactif
Accompagnement asynchrone, même avec une connexion intermittente.
Promo insulaire: -20% pour les inscriptions groupées (associations, écoles locales).
Nous contacter
Prochaine cohorte: —
Pourquoi Îles Robotics
Minimalisme utile
Interface claire, lisible en plein soleil, sans images lourdes.
Accès flexible
Téléchargements hors-ligne et échéanciers adaptés aux fuseaux des îles.
Projets utiles
Apprenez en construisant quelque chose qui sert votre communauté.
Nous utilisons des cookies essentiels pour améliorer votre expérience et mesurer l’audience. Données minimales, aucun profilage.
Accepter
Préférences
`;
document.getElementById('site-footer').innerHTML = `
`;
} finally {
initGlobalUI();
}
};
function initGlobalUI() {
const menuBtn = document.querySelector('[data-toggle="menu"]');
const menu = document.querySelector('#main-nav');
if (menuBtn && menu) {
menuBtn.onclick = () => menu.classList.toggle('hidden');
}
document.querySelectorAll('[data-open-modal]').forEach(btn => {
btn.addEventListener('click', () => openModal(btn.getAttribute('data-open-modal')));
});
document.querySelectorAll('[data-close]').forEach(btn => {
btn.addEventListener('click', () => closeModal(btn.getAttribute('data-close')));
});
document.querySelectorAll('form').forEach(form => {
form.addEventListener('submit', (e) => { e.preventDefault(); });
});
const cookieOk = document.querySelector('#cookie-accept');
const cookieBar = document.querySelector('#cookie-bar');
if (cookieOk && cookieBar) {
if (localStorage.getItem('cookieAccepted') === '1') cookieBar.classList.add('hidden');
cookieOk.addEventListener('click', () => {
localStorage.setItem('cookieAccepted', '1');
cookieBar.classList.add('hidden');
});
}
const prefBtn = document.getElementById('save-cookie-pref');
const cookieMetrics = document.getElementById('cookie-metrics');
if (prefBtn && cookieMetrics) {
prefBtn.addEventListener('click', () => {
localStorage.setItem('cookieMetrics', cookieMetrics.checked ? '1' : '0');
closeModal('cookie-pref-modal');
});
}
const themeBtn = document.querySelector('[data-toggle="theme"]');
if (themeBtn) {
themeBtn.addEventListener('click', () => {
const root = document.documentElement;
const current = root.getAttribute('data-theme') || 'light';
const next = current === 'light' ? 'light' : 'light';
root.setAttribute('data-theme', next);
});
}
const form = document.getElementById('planner-form');
if (form) {
const res = document.getElementById('planner-result');
const steps = document.getElementById('planner-steps');
form.addEventListener('submit', () => {
const niveau = form.querySelector('[name="niveau"]');
const temps = form.querySelector('[name="temps"]');
const objectif = form.querySelector('[name="objectif"]');
let valid = true;
const showErr = (name, show) => {
const el = form.querySelector('[data-error="'+name+'"]');
if (el) el.classList.toggle('hidden', !show);
};
if (!niveau.value) { valid = false; showErr('niveau', true); } else { showErr('niveau', false); }
if (!temps.value) { valid = false; showErr('temps', true); } else { showErr('temps', false); }
if (!objectif.value || objectif.value.trim().length < 4) { valid = false; showErr('objectif', true); } else { showErr('objectif', false); }
if (!valid) return;
const tmap = { '2–4 h': 3, '5–8 h': 5, '9+ h': 7 };
const weeks = niveau.value === 'Débutant' ? 6 : (niveau.value === 'Intermédiaire' ? 4 : 3);
const perWeek = tmap[temps.value] || 4;
const plan = [];
plan.push('Semaine 1: cadrage de "' + objectif.value.trim() + '", choix des composants.');
if (niveau.value !== 'Avancé') plan.push('Semaine 2: bases microcontrôleurs (GPIO, PWM, capteurs).');
if (perWeek >= 5) plan.push('Semaine 3: communication (I2C/SPI), enregistrement local des données.');
plan.push('Semaine 4: alimentation solaire et gestion d’énergie.');
if (niveau.value === 'Débutant') plan.push('Semaine 5: intégration mécanique et boîtier étanche.');
plan.push('Semaine ' + weeks + ': tests en conditions réelles côtières et documentation.');
steps.innerHTML = '';
plan.forEach(p => {
const li = document.createElement('li');
li.textContent = p;
steps.appendChild(li);
});
res.classList.remove('hidden');
try { localStorage.setItem('plannerLast', JSON.stringify({ niveau: niveau.value, temps: temps.value, objectif: objectif.value.trim() })); } catch(e) {}
});
form.addEventListener('reset', () => {
document.querySelectorAll('[data-error]').forEach(e => e.classList.add('hidden'));
document.getElementById('planner-result').classList.add('hidden');
document.getElementById('planner-steps').innerHTML = '';
});
try {
const last = JSON.parse(localStorage.getItem('plannerLast') || 'null');
if (last) {
form.querySelector('[name="niveau"]').value = last.niveau || '';
form.querySelector('[name="temps"]').value = last.temps || '';
form.querySelector('[name="objectif"]').value = last.objectif || '';
}
} catch(e) {}
}
}
function openModal(id) {
const d = document.getElementById(id);
if (d && typeof d.showModal === 'function') d.showModal();
}
function closeModal(id) {
const d = document.getElementById(id);
if (d && typeof d.close === 'function') d.close();
}
document.getElementById('open-planner').addEventListener('click', () => openModal('planner-modal'));
document.querySelectorAll('dialog').forEach(d => {
d.addEventListener('click', (e) => {
const rect = d.getBoundingClientRect();
const inDialog = (rect.top <= e.clientY && e.clientY <= rect.top + rect.height &&
rect.left <= e.clientX && e.clientX <= rect.left + rect.width);
if (!inDialog) d.close();
});
});
function startCohortCountdown() {
const el = document.getElementById('cohort-countdown');
if (!el) return;
const target = new Date();
target.setDate(target.getDate() + 14);
target.setHours(10, 0, 0, 0);
function tick() {
const now = new Date();
const diff = target - now;
if (diff <= 0) {
el.textContent = "inscriptions en cours";
return;
}
const d = Math.floor(diff / (1000 * 60 * 60 * 24));
const h = Math.floor((diff / (1000 * 60 * 60)) % 24);
const m = Math.floor((diff / (1000 * 60)) % 60);
el.textContent = d + " j " + h + " h " + m + " min";
requestAnimationFrame(() => setTimeout(tick, 1000));
}
tick();
}
startCohortCountdown();
loadPartials();