Ok dann beschreibe ich mal alles 
Ich habe eine Software auf dem Raspberry Pi. Dort habe ich ein Display angeschlossen auf dem 4 Buttons sind. Small Medium Large und STOP. Vom RPI wird ein Byte an den ESP geschickt. Der schickt es dann per i2c weiter an den STM.
Dort wo der Motor arbeitet gibt es 3 Taster. Wenn einer dieser Taster betätigt wird sollen alle Motoren stoppen.
Ich will jetzt wenn ich auf dem RPI auf S drück dass die Motoren 5 Sekunden lang runterfahren. Ich habe das auch schon mal hinbekommen. Der Motor läuft aber langsamer als sonst.
Ich poste mal den kompletten Code
#include <Wire_slave.h> //Bibliothek für I2C-Kommunikation
// Definition STM32 PINs
//Antrieb
#define IN1 PB9 //Steuerung Motor A
#define IN2 PB8 //Steuerung Motor A
#define IN3 PB10 //Steuerung Motor B
#define IN4 PB11 //Steuerung Motor B
#define abfuellTaster PA0 //Taster für Bediener (LOW auf HIGH)
#define sicherheitskreis PB0 //wird Sicherheitskreis unterbrochen, Antriebe abschalten! mehrere Anschlagtaster angeschlossen
#define freigabeTaster PA6 //nach Neustart drücken, damit Antriebe überhaupt laufen können
unsigned long pause_s = 5000;
unsigned long pause_m = 8000;
unsigned long pause_l = 24000;
unsigned long vergangeneZeit = 0;
unsigned long vergangeneZeit2 = 0;
unsigned long intervall = 2000;
unsigned long aktuelleZeit;
bool freigabe = false;
byte c;
void setup() {
Serial.begin(115200);
Wire.begin(8); // join i2c bus with address #4
Wire.onReceive(receiveEvent); // register event
pinMode(IN1, OUTPUT);
digitalWrite(IN1, LOW);
pinMode(IN2, OUTPUT);
digitalWrite(IN2, LOW);
pinMode(IN3, OUTPUT);
digitalWrite(IN3, LOW);
pinMode(IN4, OUTPUT);
digitalWrite(IN4, LOW);
pinMode(abfuellTaster, INPUT);
pinMode(sicherheitskreis, INPUT);
pinMode(freigabeTaster, INPUT);
attachInterrupt(sicherheitskreis, erkenneAnschlag, FALLING); // HIGH zu LOW
}
void loop() {
checkeFreigabe();
aktuelleZeit = millis();
if (freigabe == true) {
Wire.onReceive(receiveEvent);
empfangeProgramm();
starteAbfuellung();
}
}
void receiveEvent(int howMany) {
vergangeneZeit = aktuelleZeit;
while (Wire.available()) {
c = Wire.read();
Serial.println(c);
}
}
void checkeFreigabe() {
if (digitalRead(freigabeTaster) == HIGH && digitalRead(sicherheitskreis) == HIGH) {
freigabe = true;
}
}
void erkenneAnschlag() {
freigabe = false;
digitalWrite(IN1, LOW); //Schalte alle Motoren ab
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
void StempelRunterfahren() {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
Serial.println("FAHRERUNTER");
}
void StempelHochfahren() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
void StempelStopp() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
void starteAbfuellung() {
// abfuellTaster gedrückt
if (digitalRead(abfuellTaster) == HIGH && digitalRead(sicherheitskreis) == HIGH) {
StempelRunterfahren();;
}
// abfuellTaster wird losgelassen
else if (digitalRead(abfuellTaster) == LOW || digitalRead(sicherheitskreis) == LOW) {
StempelStopp();
//TODO: Drehe x Sekunden nach oben um den Stempel zu entlasten,
// danach muss der Stempel gestoppt werden
}
}
void empfangeProgramm() {
switch (c) {
case 1:
StempelRunterfahren();
if ((aktuelleZeit - vergangeneZeit) >= pause_s) {
StempelStopp();
c = 0;
break;
}
case 2:
StempelRunterfahren();
if ((aktuelleZeit - vergangeneZeit) >= pause_m) {
StempelStopp();
c = 0;
break;
}
}
}