Hallo miteinander,
ich habe ja eine TropfenBox (TaT Bilder) als Projekt seit geraumer zeit,
dank dem Forum hier bin ich auch schon sehr weit gekommen, danke dafür.
Jedoch ist mir in der Firmware ein Fehler aufgefallen bei dem ich nicht weiter komme:-(
wenn ich die Konfiguration: (als Start Config hinterlegt) auf dem Bord habe.
Configure,23,0,500
Configure,25,500,500
Configure,27,1000,500
Configure,29,1500,500
Configure,31,0, 2000
Dann sollte eigentlich meine Digitalen Pins nach einander angehen bis auf Pin Nr. 31 der sollte von Anfang bis Ende an sein.
Jedoch ist das nicht der Fall
die LED`s laufen euch und Pin Nr. 31 wird ignoriert ![]()
an was kann das Ligen?
Kurze Beschreibung der Firmware:
Man kann Schaltzeiten für die Pin`s auf dem Arduino hinterlegen mit Startzeitpunkt und Dauer wie lange so ein Pin anessen soll.
wenn man Seine Daten hinterlegt hat kann man die gespeicherte Konfiguration der Pins Starten in dem man einen Taster Drückt der sich an Pin 2 befindet.
Befehle die das Bord mit der Firmware kennt.
// Befehl Ausgabe
// get_name = Es antwortet mit seinem Namen
// get_firmware = Es Antwortet mit der Versionsnummer
// configure = Format: configure,pin,vorlaufzeit,dauer
// print_config = Es antwortet mit einer Tabelle aller Hardware Zeiten
// reset = Es setzt alle Hardware Schaltzeiten wider auf 0 zurück
Das ist die Firmware:
// *****************************************************************
// *****************************************************************
// *****************************************************************
// Befehl Ausgabe
// get_name = Es antwortet mit seinem Namen
// get_firmware = Es Antwortet mit der Versionsnummer
// configure = Format: configure,pin,vorlaufzeit,dauer
// print_config = Es antwortet mit einer Tabelle aller Hardware Zeiten
// *print_steps* = Es antwortet mit einer Tabelle aller Schaltzeiten
// reset = Es setzt alle Hardware Schaltzeiten wider auf 0 zurück
// * nicht inplementirt
// *****************************************************************
// *****************************************************************
// *****************************************************************
#define ZEILENTRENNZEICHEN 13
int startPin = 2;
char Firmware_Nr[] = "1.2.0.1";
char Name[] = "Tropfen Box";
int Baudrate = 9600;
int Lauf = 0;
int Zeile = 5;
struct hardware_t{int pin;long vorlaufzeit; long dauer;}; // Struktur einer einzelnen Schaltzeit
struct schaltzeit_t{int pin;long zeit; boolean geschaltet;}; // Struktur einer einzelnen Schaltzeit
hardware_t hardware[10]=
{ // Vorlaufzeit und Dauer für die Hardware
{23, 0000, 500000},
{25, 500000, 500000},
{27, 1000000, 500000},
{29, 1500000, 500000},
{31, 0, 2000000},
};
#define schritte sizeof(hardware)/sizeof(hardware[0])
schaltzeit_t schaltzeiten[2*schritte];
int anzahlSchaltzeiten;
long geschalteteZeit[2*schritte];
void sortSchaltzeiten(int n)
{
schaltzeit_t temp;
for(int x=0; x<n; x++)
{
for(int y=0; y<n-1; y++)
{
if (schaltzeiten[y].zeit>schaltzeiten[y+1].zeit)
{
temp=schaltzeiten[y+1];
schaltzeiten[y+1]=schaltzeiten[y];
schaltzeiten[y]=temp;
}
}
}
}
// Funktion - Serielle Schnittstelle auslesen -
char* receiveBuffer() {
static char lineBuffer[100];
static byte counter=0;
char c;
if (Serial.available()==0) return NULL;
if (counter==0) memset(lineBuffer,0,sizeof(lineBuffer));
c=Serial.read();
if (c==ZEILENTRENNZEICHEN){
counter=0;
return lineBuffer; }
else if (c>=32) {
lineBuffer[counter]=c;
if (counter<sizeof(lineBuffer)-2) counter++; }
return NULL; }
// Funktion - Serielle Schnittstelle auslesen -
void setup()
{
pinMode(startPin, INPUT);
Serial.begin(Baudrate);
}
void loop() {
unsigned long starttime;
unsigned long looptime;
char* text=receiveBuffer();
if(text != NULL)
{
if (strcmp(text,"get_name")==0) {Serial.println(Name);}
else if (strcmp(text,"get_firmware")==0) {Serial.println(Firmware_Nr);}
else if (strcmp(text,"reset")==0) {memset(hardware, 0, sizeof(hardware)); Zeile = -1; Serial.println("Ok");}
else if (strcmp(text,"print_config")==0)
{
for (int i=0;i<schritte;i++)
{
Serial.print(hardware[i].pin);
Serial.print("\t");
Serial.print(hardware[i].vorlaufzeit/1000);
Serial.print("\t");
Serial.println(hardware[i].dauer/1000);
}
} // Print
else if (strncmp(text,"configure",9)==0)
{
text = text + strlen_P(PSTR("configure")) ;
int pin = atoi(strtok(text, ","));
int vorlaufzeit = atoi(strtok(NULL, ","));
int dauer = atoi(strtok(NULL, ","));
Zeile = Zeile + 1;
if (pin > startPin && pin < 54 && Zeile > -1 && Zeile < 11)
{
hardware[Zeile].pin = pin;
hardware[Zeile].vorlaufzeit = vorlaufzeit;
hardware[Zeile].dauer = dauer;
hardware[Zeile].vorlaufzeit*=1000;
hardware[Zeile].dauer*=1000;
// Serial.print(pin); Serial.print(",");
// Serial.print(vorlaufzeit); Serial.print(",");
// Serial.println(dauer);
Serial.println("Ok");
}
else
{ Serial.print("Pin");
Serial.print("\t");
Serial.println("Zeile");
Serial.print(pin);
Serial.print("\t");
Serial.print(Zeile);
Serial.print("\t");
Serial.println("Fehler: Werte komnten nicht eingetragen werden."); }
} // Config
else { Serial.println("Fehler: Befehl nicht bekannt"); }
} // if(text != NULL)
if(digitalRead(startPin)== HIGH && Lauf == 0)
{
Lauf = 1;
anzahlSchaltzeiten=0;
for (int i=0;i<schritte;i++)
{
pinMode(hardware[i].pin,OUTPUT);
if (hardware[i].dauer>0)
{
schaltzeiten[anzahlSchaltzeiten].pin=hardware[i].pin;
schaltzeiten[anzahlSchaltzeiten].zeit=hardware[i].vorlaufzeit;
schaltzeiten[anzahlSchaltzeiten].geschaltet=true;
anzahlSchaltzeiten++;
schaltzeiten[anzahlSchaltzeiten].pin=hardware[i].pin;
schaltzeiten[anzahlSchaltzeiten].zeit=hardware[i].vorlaufzeit+hardware[i].dauer;
schaltzeiten[anzahlSchaltzeiten].geschaltet=false;
anzahlSchaltzeiten++;
}
}
starttime=micros();
for (int i=0;i<anzahlSchaltzeiten;i++)
{
while ((looptime=micros()-starttime)<schaltzeiten[i].zeit);
digitalWrite(schaltzeiten[i].pin,schaltzeiten[i].geschaltet);
}
}
else if (digitalRead(startPin)== LOW) {Lauf = 0;}
}