irei
Created March 24, 2019 © CC BY-SA

Calliope mini – Funksteckdosen schalten

In dem Projekt werden 433Mhz-Funksteckdosen mit dem Calliope mini gesteuert.

AdvancedFull instructions provided2 hours342
Calliope mini – Funksteckdosen schalten

Things used in this project

Hardware components

Calliope mini
Calliope mini
×1
433Mhz Transmitter
×1
Kroko zu Jumperkabel
×1
433Mhz Funksteckdose
×1

Software apps and online services

Open Roberta Lab - NEPOprog

Story

Read more

Schematics

Signalanalyse und Einstellung der DIP-Schalter

Die 12 bit beinhalten einen Hauscode (der in der Fernbedienung eingestellte Code), einen Gerätecode (wird mit Hauscode in der Steckdose eingestellt) und das Signal für An (10) oder Aus (01). Am Ende wird noch ein Synchronisierungssignal (einmal kurz high) als Zeichen für das Ende des Codes übertragen.

Anschluss des Senders an den Calliope

Die Schaltung ist schnell aufgebaut. Der Sender wird über die Plus- und Minus-Ecken am Calliope mini mit Energie versorgt. Vom Data-Pin muss dann nur noch eine Verbindung mit P1 am Calliope hergestellt werden.

Unterprogramme

Im Kopf des Algorithmus werden mehrere Unterprogramme definiert. Die beiden Funktionen kurz und lang haben die Aufgabe, den Calliope mini eine definierte Zeit pausieren zu lassen. Da der im Editor vorgesehene Befehl warten leider nicht die notwendige kurzen Pausen ermöglicht, habe ich die beiden Schleifen (enthalten lediglich die Erhöhung einer Platzhaltervariable um 1) genutzt, welche die Pausen von ca. 1000 μs (lang) und 400 μs (kurz) erzeugen. Die beiden Funktionen eins_ und null_ erzeugen an Pin 1 den jeweiligen Bit unter Nutzung der Unterprogramme für die Pulslänge. Die weiteren Funktionen enthalten die Bitfolge für den im Beispiel eingestellten Haus- und Gerätecode, die jeweiligen Codes für das An- oder Aus-Signal und die Synchronisierung.

Hauptprogramm

Das Hauptprogramm selbst beinhaltet eine unendliche Schleife. Bei Drücken der Taste A am Calliope mini, werden die Unterprogramme für Haus- und Gerätecode, das Anschalten und das Synchronisieren aufgerufen. Der Platzhalter wird zurückgesetzt, um ein Überlaufen der Variable zu verhindern. Bei Druck auf B wird an entsprechender Stelle das Unterprogramm für das Ausschalten aufgerufen.

Open Roberta Projekt Datei

Das kompilierte Programm als .hex-Datei ist unter folgendem Download-Link verfügbar. Nach dem Entpacken des Archivs kann die Datei einfach auf den Calliope kopiert werden und dann startet das Programm automatisch. Die Open Roberta Projektdatei ist ebenfalls als .xml im Archiv enthalten. Diese kann als Projekt in den Editor importiert werden.

Code

Quellcode NEPO

C/C++
Hier ist zur Info der Quellcode aus dem NEPO-Editor.
#define _GNU_SOURCE

#include "MicroBit.h"
#include "NEPODefs.h"
#include <list>
#include <array>
#include <stdlib.h>
MicroBit _uBit;
void lang();

void kurz();

void eins_();

void null_();

void hauscode();

void geraetecode();

void anschalten();

void ausschalten();

void sync();


double platzhalter;

int main()
{
    _uBit.init();
    platzhalter = 0;
    
    while ( true ) {
        if ( _uBit.buttonA.isPressed() ) {
            hauscode();
            geraetecode();
            anschalten();
            sync();
            platzhalter = 0;
        }
        if ( _uBit.buttonB.isPressed() ) {
            hauscode();
            geraetecode();
            ausschalten();
            sync();
            platzhalter = 0;
        }
        _uBit.sleep(_ITERATION_SLEEP_TIMEOUT);
    }
    release_fiber();
}

void lang() {
        for (int k0 = 0; k0 < 100; k0 += 1) {
            platzhalter += 1;
            _uBit.sleep(_ITERATION_SLEEP_TIMEOUT);
        }
}

void kurz() {
        for (int k1 = 0; k1 < 40; k1 += 1) {
            platzhalter += 1;
            _uBit.sleep(_ITERATION_SLEEP_TIMEOUT);
        }
}

void eins_() {
        _uBit.io.P0.setDigitalValue(1);
        kurz();
        _uBit.io.P0.setDigitalValue(0);
        lang();
        _uBit.io.P0.setDigitalValue(1);
        kurz();
        _uBit.io.P0.setDigitalValue(0);
        lang();
}

void null_() {
        _uBit.io.P0.setDigitalValue(1);
        kurz();
        _uBit.io.P0.setDigitalValue(0);
        lang();
        _uBit.io.P0.setDigitalValue(1);
        lang();
        _uBit.io.P0.setDigitalValue(0);
        kurz();
}

void hauscode() {
        eins_();
        null_();
        eins_();
        eins_();
        eins_();
}

void geraetecode() {
        eins_();
        null_();
        null_();
        null_();
        null_();
}

void anschalten() {
        eins_();
        null_();
}

void ausschalten() {
        null_();
        eins_();
}

void sync() {
        _uBit.io.P0.setDigitalValue(1);
        kurz();
        _uBit.io.P0.setDigitalValue(0);
        lang();
        _uBit.sleep(10);
}

Credits

irei

irei

2 projects • 0 followers

Comments