CDS1 Display Switch (Relais Schalten) Aurduino Mega

Guten Tag miteinander,

ich stehe am Ende meiner Abschlussarbeit, jedoch habe ich noch ein kleinen Problem. Ich habe hier einen Speziellen Display switch über RS232 an das Arduino erschlossen, es funktioniert alles einwandfrei. Jedoch habe ich ein Problem mit den Relaisansteuerungen (Arduino achtfach Relaiskarte) Die Status Led's leuchten Rot jedoch kann das Relais nicht geschaltet werden. Ich habe es noch versucht mit Thyristoren anzusteuern (I1-I8) jedoch schaltet das Relais auch hier nicht.

Ich hoffe jemand hat mir einen Tipp und könnte mir weiterhelfen.

Den Code finden Sie im Anhang.

Vielen Dank im Voraus!

Gruss Ueli

Arduino_RS232_UseCaseRotationMenu.V2.1.ino (25 KB)

ueliiff:
Ich hoffe jemand hat mir einen Tipp und könnte mir weiterhelfen.

Den Code finden Sie im Anhang.

Den Sketch bitte immer direkt im Forum in Code-Tags posten, damit den alle richtig lesen können, auch auf mobilen Geräten.
Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Dazu den Sketch markieren und die Schaltfläche klicken.

Die üblichen Relaismodule werden mit LOW geschaltet. Wir kennen deine Relais nicht.
Also einen Hyperlink posten.

Mit Tyristoren kannst Du keinen Gleichstrom schalten. Diese schalten nicht mehr aus. Mit Tyristoren kannst Du auch nicht so einfach Wechselstrom schalten.

Was hast Du genau gemacht??

Grüße Uwe

Hi

25kB Sketch - könnte sein, daß Du nicht ganz mit der Zeichenbegrenzung (9000 Zeichen pro Post) hin kommst - müsstest also eh aufteilen - sind wenigstens Kommentare im Sketch, daß man weiß, was Du hier und da eigentlich vorhast?

MfG

Vielen Dank für Ihre schnelle Reaktionen.

Der Code habe ich sauber und durchgehend kommentiert.

Ich möchte die Relais über die verschiedenen definierten Cases ansteuern.

// Relais mapping table
int RELAIS_13_PIN = 13;
int RELAIS_12_PIN = 12;
int RELAIS_11_PIN = 11;
int RELAIS_10_PIN = 10;
int RELAIS_9_PIN = 9;
int RELAIS_8_PIN = 8;
int RELAIS_7_PIN = 7;
int RELAIS_6_PIN = 6;

// Relais Status Signals
byte relaisStatus_13 = LOW;
byte relaisStatus_12 = LOW;
byte relaisStatus_11 = LOW;
byte relaisStatus_10 = LOW;
byte relaisStatus_9 = LOW;
byte relaisStatus_8 = LOW;
byte relaisStatus_7 = LOW;
byte relaisStatus_6 = LOW;

Setup:
// Initialise Relais status
digitalWrite (RELAIS_13_PIN, relaisStatus_13);
digitalWrite (RELAIS_12_PIN, relaisStatus_12);
digitalWrite (RELAIS_11_PIN, relaisStatus_11);
digitalWrite (RELAIS_10_PIN, relaisStatus_10);
digitalWrite (RELAIS_9_PIN, relaisStatus_9);
digitalWrite (RELAIS_8_PIN, relaisStatus_8);
digitalWrite (RELAIS_7_PIN, relaisStatus_7);
digitalWrite (RELAIS_6_PIN, relaisStatus_6);

Der Case wurde so aufgebaut:

case 0x00:
{
DEBUG_PRINTLN("--> R0A00_Musik_Play.png");
setLedRed();
flagLed = true;
unsigned long currentTime = millis();
ledOffTime = currentTime + LED_ON_TIME;
// Add Relais code here
if (relaisStatus_13 == LOW) {
relaisStatus_13 = HIGH;
digitalWrite(RELAIS_13_PIN, relaisStatus_13); }
else {
relaisStatus_13 = LOW;
digitalWrite (RELAIS_13_PIN, relaisStatus_13);}
break;
}

