Web based ATV Relay Control: Unterschied zwischen den Versionen

Aus DL8RDS Wiki
Wechseln zu: Navigation, Suche
(Arduino Code)
Zeile 24: Zeile 24:
  
 
<pre>
 
<pre>
#include "CommandLine.h"
 
 
#include <Wire.h>
 
#include <Wire.h>
 +
#include <Cmd.h>
 +
 +
// GPIOs fuer die entsprechenden Signale
 +
const int Bit2 = 50;
 +
const int Bit1 = 51;
 +
const int Bit4 = 52;
 +
const int Bit8 = 53;
 +
const int signaldauer = 500;
 +
  
 
#define SensorAdresse 0x48 // Basisadresse für ersten Temperatursensor
 
#define SensorAdresse 0x48 // Basisadresse für ersten Temperatursensor
Zeile 71: Zeile 79:
  
  
// Keep track of the count, for the count command.
 
int count = 0;
 
 
// CommandLine instance.
 
CommandLine commandLine(Serial, "> ");
 
 
// Commands are simple structures that can be.
 
Command set    = Command("set", &handleSet);
 
Command temp    = Command("temp", &handleTemp);
 
Command state  = Command("state", &handleState);
 
 
/**
 
* Setup serial port and add commands.
 
*/
 
 
void setup()
 
void setup()
 
{
 
{
   Wire.begin();       // join i2c bus (address optional for master)
+
   Wire.begin();  
   Serial.begin(9600);
+
  pinMode(Bit1, INPUT);
 +
  pinMode(Bit2, INPUT);
 +
  pinMode(Bit4, INPUT);
 +
  pinMode(Bit8, INPUT);
 +
 
 +
  // init the command line and set it for a speed of 57600
 +
  cmdInit(9600);
 +
    
 +
  // add the commands to the command table. These functions must
 +
  // already exist in the sketch. See the functions below.
 +
  // The functions need to have the format:
 +
  //
 +
  // void func_name(int arg_cnt, char **args)
 +
  //
 +
  // arg_cnt is the number of arguments typed into the command line
 +
  // args is a list of argument strings that were typed into the command line
 +
  cmdAdd("help",  handleHelp);
 +
  cmdAdd("temp",  handleTemp);
 +
  cmdAdd("state",  handleState);
 +
  cmdAdd("T1",    handleT1);
 +
  cmdAdd("T2",    handleT2);
 +
  cmdAdd("T3",    handleT3);
 +
  cmdAdd("T4",    handleT4);
 +
  cmdAdd("T5",    handleT5);
 +
  cmdAdd("T6",    handleT6);
 +
  cmdAdd("T7",    handleT7);
 +
  cmdAdd("T8",    handleT8);
 +
  cmdAdd("T9",    handleT9);
 +
  cmdAdd("T0",    handleT0);
 +
  cmdAdd("TA",    handleTA);
 +
  cmdAdd("TB",    handleTB);
 +
  cmdAdd("TC",    handleTC);
 +
  cmdAdd("T*",    handleTStern);
 +
  cmdAdd("T#",    handleTHash);
  
  // Pre-defined commands
 
  commandLine.add(set);
 
  commandLine.add(temp);
 
  commandLine.add(state);
 
 
  // On-the-fly commands -- instance is allocated dynamically
 
  commandLine.add("help", handleHelp);
 
 
}
 
}
  
/**
 
* Read-eval-print-loop.
 
*/
 
 
void loop()
 
void loop()
 
{
 
{
   commandLine.update();
+
   cmdPoll();
 
}
 
}
  
/**
 
* Handle the count command. The command has one additional argument that can be the integer to set the count to.
 
*
 
* @param tokens The rest of the input command.
 
*/
 
void handleSet(char* tokens)
 
{
 
  char* token = strtok(NULL, " ");
 
 
  if (token != NULL) {
 
    count = atoi(token);
 
  } else {
 
    count++;
 
  }
 
  
  Serial.println(count);
 
}
 
  
/**
+
void handleTemp(int arg_cnt, char **args)
* Handle the temp command. The command has no argument.
 
*
 
* @param tokens The rest of the input command.
 
*/
 
