Je suis sur arduino IDE et je cherche à contrôlé les entrées de mon extension numérique de ma OPTA pour les faire passer à 1 ou 0, avez-vous un code pour IDE à me proposer. Merci d'avance !
Tu fais comme tu le sens. A mon très humble avis, il me semble qu'avant de commencer avec un Opta, il serait plus sage de prendre une Uno, ou mieux une nano + breadboard + fils dupont, + kit de leds + résistance entre 570 et 400 ohms, le tout sur aliexpress (à moins que tu ne veuilles payer le même matériel 5 fois plus cher en boutique) et de t'entrainer avec les tutos d'Eskimon : eskimon.fr
Ces tutos, en français, sont très didactiques et traitent aussi bien de programmation que du matériel.
Une fois quelques tuto de réalisés, tu verra que tout sera plus simple.
Avant de monter le mur, on coule des fondations solides.
Encore une fois, c'est toi qui décide.
Salut Gabriel, tu as de la chance j'ai bossé la dessus il y a quelques semaines. Je peux te passer un bout de mon code si tu veux pour que tu essaie de comprendre comment ça marche. Attention à bien importer toutes les bibliothèques nécessaires.
Je ne te garantie pas que tout marche du premier coup. J'ai supprimer pas mal de passage pour clarifier un peu mais je n'ai pas eu le temps de le tester.
/*
Séquenceur de relais pour Arduino Opta
— Extension Digital Mech Expansion n°0
— Un seul relais actif à la fois, changement toutes les 3 s
*/
#include <Wire.h>
#include "OptaBlue.h"
using namespace Opta;
/* --- Constantes --- */
constexpr uint8_t RELAY_COUNT = 6; // canaux 0-5
/* --- Fonctions utilitaires --- */
void setRelay(uint8_t onId) {
DigitalMechExpansion ext0 = OptaController.getExpansion(0);
if (!ext0) return; // sécurité : extension absente
for (uint8_t i = 0; i < RELAY_COUNT; ++i) {
ext0.digitalWrite(i, (i == onId) ? HIGH : LOW);
}
ext0.updateDigitalOutputs(); // pousse l’état vers l’extension
}
/* --- Setup --- */
void setup() {
Serial.begin(9600);
Wire.begin(); // I²C interne Opta ↔ expansion
OptaController.begin();
// Tous les relais à OFF au boot
DigitalExpansion::setDefault(
OptaController, 0,
DigitalExpansion::calcDefault(false,false,false,false,false,false,false,false),
3000); // délai anti-rebond interne (ms)
setRelay(0); // démarre sur le premier relais
}
/* --- Boucle principale --- */
void loop() {
static uint8_t current = 0; // relais en cours (0-5)
static unsigned long lastSwitch = 0;
if (millis() - lastSwitch >= 3000UL) { // 3 s écoulées ?
lastSwitch = millis();
current = (current + 1) % RELAY_COUNT; // prochain relais
setRelay(current);
Serial.print("Relay "); Serial.print(current); Serial.println(" ON");
}
OptaController.update(); // garde l’extension synchronisée
}
Ok j'ai le code suivant pour l'instant ,j'allume une led a chaque fois pour vérifier que l'entrée est bien dans son état, mais quand je met l'entrée en HIGH (j'injecte du 24V) la led ne s'éteint pas comme je l'ai mis dans le code, je ne comprend pas ? :
using namespace Opta;
void setup() {
Serial.begin(9600);
delay(2000);
// Initialisation du contrôleur Opta et des extensions
OptaController.begin();
Serial.println("Modules détectés : ");
Serial.println(OptaController.getExpansionNum());
// Configuration des LEDs en sortie
pinMode(LED_D0, OUTPUT);
pinMode(LED_D1, OUTPUT);
}
void loop() {
// Accès au module d’expansion numéro 0
DigitalMechExpansion mechExp = OptaController.getExpansion(0);
// Mettre à jour les états d’entrées
mechExp.updateDigitalInputs();
// ----- Entrée 0 -----
PinStatus in0 = mechExp.digitalRead(0);
if (in0 == HIGH) {
mechExp.digitalWrite(0, LOW);
digitalWrite(LED_D0, LOW); // Éteindre LED_D0
Serial.println("Entrée 0 = 1 → Sortie 0 = HIGH");
} else if(in0 == LOW) {
mechExp.digitalWrite(0, HIGH);
digitalWrite(LED_D0, HIGH); // Allumer LED_D0
Serial.println("Entrée 0 = 0 → Sortie 0 = LOW");
}
// ----- Entrée 1 -----
PinStatus in1 = mechExp.digitalRead(1);
if (in1 == HIGH) {
digitalWrite(LED_D1, LOW); // Éteindre LED_D1
Serial.println("Entrée 1 = 1 → Sortie 1 = HIGH");
} else if(in1 == LOW) {
digitalWrite(LED_D1, HIGH); // Allumer LED_D1
Serial.println("Entrée 1 = 0 → Sortie 1 = LOW");
}
// Appliquer les changements sur les sorties
mechExp.updateDigitalOutputs();
delay(1000);
}```
Salut gabriel, tu peux essayer ca, il y a des chances que ça marche :
`/*
Opta + Digital Mech Expansion
— Lecture des entrées I0 et I1
— Miroir sur LED_D0 / LED_D1
— Inversion de la sortie O0 quand I0 est à 0 V
Auteur : ChatGPT (31 juillet 2025)
*/
#include <Opta.h> // Bibliothèque officielle Opta™
using namespace Opta;
DigitalMechExpansion mechExp; // Déclaration globale pour clarté
void setup() {
Serial.begin(9600);
delay(2000); // Laisser l’USB s’initialiser
// ------------ Initialisation Opta ------------
OptaController.begin();
Serial.print("Nombre d’extensions détectées : ");
Serial.println(OptaController.getExpansionNum());
// On cible l’extension n°0 (la première sur le bus)
mechExp = OptaController.getExpansion(0);
// ------------ Configuration des sorties locales ------------
pinMode(LED_D0, OUTPUT);
pinMode(LED_D1, OUTPUT);
// ------------ État initial ------------
digitalWrite(LED_D0, LOW);
digitalWrite(LED_D1, LOW);
mechExp.digitalWrite(0, LOW); // Assure sortie O0 à 0 V
mechExp.updateDigitalOutputs(); // Push initial
}
void loop() {
/* 1. Lecture des valeurs acquises au cycle précédent */
PinStatus in0 = mechExp.digitalRead(0); // I0
PinStatus in1 = mechExp.digitalRead(1); // I1
/* 2. Traitement & action -------------------------------- */
// LED_D0/LED_D1 ON quand l’entrée correspondante vaut 0 V
digitalWrite(LED_D0, (in0 == HIGH) ? LOW : HIGH);
digitalWrite(LED_D1, (in1 == HIGH) ? LOW : HIGH);
// Sortie O0 = inverse logique de I0
mechExp.digitalWrite(0, (in0 == HIGH) ? LOW : HIGH);
// Propager les sorties immédiatement
mechExp.updateDigitalOutputs();
/* 3. Préparer le prochain tour ------------------------- */
mechExp.updateDigitalInputs(); // Lance l’échantillonnage I²C
/* 4. Debug série facultatif ---------------------------- */
Serial.print("I0=");
Serial.print(in0 == HIGH ? "HIGH" : "LOW");
Serial.print(" | I1=");
Serial.println(in1 == HIGH ? "HIGH" : "LOW");
delay(100); // 10 Hz de rafraîchissement ≈ suffisant
}
`
Merci d'IA ![]()