Die Ansteuerung über den Code funktioniert einwandfrei, der Output liefert auch wie vorgesehen 4-5V. Jedoch kann leider die Relaiskarte nicht korrekt angesteuert werden.

Die Status Leds zeigen den entsprechenden Status korrekt an. Jedoch schaltet das Relais nicht.

Natürliche wurde die Verdrahtung schon mehrere male kontrolliert, auch die Relaiskarte habe ich schon 3 mal ausgetauscht.

Sämtliche Relais werden direkt vom Arduino erschlossen. Jedoch ohne Erfolg. Eine Diode kann beim entsprechenden Abgangspin angebracht werden, die leuchtet auch. Doch die LED leuchtet nicht in Ihrer vollen stärke.

Was könnte ich noch machen? Kann es sein das ich die Abgänge mithilfe meines Codes nicht korrekt ansteuern kann?

Danke im Voraus!

Gruss Ueli

Code Teil 1

//=========================================================================//
// Arduino_RS232_UseCaseRotationMenu.ino                             c(1)  //
//-------------------------------------------------------------------------//                                              //
// TARGET HW      : Arduino Mega 2560                                      //
// DATE           : 11.04.2018                                             //
//=========================================================================//
//-------------------------------------------------------------------------//
// inclusion of header files                                         c(2)  //
//-------------------------------------------------------------------------//
// none                                                                    //
//-------------------------------------------------------------------------//
// declaration of ModuleScope macros                                 c(3)  //
//-------------------------------------------------------------------------//
// Enable Arduino Serial Monitor to use the debug printout
#define DEBUG

#ifdef DEBUG
 #define DEBUG_PRINT(x)         Serial.print (x)
 #define DEBUG_PRINTHEX(x)      Serial.print (x, HEX)
 #define DEBUG_PRINTLN(x)       Serial.println (x)
 #define DEBUG_PRINTLNHEX(x)    Serial.println (x, HEX)
#else
 #define DEBUG_PRINT(x)
 #define DEBUG_PRINTHEX(x)
 #define DEBUG_PRINTLN(x)
 #define DEBUG_PRINTLNHEX(x) 
#endif 

//-------------------------------------------------------------------------//
// declaration of ModuleScope data types                             c(4)  //
//-------------------------------------------------------------------------//
// none

//-------------------------------------------------------------------------//
// declaration of ModuleScope functions                              c(5)  //
//-------------------------------------------------------------------------//
// none

//-------------------------------------------------------------------------//
// definition of ProjectScope variables                              c(6)  //
//-------------------------------------------------------------------------//
unsigned long ledOffTime = 0;
unsigned long noInteractionTime = 0;
bool flagLed = false;
bool flagNoInteraction = false;
bool flagRestart = false;

//-------------------------------------------------------------------------//
// definition of ModuleScope variables                               c(7)  //
//-------------------------------------------------------------------------//
#define ID_TARGET               0x53
#define RS232_SPEED             115200
#define DELAY_TIME_TX_RX_MS     10
#define DELAY_TIME_TELEGRAM_MS  10

#define NO_TOUCH                0x00
#define SOFTKEY_CENTER_SHORT    0x01
#define SOFTKEY_CENTER_LONG     0x02
#define SOFTKEY_BOTTOM_SHORT    0x03
#define SOFTKEY_BOTTOM_LONG     0x04
#define SOFTKEY_LEFT_SHORT      0x05
#define SOFTKEY_LEFT_LONG       0x06
#define SOFTKEY_TOP_SHORT       0x07
#define SOFTKEY_TOP_LONG        0x08
#define SOFTKEY_RIGHT_SHORT     0x09
#define SOFTKEY_RIGHT_LONG      0x0A
#define SCROLL_INTERRUPT        0x0B
#define COMMUNICATION_ERROR     0xAA

// Time [ms] LED is active after touch input
#define LED_ON_TIME             2000

// Time [ms] Display shuts off after last touch input
#define NO_INTERACTION_TIME     10000

