//
// Befehle/Daten -> Byte-Stream
//
// Es werden immer 9 Bits übertragen:
// - das erste Bit unterscheidet Befehl und Daten.
// - die folgenden 8 Bits kodieren den Befehl oder die Daten.
// Je nach Befehl können keine oder auch mehrere Daten-Bytes folgen.
//
// Vor dem 9-Bits befindet sich eine Sync-Phase.
//
// Zeiten für Sync und Flag/Daten sind fest vorgeben (BIT-Frequenz)
//
// _ _ _________________ _ _ _ _ _ _ _ _ _ ,-- HIGH-Value
// _X_X_/ \_X_X_X_X_X_X_X_X_X_ ,-- LOW-Value
// : : : : : : : : : : : :
// ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
// | | | | | | | | | | | |
// |--- SYNC ----| ^ F 0 1 2 3 4 5 6 7
// |\____________/ | ^ \_____________/
// | ^ | | ^
// ^ | | | |
// | | | | '- Bit im Byte (Bit-Nummer)
// | | | |
// | | | |
// | | | '- Flag (Befehl oder Daten)
// | | |
// | | '- Ende Sync-Zeit (HIGH->LOW-Flanke startet Bit-Frequenz)
// | |
// | '- Sync-Zeit Signal steht auf HIGH
// |
// '- Start der Messung (Wird durch Software initiiert)
//
// Zeitkonstanten
const int DELTA_T = 100; // ms (definiert Bit-Frequenz)
const int SYNC_T = 12 * DELTA_T; // ms (Sync-Zeit)
// Flag
const bool COMMAND = true;
const bool DATA = false;
// Befehle
const byte BUTTON = 1;
const byte TEMP = 2;
///////////////////////////////////////////////////////////
// input - output
const int SIGNALLED = 13; // Sende-LED-Pin
const int LED = 14; // Anzeige, das Taste gedrückt
const int LDR = A0; // Fotowiderstand
const int TEMPSENSOR = A1; // TEMP-Pin
///////////////////////////////////////////////////////////
// De- und Encoder
byte decodeTemp (uint8_t temp) { return temp; }
uint8_t encodeTemp (byte data) { return data; }
byte decodeButton (bool button) { return button?1:0; }
bool encodeButton (byte data) { return data != 0; }
///////////////////////////////////////////////////////////
// Input-Output-Routinen
uint8_t readTemp() { return 13; } // TODO
bool readButton() {return false; } // TODO
///////////////////////////////////////////////////////////
// sender
// Initialisierung des Senders
void setupSender() {
pinMode(SIGNALLED, OUTPUT);
writeSignal(LOW);
}
// Signal wird gesetzt
void writeSignal(uint8_t b) {
digitalWrite(SIGNALLED,b);
}
// Bit-Stream auf Signal ausgeben
// Sync-Signal, Flag und Byte erzeuen
void sendByte(bool command, byte data) {
// Sync senden
writeSignal(HIGH);
delay(SYNC_T);
writeSignal(LOW);
delay(DELTA_T);
// Flag senden
writeSignal(command?true:false);
delay(DELTA_T);
// Daten senden
for(int i=0; i<8; i++) {
writeSignal(bitRead(data,i));
delay(DELTA_T);
}
}
void sendButton() {
byte data = decodeTemp(readButton());
sendByte(COMMAND,BUTTON);
sendByte(DATA,data);
}
void sendTemp() {
byte data = decodeTemp(readTemp());
sendByte(COMMAND,TEMP);
sendByte(DATA,data);
}
void sender () {
sendButton();
sendTemp ();
}
///////////////////////////////////////////////////////////
// receiver
void setupReceiver() { // TODO
// Analog-Input automatisch definiert
}
void receiver () { // TODO
}
///////////////////////////////////////////////////////////
// Hauptprogramm (setup+loop)
void setup() {
Serial.begin(9600);
setupSender();
setupReceiver();
}
void loop() {
sender();
// reciever();
}