Danke dir durch dich habe ich es jetzt fast Geschäft ![]()
habe jetzt es hin bekommen das Config auszulesen und dann die Zahlen auch richtig auszulesen und in das Array zu schreiben ![]()
ich kann es auch Resetten
das ist alles schon mal sehr gut,
ich lasse mir auch immer eine Kontrolle Zeile nach dem Empfang zusenden, so kann ich das dann auch Prüfen ob alles Richtig eingegeben wurde oder nicht.
jetzt habe ich nur ein Problem mein Prog hängt sich glaube ich auf
denn nachdem ich die taste gedrückt habe kann ich nichts mehr machen, ich finde nur den Fehler nicht,
vielleicht könnt da mal jemand drüber schauen und mir sagen wo der Wurm drin ist.
das ist der Code:
/*
Befehl Reagzion Antwort
Name: Ausgabe Programm Name
Firmware: Ausgabe Firmware Nr.
Reset: Sätzt das Array Hadware Reset
Hadware wider auf
0
Print: Ausgabe der hadware
Config in einer Tabelle
Config:1,10,30,0 sätzt die Hadware Zahlenfolge
Configuration neu ...
*/
#define ZEILENTRENNZEICHEN 13 // 13 ist Steuerzeichen CR (Carriage Return)
// Config Daten
char Firmware_Nr[] = "1.0.1"; // Firmware
char Name[] = "Tropfen Box"; // Programmmane
int startPin = 2; // Hier ist der taster angeschloßen
int Baudrate = 9600; // Baudrate für die Übertragung zwischen Arduino und PC
int Lauf = 0; // Zwischenspeicher
unsigned long gesamtDauer = 0;
unsigned long starttime;
unsigned long looptime;
struct hardware_t{int pin;long vorlaufzeit; long dauer;}; // Hadware Strucktur
// Test Hadware Arrey füllen
hardware_t hardware[5]=
{
{3, 10, 30},
{4, 50, 30},
};
int schritte = sizeof(hardware) / sizeof(hardware[0]); // Anzahl der Hadware Schritte definiren
// Das ist eine Funktion !!!
char* receiveBuffer()
{
static char lineBuffer[100]; // Maximale Zeilenlänge festlegen
static byte counter=0;
char c;
if (Serial.available()==0) return NULL; // Nullpointer zurück
if (counter==0) memset(lineBuffer,0,sizeof(lineBuffer)); // Puffer vor Benutzung löschen
c=Serial.read(); // Aktueller Pufer in c Speichern
if (c==ZEILENTRENNZEICHEN) // wenn c gleich ZEILENTRENNZEICHEN dann aufführen
{
counter=0; // Zähler zurücksätzen damit neue Zeilen empfangen werden kann
return lineBuffer; // Volständige Zeile zurückgeben
}
else if (c>=32) // kein Steuerzeichen! (23 = Ascii zeichen !)
{
lineBuffer[counter]=c; // Zeichen im Zeilenpuffer einfügen
if (counter<sizeof(lineBuffer)-2) counter++;
}
return NULL;
}
// Das ist eine Funktion !!!
void setup()
{
Serial.begin(Baudrate); // Serielenport Starten
pinMode(startPin, INPUT); // startPin auf INPUT setzen (Taster)
}
void loop()
{
char* text=receiveBuffer(); // Alles aus der Serielenschnitstelle Lesen
if(text != NULL)
{
if (strcmp(text,"Name:")==0) // Befehl prüfen "Name:"
{Serial.println(Name);} // Ausgabe
else if (strcmp(text,"Firmware:")==0) // Befehl prüfen "Firmware:"
{Serial.println(Firmware_Nr);} // Ausgabe
else if (strcmp(text,"Reset:")==0) // Befehl prüfen "Reset:"
{memset(hardware, 0, sizeof(hardware)); Serial.println("Hadware Reset");} // Hadware Reseten und Ausgabe
else if (strcmp(text,"Print:")==0) // Befehl prüfen "Print:"
{
for (int i=0;i<schritte;i++)
{
Serial.print(hardware[i].pin);
Serial.print(", ");
Serial.print(hardware[i].vorlaufzeit);
Serial.print(", ");
Serial.println(hardware[i].dauer);
}
}
else if (strncmp(text,"Config:",7)==0) // Befehl prüfen "Config:"
{
text = text + strlen_P(PSTR("Config:")) ;
int pin = atoi(strtok(text, ","));
int vorlaufzeit = atoi(strtok(NULL, ","));
int dauer = atoi(strtok(NULL, ","));
int Zeile = atoi(strtok(NULL, ","));
hardware[Zeile].pin = pin;
hardware[Zeile].vorlaufzeit = vorlaufzeit;
hardware[Zeile].dauer = dauer;
Serial.print(pin); Serial.print(","); // Ausgabe
Serial.print(vorlaufzeit); Serial.print(","); // Ausgabe
Serial.println(dauer); // Ausgabe
}
}
if (digitalRead(startPin)== HIGH) // Taste Wurde gedrückt
{
Lauf = 0; // Programm darf Starten
while(digitalRead(startPin)== HIGH) // Die Schleife leuft so lange bis die Taste wider los gelassen wird
{
for (int i=0;i<schritte;i++)
{
pinMode(hardware[i].pin,OUTPUT); // Pin auf OUTPUT setzen
hardware[i].vorlaufzeit*=1000; // Millisekunden zu Mikrosekunden
hardware[i].dauer*=1000; // Millisekunden zu Mikrosekunden
hardware[i].dauer+=hardware[i].vorlaufzeit;
if (hardware[i].dauer>gesamtDauer) // Wenn vorlaufzeit + dauer > gesamtDauer
{gesamtDauer=hardware[i].dauer;} // Dann Speichere vorlaufzeit + dauer in gesamtDauer
}
if (Lauf == 0) // Prüfen ob das programm Starten darf
{
starttime=micros(); // Startzeit merken
while (micros()-starttime<gesamtDauer) // so lange widerholen bis die Gesammte Dauer der Aktionen zeitmäßig vorbei ist
{
looptime=micros()-starttime; // Aktuelle verstrichene zeit im Loop
for (int i=0;i<schritte;i++) // Alle Aktionen durchgehen
{
if (looptime>=hardware[i].vorlaufzeit && looptime<hardware[i].dauer)
digitalWrite(hardware[i].pin,HIGH); // Hardware EIN Schalten !!!!
else
digitalWrite(hardware[i].pin,LOW); // Hardware Ausschalten !!!!
}
}
// Nur zur Sicherheit nochmal alles abschalten
for (int i=0;i<schritte;i++)
{digitalWrite(hardware[i].pin,LOW); } // Hardware Ausschalten !!!!
Lauf = 1; // Programm darf nicht widerholt werden.
}
}
}
}