void handleTemp(char* tokens)
 
 
{
 
{
 
   char dataString[7]; // gelesene Temperatur als String aufbereitet: (-xx)x.x
 
   char dataString[7]; // gelesene Temperatur als String aufbereitet: (-xx)x.x
Zeile 142: Zeile 138:
 
}
 
}
  
/**
+
void handleState(int arg_cnt, char **args)
* Handle the temp command. The command has no argument.
 
*
 
* @param tokens The rest of the input command.
 
*/
 
void handleState(char* tokens)
 
 
{
 
{
  char* token = strtok(NULL, " ");
 
 
   char* relstate = "inaktiv";
 
   char* relstate = "inaktiv";
  if (token != NULL) {
 
    // retrieve relay status
 
  }
 
  
 +
 
 
   Serial.print("Status: ");
 
   Serial.print("Status: ");
 
   Serial.println(relstate);
 
   Serial.println(relstate);
 
}
 
}
  
/**
+
void handleHelp(int arg_cnt, char **args)
* Print some help.
 
*
 
* @param tokens The rest of the input command.
 
*/
 
void handleHelp(char* tokens)
 
 
{
 
{
   Serial.println("Available commands: 'help', 'set', 'temp', 'state'.");
+
   Serial.println("Available commands: 'help', 'temp', 'state', 'Tx' mit x in (1234567890ABC*#).");
 +
}
 +
 
 +
void handleT1(int arg_cnt, char **args)
 +
 +
  digitalWrite(Bit1, HIGH);
 +
  digitalWrite(Bit2, LOW);
 +
  digitalWrite(Bit4, LOW);
 +
  digitalWrite(Bit8, LOW);
 +
 
 +
  delay(signaldauer);
 +
 
 +
  digitalWrite(Bit1, LOW);
 +
  digitalWrite(Bit2, LOW);
 +
  digitalWrite(Bit4, LOW);
 +
  digitalWrite(Bit8, LOW);
 +
 
 +
  Serial.println("Sent: 0001 (T1)");
 +
}
 +
 
 +
void handleT2(int arg_cnt, char **args)
 +
 +
  digitalWrite(Bit1, LOW);
 +
  digitalWrite(Bit2, HIGH);
 +
  digitalWrite(Bit4, LOW);
 +
  digitalWrite(Bit8, LOW);
 +
 
 +
  delay(signaldauer);
 +
 
 +
  digitalWrite(Bit1, LOW);
 +
  digitalWrite(Bit2, LOW);
 +
  digitalWrite(Bit4, LOW);
 +
  digitalWrite(Bit8, LOW);
 +
 
 +
  Serial.println("Sent: 0010 (T2)");
 +
}
 +
 
 +
void handleT3(int arg_cnt, char **args)
 +
 +
  digitalWrite(Bit1, HIGH);
 +
  digitalWrite(Bit2, HIGH);
 +
  digitalWrite(Bit4, LOW);
 +
  digitalWrite(Bit8, LOW);
 +
 
 +
  delay(signaldauer);
 +
 
 +
  digitalWrite(Bit1, LOW);
 +
  digitalWrite(Bit2, LOW);
 +
  digitalWrite(Bit4, LOW);
 +
  digitalWrite(Bit8, LOW);
 +
 
 +
  Serial.println("Sent: 0011 (T3)");
 +
}
 +
 
 +
void handleT4(int arg_cnt, char **args)
 +
 +
  digitalWrite(Bit1, LOW);
 +
  digitalWrite(Bit2, LOW);
 +
  digitalWrite(Bit4, HIGH);
 +
  digitalWrite(Bit8, LOW);
 +
 
 +
  delay(signaldauer);
 +
 
 +
  digitalWrite(Bit1, LOW);
 +
  digitalWrite(Bit2, LOW);
 +
  digitalWrite(Bit4, LOW);
 +
  digitalWrite(Bit8, LOW);
 +
 
 +
  Serial.println("Sent: 0100 (T4)");
 +
}
 +
 
 +