// CDS1 Interrupt: Pin 25 / PA2
int CDS1_INTERRUPT_PIN = 25;

// Relais mapping table
int RELAIS_13_PIN = 13;
int RELAIS_12_PIN = 12;
int RELAIS_11_PIN = 11;
int RELAIS_10_PIN = 10;
int RELAIS_9_PIN = 9;
int RELAIS_8_PIN = 8;
int RELAIS_7_PIN = 7;
int RELAIS_6_PIN = 6;

// Relais Status Signals
byte relaisStatus_13 = LOW;
byte relaisStatus_12 = LOW;
byte relaisStatus_11 = LOW;
byte relaisStatus_10 = LOW;
byte relaisStatus_9 = LOW;
byte relaisStatus_8 = LOW;
byte relaisStatus_7 = LOW;
byte relaisStatus_6 = LOW;

// CRC table
byte crcTable[256];
//-------------------------------------------------------------------------//
// definition of ProjectScope functions                              c(8)  //
//-------------------------------------------------------------------------//
byte CalculateCRC8(byte [], byte);
byte AppendChecksum(byte [], byte);

//-------------------------------------------------------------------------//
// definition of ModuleScope functions                               c(9)  //
//-------------------------------------------------------------------------//
void setup() 
{
  // Configure serial window
  Serial.begin(115200);  
  // Configure RS232 to CDS1
  Serial1.begin(115200); 
  // Configure MA_INT# Signal
  pinMode(CDS1_INTERRUPT_PIN, INPUT);
  // Initialise CRC Table
  CRC(0x07);  
  // Print interface specification
  Serial.println("*** Configuration  ***");
  Serial.println("Serial Interface: RS232");
  Serial.print("Bus Speed: ");
  Serial.print(RS232_SPEED);
  Serial.println(" Hz");
  Serial.print("Time between TX and RX: ");
  Serial.print(DELAY_TIME_TX_RX_MS);
  Serial.println("ms");    
  Serial.print("Time between Telegrams: ");
  Serial.println("not applicable"); 
  Serial.println("**********************");
  // Initialise Relais status
  digitalWrite (RELAIS_13_PIN, relaisStatus_13);
  digitalWrite (RELAIS_12_PIN, relaisStatus_12);
  digitalWrite (RELAIS_11_PIN, relaisStatus_11);
  digitalWrite (RELAIS_10_PIN, relaisStatus_10);
  digitalWrite (RELAIS_9_PIN, relaisStatus_9);
  digitalWrite (RELAIS_8_PIN, relaisStatus_8);
  digitalWrite (RELAIS_7_PIN, relaisStatus_7);
  digitalWrite (RELAIS_6_PIN, relaisStatus_6);   

}

