Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

SomfyDuino: USB-zu-Somfy-IO-Adapter für Arduino Nano

Komponenten und Zubehör

Komponente Menge
Arduino Nano R3 1
Flachbandkabel (7-adrig) 1
Somfy IO Handsender (z. B. GX037, 1-Kanal) 1

Benötigte Werkzeuge

Über dieses Projekt

Idee

Ich wollte meine Rollläden (Somfy IO) in meine private Hausautomation einbinden, ohne Cloud-Hardware des Herstellers zu nutzen. Lösung: Ein Arduino Nano simuliert die Tastendrücke des Original-Handsenders per USB-Befehl. Es funktioniert!

Benötigtes Material

Verkabelung gemäß Schaltplan. Der Handsender wird vom Arduino mit Strom versorgt (ca. 20 mA beim Senden) – Batterie unbedingt entfernen!

Zur Software

Für die Anbindung an z. B. einen Raspberry Pi empfiehlt es sich, alle Serial.print-Ausgaben zu entfernen – der Arduino soll nur zuhören und Befehle ausführen.

Die Befehlssyntax ist im Code erklärt.

Viel Spaß – Kommentare willkommen!

Cheers, Björn

P.S.: Der SELECT-Knopf ändert bei meinem 1-Kanal-Sender nicht den Kanal, stört aber auch nicht.

Code: Serial-zu-Somfy-Adapter


// SomfyDuino
// by Björn Foldenauer, 05/2017

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("Empfängt einzelne Serial-Zeichen:");
  Serial.println("u - UP vorbereiten");
  Serial.println("d - DOWN vorbereiten");
  Serial.println("m - MY vorbereiten");
  Serial.println("p - PROG vorbereiten");
  Serial.println("s - SELECT vorbereiten");
  Serial.println("r - Wiederholungszähler +1");
  Serial.println("Ziffer X - Haltezeit + X*100 ms");
  Serial.println("e - EXECUTE: definierten Tastendruck ausführen");
  Serial.println("");
  Serial.println("Beispiel: normales UP: u5e");
  Serial.println("  3 Sek. UP/DOWN: ud9993e");
  Serial.println("  5 Sek. PROG: p999995e");

  pinMode(progPin, OUTPUT);
  pinMode(upPin, OUTPUT);
  pinMode(downPin, OUTPUT);
  pinMode(myPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(selectPin, OUTPUT);

  // Alle Ausgänge HIGH (inaktiv, da Taster gegen GND schalten)
  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);
    switch (incomingChar) {
      case 'u': upPress = true; break;
      case 'd': downPress = true; break;
      case 'm': myPress = true; break;
      case 'p': progPress = true; break;
      case 's': selectPress = true; break;
      case '1': holdTime += 100; break;
      case '2': holdTime += 200; break;
      case '3': holdTime += 300; break;
      case '4': holdTime += 400; break;
      case '5': holdTime += 500; break;
      case '6': holdTime += 600; break;
      case '7': holdTime += 700; break;
      case '8': holdTime += 800; break;
      case '9': holdTime += 900; break;
      case 'r': repeatSend++; break;
      case 'e': somSend(); break;
    }
  }
}

void somSend() {
  Serial.print("Drücke: ");
  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("für ");
    Serial.print(holdTime);
    Serial.println(" ms");
    delay(holdTime);
    // Alle Tasten loslassen
    digitalWrite(progPin, HIGH);
    digitalWrite(upPin, HIGH);
    digitalWrite(downPin, HIGH);
    digitalWrite(myPin, HIGH);
    digitalWrite(selectPin, HIGH);
    digitalWrite(ledPin, LOW);
    delay(holdTime); // Pause zwischen Wiederholungen
  }
  // Zurücksetzen
  upPress = downPress = myPress = progPress = selectPress = false;
  holdTime = 0;
  repeatSend = 0;
  Serial.println("fertig.");
}

Schaltpläne

SomfyDuino: USB-zu-Somfy-IO-Adapter für Arduino Nano

SomfyDuino: USB-zu-Somfy-IO-Adapter für Arduino Nano

SomfyDuino: USB-zu-Somfy-IO-Adapter für Arduino Nano

Herstellungsprozess

  1. Remote-Wetterüberwachung mit Raspberry Pi 3 & PubNub
  2. Professionelle Raspberry Pi Universalfernbedienung mit LIRC bauen
  3. IR-Fernbedienungsbefehle auf Raspberry Pi ohne LIRC erfassen: Python UART-Ansatz
  4. Fern-Herzfrequenz-Überwachung mit AWS IoT Alarmen
  5. SMS-gesteuerter Smart AC Power Switch mit Raspberry Pi & Hologram
  6. ROObockey: Präzisionsunterstützter ferngesteuerter Street-Hockey-Roboter
  7. Cloud Monitoring: Fernsteuerungssystem für Echtzeit-Asset-Management
  8. 5 Schlüsselvorteile der ferngesteuerten Produktionskontrolle für die moderne Industrie
  9. Sicheren Remote-gRPC-Zugriff mit grpcurl auf PLCnext-Geräten
  10. Top 3 Vorteile von Fernüberwachung für Fertigungseffizienz