void handleT5(int arg_cnt, char **args)
 +
 +
  digitalWrite(Bit1, HIGH);
 +
  digitalWrite(Bit2, LOW);
 +
  digitalWrite(Bit4, HIGH);
 +
  digitalWrite(Bit8, LOW);
 +
 
 +
  delay(signaldauer);
 +
 
 +
  digitalWrite(Bit1, LOW);
 +
  digitalWrite(Bit2, LOW);
 +
  digitalWrite(Bit4, LOW);
 +
  digitalWrite(Bit8, LOW);
 +
 
 +
  Serial.println("Sent: 0101 (T5)");
 +
}
 +
 
 +
void handleT6(int arg_cnt, char **args)
 +
 +
  digitalWrite(Bit1, LOW);
 +
  digitalWrite(Bit2, HIGH);
 +
  digitalWrite(Bit4, HIGH);
 +
  digitalWrite(Bit8, LOW);
 +
 
 +
  delay(signaldauer);
 +
 
 +
  digitalWrite(Bit1, LOW);
 +
  digitalWrite(Bit2, LOW);
 +
  digitalWrite(Bit4, LOW);
 +
  digitalWrite(Bit8, LOW);
 +
 
 +
  Serial.println("Sent: 0110 (T6)");
 +
}
 +
 
 +
void handleT7(int arg_cnt, char **args)
 +
 +
  digitalWrite(Bit1, LOW);
 +
  digitalWrite(Bit2, HIGH);
 +
  digitalWrite(Bit4, HIGH);
 +
  digitalWrite(Bit8, HIGH);
 +
 
 +
  delay(signaldauer);
 +
 
 +
  digitalWrite(Bit1, LOW);
 +
  digitalWrite(Bit2, LOW);
 +
  digitalWrite(Bit4, LOW);
 +
  digitalWrite(Bit8, LOW);
 +
 
 +
  Serial.println("Sent: 0111 (T7)");
 +
}
 +
 
 +
void handleT8(int arg_cnt, char **args)
 +
 +
  digitalWrite(Bit1, LOW);
 +
  digitalWrite(Bit2, LOW);
 +
  digitalWrite(Bit4, LOW);
 +
  digitalWrite(Bit8, HIGH);
 +
 
 +
  delay(signaldauer);
 +
 
 +
  digitalWrite(Bit1, LOW);
 +
  digitalWrite(Bit2, LOW);
 +
  digitalWrite(Bit4, LOW);
 +
  digitalWrite(Bit8, LOW);
 +
 
 +
  Serial.println("Sent: 1000 (T8)");
 
}
 
}
 +
 +
void handleT9(int arg_cnt, char **args)
 +
 +
  digitalWrite(Bit1, HIGH);
 +
  digitalWrite(Bit2, LOW);
 +
  digitalWrite(Bit4, LOW);
 +
  digitalWrite(Bit8, HIGH);
 +
 
 +
  delay(signaldauer);
 +
 
 +
  digitalWrite(Bit1, LOW);
 +
  digitalWrite(Bit2, LOW);
 +
  digitalWrite(Bit4, LOW);
 +
  digitalWrite(Bit8, LOW);
 +
 +
  Serial.println("Sent: 1001 (T9)");
 +
}
 +
 +
void handleT0(int arg_cnt, char **args)
 +
 +
  digitalWrite(Bit1, LOW);
 +
  digitalWrite(Bit2, HIGH);
 +
  digitalWrite(Bit4, LOW);
 +
  digitalWrite(Bit8, HIGH);
 +
 +
  delay(signaldauer);
 +
 
 +
  digitalWrite(Bit1, LOW);
 +
  digitalWrite(Bit2, LOW);
 +
  digitalWrite(Bit4, LOW);
 +
  digitalWrite(Bit8, LOW);
 +
 +
  Serial.println("Sent: 1010 (T0)");
 +
}
 +
 +
void handleTA(int arg_cnt, char **args)
 +
 +
  digitalWrite(Bit1, HIGH);
 +
  digitalWrite(Bit2, HIGH);
 +
  digitalWrite(Bit4, LOW);
 +
  digitalWrite(Bit8, HIGH);
 +
 +
  delay(signaldauer);
 +
 
 +
  digitalWrite(Bit1, LOW);
 +
  digitalWrite(Bit2, LOW);
 +
  digitalWrite(Bit4, LOW);
 +
  digitalWrite(Bit8, LOW);
 +
 +
  Serial.println("Sent: 1011 (TA)");
 +
}
 +
 +
