Hallo miteinander,
erst mal ein Danke an alle die mir bisher bei meinem Programm geholfen haben, ich habe jetzt ein Problem ich versuche alle Einzelprojekte für das Gesamtprojekt zusammen zu legen.
Ich habe dem Programm nun beigebracht das es auf bestimmte befähle antworten kann.
die befehle Kommen alle von der Seriellen Schnittstelle
mit dem Befehl „Config:“ wird das Bord dann Konfiguriert
Das Bord Antwortet mit „Config Start“
jetzt sollte es eigentlich möglich sein 4 Zahlenblöcke getrennt euch ein Komma oder Leerzeichen zu senden.
Aufbau
1 Zahlenblock: Legt fest, welcher Digitale Pin geschaltet werden soll
2 Zahlenblock: Legt fest, nach welcher Zeit ab Start gerechnet eingeschaltet werden soll
3 Zahlenblock: Legt die Dauer der Einschaltzeit fest
durch „Ende:“ kommt man aus der Konfiguration wider heraus.
Leider klappt das nicht so wie ich mir das vorstelle
kann mir jemand sagen warum?
Gruß
Wenn ich die Abfrage so nicht machen kann dann muss ich das irgend wie mit den Befahlen machen.
das wäre doof
Das ist der Code:
/*
Tropfen Box Firmware
Befehle können über die Seriele Schnitstelle gesendet werden
und Fangen immer mit einem Großen Buchstaben an und Enden
mit einem :
Befehle Antwort
Name: Tropfen Box
Firmware: * Hier kommt die Versionsnummer
Config: Config Start
* Jetzt kann die Hadware Neu gesätzt werden,
* Die Alte Hadware wurde gellert
* Datenstrucktur
* - pin ==> Legt fest, welcher Pin geschaltet werden soll
* - vorlaufzeit ==> Legt fest, nach welcher Zeit ab Start gerechnet eingeschaltet werden soll
* - dauer ==> legt die Dauer der Einschaltzeit fest
Zeitangaben immer in Millisekunden
* Zeile ist eine duchlaufende Zahl zwischen 0 udn 499 jede Zahl kann nur ein mal vorkommen
Ende: Config Ende
* Kann nur angewendet werden wenn Config gestartet wurde
* sonnst gibt es keine Reagzion
* Solange sich das Bord in Config Start modus befindet kann es keine Hadware ansteuern.
*/
#define ZEILENTRENNZEICHEN 13 // Zeilenumbruch Definiren
// Config Daten
char Firmware_Nr[] = "1.0.1";
char Name[] = "Tropfen Box";
int startPin = 2; // Hier ist der taster angeschloßen
int Baudrate = 9600; // Baudrate für die Übertragung zwischen Arduino und PC
// Variablen Deklarieren und Füllen
unsigned long gesamtDauer = 0;
// Zwischenspeicher
int Lauf = 0;
// Datenstrucktur
struct hardware_t{int pin;long vorlaufzeit; long dauer;};
// Arrey erstellen Maximal 500 Einträge
hardware_t hardware[499];
// Größe des Array` ermitteln
int schritte = sizeof(hardware) / sizeof(hardware[0]);
// Das ist eine Funktion !!!
char* receiveBuffer()
/* Empfang einer Textzeile über Serial, Rückgabewert NULL: Zeile nicht/unvollständig empfangen
oder Rückgabewert char-Pointer auf die vollständig empfangene Textzeile */
{
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 (strcmp(text,"Name:")==0) {Serial.println(Name);} // Befehl prüfen "Firmware:"
if (strcmp(text,"Firmware:")==0) {Serial.println(Firmware_Nr);} // Befehl prüfen "Firmware Nr:"
if (strcmp(text,"Config:")==0) // Befehl prüfen "Config:"
{
Serial.println("Config Start");
memset(hardware, 0, sizeof(hardware)); // Hadware Werte alle auf 0 sätzen
while(strcmp(text,"Ende:")!=0)
{
char* text=receiveBuffer(); // Alles aus der Serielenschnitstelle Lesen
while (Serial.available() > 0)
{
int PIN = Serial.parseInt();
int VORLAUFZEIT = Serial.parseInt();
int DAUER = Serial.parseInt();
int Zeile = Serial.parseInt();
hardware[Zeile].pin = PIN;
hardware[Zeile].vorlaufzeit = VORLAUFZEIT;
hardware[Zeile].dauer = DAUER;
// Antwort
Serial.print(hardware[Zeile].pin); Serial.print(", "); Serial.print(hardware[Zeile].vorlaufzeit); Serial.print(", "); Serial.print(hardware[Zeile].dauer); Serial.print(", "); Serial.println(Zeile);
}
}
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
}
Serial.println("Config Ende");
}
unsigned long starttime;
unsigned long looptime;
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
{
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.
}
}
}
}