void loop() 
{
  DEBUG_PRINTLN("Check CDS1 Status:");
  // *** Check if communication to CDS1 is possible ***
  if(readId() != ID_TARGET)
  {
    do
    {
      delay(1000);
    }
    while(readId() != ID_TARGET);
  }
  DEBUG_PRINTLN("CDS1 is ready to work");
  delay(DELAY_TIME_TELEGRAM_MS);
  enableAllFeatures();
  delay(DELAY_TIME_TELEGRAM_MS);
  readTouchRegisters();
  delay(DELAY_TIME_TELEGRAM_MS);
  Serial.println("*** Start Rotation Menu Function ***");
  byte fwVersion = readFwVersion();
  Serial.print("FW Version CDS1: ");
  Serial.print((fwVersion & 0xF0) >> 4);
  Serial.print(".");
  Serial.println(fwVersion & 0x0F);
  delay(DELAY_TIME_TELEGRAM_MS);
  setLedBlue();
  delay(DELAY_TIME_TELEGRAM_MS);
  setLedNoPattern();
  delay(DELAY_TIME_TELEGRAM_MS);
  showSchurterLogo();
  delay(DELAY_TIME_TELEGRAM_MS);
  setSwitchModeSinglePicture();
  delay(1000);

Leider ist es nicht möglich den Code in der Nachricht darzustellen.

Grund: es handelt sich um ca 800 Zeilen Code.

Ich kann nicht so viele Nachrichten hintereinander absetzten. <-- Spam Sperre

Gruss Ueli

Hier habe ich noch ein Video des Display Switch.

Damit auch die Funktionalität nachvollzogen werden kann.

Ich möchte mit jeder Rotation ein Relais Ansteuern.
Der stand der Rotation wird in verschiedenen Case festgehalten.

mach mal ein Bild von deiner Verkabelung + Relaiskarte inkl. eventueller Jumper auf der Relaiskarte.

Dann zu

if (relaisStatus_13 == LOW) {
relaisStatus_13 = HIGH;
digitalWrite(RELAIS_13_PIN, relaisStatus_13); }
else {
relaisStatus_13 = LOW;
digitalWrite (RELAIS_13_PIN, relaisStatus_13);}

hier scheint mir der digitalWrite ein Duplikat zu sein, und ich würde diesen erst nach dem If setzen:

if (relaisStatus_13 == LOW) {
relaisStatus_13 = HIGH;
 }
else {
relaisStatus_13 = LOW;
}
digitalWrite(RELAIS_13_PIN, relaisStatus_13);

wobei sich dann noch die Frage stellt wozu zu den relaisStatus_13 in einer separaten Variable führst.
Wenn du wissen willst, ob ein GPIO "Ausgang" High oder LOW ist, kannst du den ganz normal mit digitalRead abfragen, da braucht es keine extra Variable

Vielen Dank für deine Nachricht.

Der Status wird für den Display Switch verwenden (Status Led "Bestätigung"). <-- Hier handelt es sich um ein integriertes Led auf dem Display Switch.

Der Jumper wurde so gesetzt:

VCC to JD-VCC

Danke im Voraus!

... auch der display switch soll mit einem digitalRead genauso umgehen können wie mit einer Variable...

Kannst bitte ein hochauflösendes BILD (Foto) von deinem Aufbau machen.

Hast du in echt ganz sicher eine Relaiskarte für 5V?
Kannst du dein Breadboard mit sauberen ausreichenden externen 5V versorgen?

Ich habe einen Spannungsregler installiert (konstante 5V), zusätzlich habe ich mit Transistoren gearbeitet (falls die Spannung unter 5V wäre, diese Anschluss Möglichkeit habe ich immer für mein Raspberry Pi verwendet.)

jedoch funktioniert keine von den oben ernannten Möglichkeiten.

Nur die Status LED der Relais leuchtet ordnungsgemäß auf.

alter schwede, hast du gelesen dass auf den Relais SRD12VDC drauf steht. Das sind 12V Relais, klar dass die mit 5V nicht schalten!

das heißt jumper lösen und Platine mit 12V und 5V versorgen - und zwar jeweils an den richtigen PINs!

Was macht die weiße Platine? das sind nicht etwa Levelshifter???

Der Lieferant hat mir zugesichert das die Ansteuerung mit 5V Problemlose funktionieren.

Die Levelshiffer sind nur für die RS232 Anbindung, wie auch der Spannungsregler.

Ich Danke dir.

Ich suche nun einen neuen Spannungsversorger.

Und werde die Relais beim Jumper einspeissen.

... wo du die 12V einspeisen musst kann ich nicht genau sagen, ob es wirklich der Jumper ist müsstest du in Erfahrung bringen. Bei meinen 12V Karten mit Optokopler hab ich einen separat herausgeführten 12V in...

Hi

Mit dem Jumper wird die Logik-Spannung auf die Transistorseite der Opto-Koppler gebrückt - so kann man, bei den gemeinen 5V/5V-Karten die Last von der Logik trennen.
Bei Dir macht der Jumper nur etwas Sinn, wenn die Opto-Koppler 12V aushalten.

Sprich: Bei Ansteuerung mit 5V den Jumper weg und auf dem Stift, Der Dann KEINE SPANNUNG führt, werden die 12V für eingespeist, Welche durch die Opto-Koppler zu den Relais geschaltet werden.

MfG