void handleTB(int arg_cnt, char **args)
 +
 +
  digitalWrite(Bit1, LOW);
 +
  digitalWrite(Bit2, LOW);
 +
  digitalWrite(Bit4, HIGH);
 +
  digitalWrite(Bit8, HIGH);
 +
 +
  delay(signaldauer);
 +
 
 +
  digitalWrite(Bit1, LOW);
 +
  digitalWrite(Bit2, LOW);
 +
  digitalWrite(Bit4, LOW);
 +
  digitalWrite(Bit8, LOW);
 +
 +
  Serial.println("Sent: 1100 (TB)");
 +
}
 +
 +
void handleTC(int arg_cnt, char **args)
 +
 +
  digitalWrite(Bit1, HIGH);
 +
  digitalWrite(Bit2, LOW);
 +
  digitalWrite(Bit4, HIGH);
 +
  digitalWrite(Bit8, HIGH);
 +
 +
  delay(signaldauer);
 +
 
 +
  digitalWrite(Bit1, LOW);
 +
  digitalWrite(Bit2, LOW);
 +
  digitalWrite(Bit4, LOW);
 +
  digitalWrite(Bit8, LOW);
 +
 
 +
  Serial.println("Sent: 1101 (TC)");
 +
}
 +
 +
void handleTStern(int arg_cnt, char **args)
 +
 +
  digitalWrite(Bit1, HIGH);
 +
  digitalWrite(Bit2, HIGH);
 +
  digitalWrite(Bit4, HIGH);
 +
  digitalWrite(Bit8, HIGH);
 +
 
 +
  delay(signaldauer);
 +
 
 +
  digitalWrite(Bit1, LOW);
 +
  digitalWrite(Bit2, LOW);
 +
  digitalWrite(Bit4, LOW);
 +
  digitalWrite(Bit8, LOW);
 +
 +
  Serial.println("Sent: 1111 (T*)");
 +
}
 +
 +
void handleTHash(int arg_cnt, char **args)
 +
 +
  digitalWrite(Bit1, LOW);
 +
  digitalWrite(Bit2, HIGH);
 +
  digitalWrite(Bit4, HIGH);
 +
  digitalWrite(Bit8, HIGH);
 +
 +
  delay(signaldauer);
 +
 +
  digitalWrite(Bit1, LOW);
 +
  digitalWrite(Bit2, LOW);
 +
  digitalWrite(Bit4, LOW);
 +
  digitalWrite(Bit8, LOW);
 +
 +
  Serial.println("Sent: 1110 (T#)");
 +
}
 +
 
</pre>
 
</pre>
  

Version vom 5. Januar 2018, 16:14 Uhr

1 Scope

Out ATV relay DB0MHB is a microcontroller based system that can be controlled through DTMF tones, but is still lacking HAMNET support even though we have HAMNET connectivity at our location.

In order to control it through a web page, we decided to upgrade it with pinouts from the DTMF panel. These pinouts will be translated in an ARDUINO Mega 1280 which has a sufficient number of GPIOs, and the Arduino is supposed to provide a serial interface to the relay.

The serial interface will be controlled again through a Raspberry Pi that does all the rest.

The most remarkable feature is a shell like interface that allows to invoke commands and provides a history function.

We decided to implement the relay logic in the Raspberry and use the Arduino only as a GPIO swithing interface module, since relay functions are subject to change, and these changes are easier to modify than controller code.

The Arduino board also has a LM75 I2C temperature sensor mounted, so it seemed reasonable to support a query function.

2 Useful Links

3 Arduino Code

NOTE: This is not ready yet. The below code just serves as a memory backup :-)

#include <Wire.h>
#include <Cmd.h>

// GPIOs fuer die entsprechenden Signale
const int Bit2 = 50;
const int Bit1 = 51;
const int Bit4 = 52;
const int Bit8 = 53;
const int signaldauer = 500;


#define SensorAdresse 0x48 // Basisadresse für ersten Temperatursensor
// Registerparameter fuer get_LM75_temperature
#define TEMP 0  // Temperaturregister anwählen

