SomfyDuino: Adaptador USB a Somfy IO para Arduino Nano
Componentes y suministros
| Componente | Cantidad |
|---|---|
| Arduino Nano R3 | 1 |
| Cable plano 7 hilos | 1 |
| Mando a distancia Somfy IO (ej. modelo GX037) | 1 |
Herramientas necesarias
- Soldador (genérico)
Sobre el proyecto
Ideación
Quería integrar mis persianas enrollables Somfy IO en mi sistema domótico casero sin depender de hardware en la nube del proveedor original. ¡Y funcionó! Usando solo un mando IO simple y un Arduino Nano.
Necesitas:
- Un mando Somfy IO (usé GX037, 1 canal).
- Casi cualquier Arduino con USB (también funciona con SoftwareSerial).
- Cable plano de 7 hilos y termorretráctil para empaquetar limpio.
El mando se alimenta del Arduino (~20 mA al transmitir). Retira la pila del mando. Conexiones según esquemas adjuntos.
Sobre el código
Si conectas el conjunto a una Raspberry Pi, elimina todos los Serial.print para que el Arduino solo escuche y responda, facilitando la comunicación.
El protocolo de comandos por serie se explica en el código.
¡Diversión! Comentarios bienvenidos. —Bjoern
Nota: Usé mando de 1 canal. El botón SELECT no cambia de canal en este modelo, pero no rompe nada.
Código: Serie a Somfy
// SomfyDuino v0.71 - Bjoern Foldenauer
int progPin = 8;
int upPin = 12;
int downPin = 10;
int myPin = 11;
int selectPin = 9;
int ledPin = 13;
bool upPress = false, downPress = false, myPress = false;
bool progPress = false, selectPress = false;
unsigned long holdTime = 0;
int repeatSend = 0;
char incomingChar;
void setup() {
Serial.begin(9600);
Serial.println("SomfyDuino 0.71");
Serial.println("Bjoern Foldenauer");
Serial.println("-----");
Serial.println("Recibe caracteres serie:");
Serial.println("u - preparar pulsación SUBIR");
Serial.println("d - preparar pulsación BAJAR");
Serial.println("m - preparar pulsación MY");
Serial.println("p - preparar pulsación PROG");
Serial.println("s - preparar pulsación SELECT");
Serial.println("r - incrementar contador de repeticiones");
Serial.println("digito X - incrementar tiempo retención X*100 ms");
Serial.println("e - EJECUTAR: pulsa y mantiene botones definidos");
Serial.println("");
Serial.println("Ejemplos:");
Serial.println(" SUBIR normal: u5e");
Serial.println(" SUBIR+BAJAR 3s: ud9993e");
Serial.println(" PROG 5s: p999995e");
Serial.println("");
pinMode(progPin, OUTPUT);
pinMode(upPin, OUTPUT);
pinMode(downPin, OUTPUT);
pinMode(myPin, OUTPUT);
pinMode(ledPin, OUTPUT);
pinMode(selectPin, OUTPUT);
// Botones activos en LOW (pull-up internos del mando)
digitalWrite(progPin, HIGH);
digitalWrite(upPin, HIGH);
digitalWrite(downPin, HIGH);
digitalWrite(myPin, HIGH);
digitalWrite(selectPin, HIGH);
digitalWrite(ledPin, LOW);
}
void loop() {
while (Serial.available() == 0) delay(50);
if (Serial.available() > 0) {
incomingChar = Serial.read();
Serial.println(incomingChar);
if (incomingChar == 'u') upPress = true;
if (incomingChar == 'd') downPress = true;
if (incomingChar == 'm') myPress = true;
if (incomingChar == 'p') progPress = true;
if (incomingChar == 's') selectPress = true;
if (incomingChar >= '1' && incomingChar <= '9')
holdTime += (incomingChar - '0') * 100;
if (incomingChar == 'r') repeatSend++;
if (incomingChar == 'e') somSend();
}
}
void somSend() {
Serial.print("Pulsando: ");
for (int i = 0; i <= repeatSend; i++) {
if (upPress) { digitalWrite(upPin, LOW); Serial.print("up "); }
if (downPress) { digitalWrite(downPin, LOW); Serial.print("down "); }
if (myPress) { digitalWrite(myPin, LOW); Serial.print("my "); }
if (progPress) { digitalWrite(progPin, LOW); Serial.print("prog "); }
if (selectPress) { digitalWrite(selectPin, LOW); Serial.print("select "); }
digitalWrite(ledPin, HIGH);
Serial.print("por "); Serial.print(holdTime); Serial.println(" ms");
delay(holdTime);
// Soltar todos
digitalWrite(progPin, HIGH);
digitalWrite(upPin, HIGH);
digitalWrite(downPin, HIGH);
digitalWrite(myPin, HIGH);
digitalWrite(selectPin, HIGH);
digitalWrite(ledPin, LOW);
delay(holdTime); // Pausa entre repeticiones
}
// Reset para próximo comando
upPress = downPress = myPress = progPress = selectPress = false;
holdTime = 0;
repeatSend = 0;
Serial.println("hecho.");
}
Esquemáticos
Tres imágenes: esquema de conexiones, foto del montaje en cable plano, y detalle del mando desmontado. No hay documento PDF.
Proceso de manufactura
- Monitorización meteorológica remota con Raspberry Pi 3 y PubNub
- Construya un Mando Universal Profesional para Raspberry Pi con LIRC
- Capturar comandos de mando IR en Raspberry Pi sin LIRC: enfoque Python UART
- Sistema de Monitorización Remota de Frecuencia Cardíaca con Alertas AWS IoT
- Interruptor Inteligente de Corriente Alterna Controlado por SMS con Raspberry Pi y Hologram
- ROObockey: Robot de Hockey Callejero con Asistencia de Precisión y Control Remoto
- Monitorización en la nube: Sistema de control remoto para gestión de activos en tiempo real
- 5 Beneficios clave del control remoto de producción para la industria moderna
- Acceso Remoto Seguro gRPC con grpcurl en Dispositivos PLCnext
- 3 principales beneficios de la monitorización remota para la eficiencia de fabricación
- Mejora de sistemas de monitorización remota con actualizaciones avanzadas de IoT