Hallo Zusammen
Ich bastell mir gerade u.a. eine Weichensteuerung zusammen. Dabei gibt es einen Mega als Master, der Befehle per LAN empfängt und über I2C an Slave-NANOs weiterleitet. Das fuktioniert soweit. Knackpunkt ist die Ansteuerung der Weichen. Die brauchen je nach Richtung einen 12V-Impuls, entweder +/- für die eine und -/+ für die andere Richtung. Realisiert ist das über zwei Relais mit zwei Dioden. Auch das funktioniert, eigentlich! Um die Weiche nicht zu beschädigen und v.a. damit sie auch zuverlässig schalten kann, soll der genannte Impuls erstmal für 1 Sekunde anliegen. Soviel zum Soll.
Nun ist es aber so, dass das Delay in der Sub WeicheLinks() oder WeicheRechts() ignoriert wird. Selbst wenn ich da ein delay(10000) einbaue, ziehen die Relais nur für einen Sekundenbruchteil an.
Kann das evtl. am Event liegen, der die Sub aufruft? Im Loop funktioniert das Delay. Im Netz habe ich nichts dazu gefunden...
Das Board ist ein NANO-Klon. Den (das?) Sketch hab ich mal komplett hier rein gepackt, vielleicht liegt der Fehler ja doch irgendwo anders.
Danke
#include <Wire.h>
int pin_weiche1_L=2;
int pin_weiche1_R=3;
int LED = 13;
int x = 0;
int speed = 0;
int device;
int order;
int value;
#define WIRE Wire
// Motortreiber PINs
#define MEn1 10
#define MEn2 5
#define MIn11 9
#define MIn12 6
#define MIn21 7
#define MIn22 8
// Slave-Adresse
#define NODE_ADDRESS 2
// Länge Übertragung
#define PAYLOAD_SIZE 4
byte nodePayload[PAYLOAD_SIZE];
void setup() {
WIRE.begin();
Serial.begin(9600);
// PINs setzen
pinMode(MEn1, OUTPUT);
pinMode(MEn2, OUTPUT);
pinMode(MIn11, OUTPUT);
pinMode(MIn12, OUTPUT);
pinMode(MIn21, OUTPUT);
pinMode(MIn22, OUTPUT);
// pinMode (LED, OUTPUT);
Wire.begin(NODE_ADDRESS);
Wire.onReceive(receiveEvent); // erstelle ein Empfangen-Ereignis
Wire.onRequest(requestEvent); // erstelle ein Anfrage-Ereignis
pinMode(pin_weiche1_L, OUTPUT);
pinMode(pin_weiche1_R, OUTPUT);
digitalWrite(pin_weiche1_L, HIGH);
digitalWrite(pin_weiche1_R, HIGH);
Serial.println("Bereit...");
}
void loop() {
}
void WeicheLinks() {
digitalWrite(pin_weiche1_L, LOW);
digitalWrite(pin_weiche1_R, HIGH);
Serial.println("set");
delay(1000);
digitalWrite(pin_weiche1_L, HIGH);
digitalWrite(pin_weiche1_R, HIGH);
Serial.println("reset");
}
void WeicheRechts() {
digitalWrite(pin_weiche1_L, HIGH);
digitalWrite(pin_weiche1_R, LOW);
Serial.println("set");
delay(1000);
digitalWrite(pin_weiche1_L, HIGH);
digitalWrite(pin_weiche1_R, HIGH);
Serial.println("reset");
}
void receiveEvent(int bytes) {
device = Wire.read(); // lies die gesendeten Daten aus
order = Wire.read();
value = Wire.read();
Serial.println(bytes);
Serial.print("> ");
Serial.print(device);
Serial.print(" ");
Serial.print(order);
Serial.print(" ");
Serial.println(value);
if (device == 1){
if (order == 1) {
Serial.println("Weiche R");
WeicheRechts();
}
else if (order == 2) {
Serial.println("Weiche L");
WeicheLinks();
}
}
if (device == 2) {
setMotorSpeed2(order, value);
}
}
void requestEvent()
{
nodePayload[0] = NODE_ADDRESS;
nodePayload[1] = analogRead(A0) / 4;
Wire.write(nodePayload, PAYLOAD_SIZE);
}
void setMotorSpeed2(int order, int value)
{
int speed = (value - 65) * 10;
if (order == 0) {
digitalWrite(MIn21, HIGH);
digitalWrite(MIn22, HIGH);
int speed = 1;
}
else if (order == 1) {
digitalWrite(MIn21, LOW);
digitalWrite(MIn22, HIGH);
}
else if (order == 2) {
digitalWrite(MIn21, HIGH);
digitalWrite(MIn22, LOW);
}
if (speed==0) {
digitalWrite(MIn21, LOW);
digitalWrite(MIn22, LOW);
}
analogWrite(MEn2, speed);
Serial.println("Motor 2");
Serial.print(order);
Serial.print("->");
Serial.println(speed);
}