// LM75 Configuration Register Registeradresse: 1
// Bit 0: Stromsparmodus, bei 1 geht Temperatursensor in den Stromsparmodus (keine Messung, aber aktive Steuerung) Ausgang wird auch abgeschaltet
//                        bei 0 geht Temperatursensor aus dem Stromsparmodus (Messung) Ausgang wird wieder freigegeben  
// Bit 1: Interrupt Modus, bei 1 schaltet der Ausgang sowohl bei oberen als auch unteren Schwellwert ein, wird zurückgesetzt durch Auslesen des Registers
//                         bei 0 schaltet der Ausgang bei oberen Schaltpunkt ein und bei unteren aus (default 80°C / 75°C)
// Bit 2: OS-Pin bei 1 wird das Verhalten des Ausgangs invertiert, Ausgang ist eingeschalten innerhalb der Schwellwerte
//               bei 0 Ausgang schaltet bei Überschreiten der eingestellten Schwellwerte
// Bit 3 und 4: Wert 0-3, besagt wieviele Messzyklen abgewartet wird, bis Ausgang aktiv/inaktiv wird, wenn die Bedingung erfüllt ist (verhindert Flattern des Ausgangs)
// Bit 5-7 müssen 0 sein
// Byte: 7 6 5 4 3 2 1 0

// LM75 Temperatur auslesen. Device = 0-7, regx = TEMP, OBEN, UNTEN (Registerauswahl)  
double get_LM75_temperature(int device, int regx)
{
  int8_t msb;
  int8_t lsb;
  int8_t msb1;
  Wire.beginTransmission(SensorAdresse + device);
  Wire.write(regx);
  Wire.endTransmission();
  Wire.beginTransmission(SensorAdresse + device);
  Wire.requestFrom(SensorAdresse + device, 2);
  if (Wire.available()) {
     msb1 = Wire.read();
     msb = msb1 << 1; // Vorzeichenbit entfernen, verbliebener Wert ist nun doppelt so groß
     lsb = Wire.read();
  }
  // höchstes bit von lsb sagt aus, ob 0,5 Grad dazu addiert werden sollen
  lsb = (lsb & 0x80 ) >> 7; // nun ist lsb = 0 oder 1
  Wire.endTransmission();
  if (msb1 < 0x80) { // Positiver Wert?
    return double(msb + lsb)/2; // positiver Wert
  }  
  else {
    return double(msb + lsb)/2 - 128; // negativer Wert
  }  
}



void setup()
{
  Wire.begin(); 
  pinMode(Bit1, INPUT);
  pinMode(Bit2, INPUT);
  pinMode(Bit4, INPUT);
  pinMode(Bit8, INPUT);
  
  // init the command line and set it for a speed of 57600
  cmdInit(9600);
  
  // add the commands to the command table. These functions must
  // already exist in the sketch. See the functions below. 
  // The functions need to have the format:
  //
  // void func_name(int arg_cnt, char **args)
  //
  // arg_cnt is the number of arguments typed into the command line
  // args is a list of argument strings that were typed into the command line
  cmdAdd("help",   handleHelp);
  cmdAdd("temp",   handleTemp);
  cmdAdd("state",  handleState);
  cmdAdd("T1",     handleT1);
  cmdAdd("T2",     handleT2);
  cmdAdd("T3",     handleT3);
  cmdAdd("T4",     handleT4);
  cmdAdd("T5",     handleT5);
  cmdAdd("T6",     handleT6);
  cmdAdd("T7",     handleT7);
  cmdAdd("T8",     handleT8);
  cmdAdd("T9",     handleT9);
  cmdAdd("T0",     handleT0);
  cmdAdd("TA",     handleTA);
  cmdAdd("TB",     handleTB);
  cmdAdd("TC",     handleTC);
  cmdAdd("T*",     handleTStern);
  cmdAdd("T#",     handleTHash);

}

void loop()
{
  cmdPoll();
}



void handleTemp(int arg_cnt, char **args)
{
  char dataString[7]; // gelesene Temperatur als String aufbereitet: (-xx)x.x
  double temp; // gelesene Temperatur als double
  
  temp = get_LM75_temperature(0, TEMP); //(Device)Wert vom 1. Temperatursensor lesen (0-7, je nach Jumperstellung am Board, 2. Parameter wie oben definiert)
  dtostrf(temp, 4, 1, dataString); //dtostrf(floatVar, minStringWidthIncDecimalPoint, numVarsAfterDecimal, charBuf); (standard avr-libc function)

  Serial.print("Temp: ");
  Serial.println(dataString);
}

void handleState(int arg_cnt, char **args)
{
  char* relstate = "inaktiv";

  
  Serial.print("Status: ");
  Serial.println(relstate);
}

void handleHelp(int arg_cnt, char **args)
{
  Serial.println("Available commands: 'help', 'temp', 'state', 'Tx' mit x in (1234567890ABC*#).");
}

void handleT1(int arg_cnt, char **args)
{  
  digitalWrite(Bit1, HIGH);
  digitalWrite(Bit2, LOW);
  digitalWrite(Bit4, LOW);
  digitalWrite(Bit8, LOW);

  delay(signaldauer);
  
  digitalWrite(Bit1, LOW);
  digitalWrite(Bit2, LOW);
  digitalWrite(Bit4, LOW);
  digitalWrite(Bit8, LOW);

  Serial.println("Sent: 0001 (T1)");
}

void handleT2(int arg_cnt, char **args)
{  
  digitalWrite(Bit1, LOW);
  digitalWrite(Bit2, HIGH);
  digitalWrite(Bit4, LOW);
  digitalWrite(Bit8, LOW);

  delay(signaldauer);
  
  digitalWrite(Bit1, LOW);
  digitalWrite(Bit2, LOW);
  digitalWrite(Bit4, LOW);
  digitalWrite(Bit8, LOW);

  Serial.println("Sent: 0010 (T2)");
}

void handleT3(int arg_cnt, char **args)
{  
  digitalWrite(Bit1, HIGH);
  digitalWrite(Bit2, HIGH);
  digitalWrite(Bit4, LOW);
  digitalWrite(Bit8, LOW);

  delay(signaldauer);
  
  digitalWrite(Bit1, LOW);
  digitalWrite(Bit2, LOW);
  digitalWrite(Bit4, LOW);
  digitalWrite(Bit8, LOW);

  Serial.println("Sent: 0011 (T3)");
}

void handleT4(int arg_cnt, char **args)
{  
  digitalWrite(Bit1, LOW);
  digitalWrite(Bit2, LOW);
  digitalWrite(Bit4, HIGH);
  digitalWrite(Bit8, LOW);

  delay(signaldauer);
  
  digitalWrite(Bit1, LOW);
  digitalWrite(Bit2, LOW);
  digitalWrite(Bit4, LOW);
  digitalWrite(Bit8, LOW);

  Serial.println("Sent: 0100 (T4)");
}

void handleT5(int arg_cnt, char **args)
{  
  digitalWrite(Bit1, HIGH);
  digitalWrite(Bit2, LOW);
  digitalWrite(Bit4, HIGH);
  digitalWrite(Bit8, LOW);

  delay(signaldauer);
  
  digitalWrite(Bit1, LOW);
  digitalWrite(Bit2, LOW);
  digitalWrite(Bit4, LOW);
  digitalWrite(Bit8, LOW);

  Serial.println("Sent: 0101 (T5)");
}

void handleT6(int arg_cnt, char **args)
{  
  digitalWrite(Bit1, LOW);
  digitalWrite(Bit2, HIGH);
  digitalWrite(Bit4, HIGH);
  digitalWrite(Bit8, LOW);

  delay(signaldauer);
  
  digitalWrite(Bit1, LOW);
  digitalWrite(Bit2, LOW);
  digitalWrite(Bit4, LOW);
  digitalWrite(Bit8, LOW);

  Serial.println("Sent: 0110 (T6)");
}

void handleT7(int arg_cnt, char **args)
{  
  digitalWrite(Bit1, LOW);
  digitalWrite(Bit2, HIGH);
  digitalWrite(Bit4, HIGH);
  digitalWrite(Bit8, HIGH);

  delay(signaldauer);
  
  digitalWrite(Bit1, LOW);
  digitalWrite(Bit2, LOW);
  digitalWrite(Bit4, LOW);
  digitalWrite(Bit8, LOW);

  Serial.println("Sent: 0111 (T7)");
}

void handleT8(int arg_cnt, char **args)
{  
  digitalWrite(Bit1, LOW);
  digitalWrite(Bit2, LOW);
  digitalWrite(Bit4, LOW);
  digitalWrite(Bit8, HIGH);

  delay(signaldauer);
  
  digitalWrite(Bit1, LOW);
  digitalWrite(Bit2, LOW);
  digitalWrite(Bit4, LOW);
  digitalWrite(Bit8, LOW);

  Serial.println("Sent: 1000 (T8)");
}

void handleT9(int arg_cnt, char **args)
{  
  digitalWrite(Bit1, HIGH);
  digitalWrite(Bit2, LOW);
  digitalWrite(Bit4, LOW);
  digitalWrite(Bit8, HIGH);
  
  delay(signaldauer);
  
  digitalWrite(Bit1, LOW);
  digitalWrite(Bit2, LOW);
  digitalWrite(Bit4, LOW);
  digitalWrite(Bit8, LOW);

  Serial.println("Sent: 1001 (T9)");
}

void handleT0(int arg_cnt, char **args)
{  
  digitalWrite(Bit1, LOW);
  digitalWrite(Bit2, HIGH);
  digitalWrite(Bit4, LOW);
  digitalWrite(Bit8, HIGH);

  delay(signaldauer);
  
  digitalWrite(Bit1, LOW);
  digitalWrite(Bit2, LOW);
  digitalWrite(Bit4, LOW);
  digitalWrite(Bit8, LOW);

  Serial.println("Sent: 1010 (T0)");
}

void handleTA(int arg_cnt, char **args)
{  
  digitalWrite(Bit1, HIGH);
  digitalWrite(Bit2, HIGH);
  digitalWrite(Bit4, LOW);
  digitalWrite(Bit8, HIGH);

  delay(signaldauer);
  
  digitalWrite(Bit1, LOW);
  digitalWrite(Bit2, LOW);
  digitalWrite(Bit4, LOW);
  digitalWrite(Bit8, LOW);

  Serial.println("Sent: 1011 (TA)");
}

void handleTB(int arg_cnt, char **args)
{  
  digitalWrite(Bit1, LOW);
  digitalWrite(Bit2, LOW);
  digitalWrite(Bit4, HIGH);
  digitalWrite(Bit8, HIGH);

  delay(signaldauer);
  
  digitalWrite(Bit1, LOW);
  digitalWrite(Bit2, LOW);
  digitalWrite(Bit4, LOW);
  digitalWrite(Bit8, LOW);

  Serial.println("Sent: 1100 (TB)");
}

void handleTC(int arg_cnt, char **args)
{  
  digitalWrite(Bit1, HIGH);
  digitalWrite(Bit2, LOW);
  digitalWrite(Bit4, HIGH);
  digitalWrite(Bit8, HIGH);

  delay(signaldauer);
  
  digitalWrite(Bit1, LOW);
  digitalWrite(Bit2, LOW);
  digitalWrite(Bit4, LOW);
  digitalWrite(Bit8, LOW);
  
  Serial.println("Sent: 1101 (TC)");
}

void handleTStern(int arg_cnt, char **args)
{  
  digitalWrite(Bit1, HIGH);
  digitalWrite(Bit2, HIGH);
  digitalWrite(Bit4, HIGH);
  digitalWrite(Bit8, HIGH);
  
  delay(signaldauer);
  
  digitalWrite(Bit1, LOW);
  digitalWrite(Bit2, LOW);
  digitalWrite(Bit4, LOW);
  digitalWrite(Bit8, LOW);

  Serial.println("Sent: 1111 (T*)");
}

void handleTHash(int arg_cnt, char **args)
{  
  digitalWrite(Bit1, LOW);
  digitalWrite(Bit2, HIGH);
  digitalWrite(Bit4, HIGH);
  digitalWrite(Bit8, HIGH);

  delay(signaldauer);

  digitalWrite(Bit1, LOW);
  digitalWrite(Bit2, LOW);
  digitalWrite(Bit4, LOW);
  digitalWrite(Bit8, LOW);

  Serial.println("Sent: 1110 (T#)");
}

4 Raspberry Pi Code

5 Pictures

TBD