Ich bin jetzt seit Stunden dran mir eine wechselnde LCD Anzeige zu basteln aber ich komme auf das Thema einfach nicht klar.
Ich habe insgesamt 6 werte die ich nacheinander auf dem Display für jeweils eine gewisse Zeit anzeigen möchte.
Da diese Anzeigefunktion in mein LiPo Überwachungs Sketch eingebaut werden soll fällt die funktion von Dealy flach, da sonst die Überwachung zu lange nicht aktiv ist.
Ich habe schon versucht was zu basteln mit "if" abfragen und "millis()".
aber mir scheint da etwas das verständniss zu fehlen bzw. die unkenntniss des Funktionsumfanges des UNO's.
Auf der programmierungs ebene dachte ich an einen vergleich von millis().
hier ist mein Denkansatz
aber das funktioniert ja nur mit einem durchlauf.
nun brauch ich ja die möglichkeit die millis() zurückzusetzen ohne das ich meine überwachungsfunktion zu beeinträchtigen.
Wenn du mit den gegebenen Tipps nicht weiter kommen solltest, kannst du dir mal die Library "SimpleTimer" ansehen.
Damit löse ich in einem meiner Projekte genau das was du machen möchtest.
Displayanzeige wechseln in veschieden Zeitrythmen.
Natürlich ist es für dich besser, es mit millis zu lernen.
unsigned long currentMillis = millis();
if (currentMillis - previousMillis == interval) {
previousMillis = currentMillis;
also wenn das durchläuft weden alle 1000 millisekunden die aktuellen millisekunden in die variable "perviousMillis" millis geschrieben, sofern 1000millisekunden vergangen sind.
Und so lange dies nicht zutrifft könnte ich mit "else" 1000millisekunden eine Ausgabe auf das Display machen
Und wenn ich es recht verstehe kann ich 1000millisekunden lang eine Ausgabe auf das Display machen wenn die if abfrage zutrifft?
Also wenn du einen Lipo-Überwachungs-Sketch selbst geschrieben hast, sollte das Lösen deines Problems für dich mit den gebotenen Vorschlägen kein Problem mehr darstellen.
Ich persönlich bin ein absoluter Fan von INTERVAL.h, wenn man die Intervallzeit als globale Variable anlegt, ist das ein sehr mächtiges Werkzeug. Aber für deinen Fall tut es die einfache Ausführung mit festem Interval.
Pseudocode, ungetestet:
ElEspanol:
es ist Quatsch, 1000ms lang die Ausgabe zu machen, die macht man nur 1x alle 1000ms
zu meinem verständniss.
ich mache die ausgabe 1 mal pro 1000millisekunden.
wenn ich die ausgabe gemacht habe (also an das display) bleibt die dort solange bestehen bis man die ausgabe löscht oder eine neue ausgabe macht.
zum lipo sketch.
ja den habe ich selbst geschrieben nach dem ich mir diverse vorgehensweisen angeschaut habe.
also der ist nirgends iwie rauskopiert oder so.
aber dein teil Sketch hier bringt mich auf eine idee bzw hoffentlich auf den richtigen pfad um das vll mit millis() hinzubekommen
Micha383:
.zum lipo sketch.
ja den habe ich selbst geschrieben nach dem ich mir diverse vorgehensweisen angeschaut habe.
also der ist nirgends iwie rauskopiert oder so.
Hört sich interessant an, wie hast du die 6 Spannungen ermittelt? Was für Hardware verwendest du?
ElEspanol:
Hört sich interessant an, wie hast du die 6 Spannungen ermittelt? Was für Hardware verwendest du?
hardware technisch im moment nur mein UNO mein Breadbord. Ein paar wiederstände, 2potis und 2 Leds.
ich habe mir die 5V vom UNO geschnapt und 2 Spannungsteiler mit Poti gemacht.
ich greife da dann am Poti die Spannung ab und bringe die zum test auf 3 Analog eingänge.
das mache ich mit beiden spannungsteilern.
So simuliere ich 2 Lipos mit je 3 Zellen.
dann vergleiche ich diese mit einem grenzwert und lasse je nach der höhe der spannung 2 digitale ausgänge an dem die 2 LEDs hängen (je lipo eine led) abschalten.
Gegen wiedereinschalten bei Spannungserhohlung (wenn keine last mehr dran ist) habe ich mir da noch so ne art wiedereinschalt sicherung im sketch eingebaut.
falls du den sketch haben möchtest stelle ich gerne hier rein oder schick dir eine PM wenn du möchtest.
hab da was gebastelt das zumindest mal auf den ersten moment zu funktionieren scheint
unsigned long previousMillis = 0; // speichert wie viele Sekunden seit derletzten Änderung vergangen sind. "unsigned long" ist eine veränderbare Variable für lange Zeichenketten wie millis
const long interval = 1000; // Interval zwischen zwei Änderungen. "const long" ist eine unveränderbare Variable für lange Zeichenketten wie millis
int count = 0;
unsigned long currentMillis = millis(); //einlesen der aktuellen Millisekunden seit der Arduino läuft
if (currentMillis - previousMillis == interval)
{
previousMillis = currentMillis;
count++;
if ( count == 1)
{
lcd.setCursor(1, 0);
lcd.print("LiPo 1 Zelle 1");
}
if ( count == 2)
{
lcd.setCursor(1, 0);
lcd.print("LiPo 1 Zelle 2");
}
if ( count == 3)
{
lcd.setCursor(1, 0);
lcd.print("LiPo 1 Zelle 3");
}
if ( count == 4)
{
count = 0;
}
}
ElEspanol:
Du überwachst also nur den gesamten Lipo, nicht die Einzelzellen?
doch doch die einzelnen Zellen
das ist hier halt noch ein test aufbau und das brotbrett ist zu klein um 6 variable spannungsteiler zu bauen und mir würden dazu auch noch 4 potis fehlen.
daher simuliere ich einfach 2x3 Spannungen an den analogen eingängen.
A0 bis A2 auf dem Poti1
A3 bis A5 auf dem Poti2
mit mehr platz hätte ich da vll. pro analog eingang noch nen weiteren widerstand dran machen können um an A0 bis A2 auch verschiedene Spannungen zu haben.
Aber zum überprüfen meines konzepts ist die aktuelle schaltung aus meiner sicht ausreichend.
Das Projekt wird auch weiter wachsen da ich hoffentlich mit der Zeit es schaffe noch Ströme auszuwerten.
Aber da brauche ich nen MUX für, wird dann wohl mein nächstes sorgen Kind sobald das mit sorgen Kind names Display voll versorgt ist.
Mir würde beim Vergleich eine Relation besser gefallen, da Dein Sketch später mal länger als eine Millisekunde dauern könnte und dann der Vergleich "übersehen" werden könnte. Also besser so:
if (currentMillis - previousMillis >= interval)
Micha383:
hab da was gebastelt ...
Mir fehlen setup und loop und die vielen Leerzeilen machen das Lesen auch nicht angenehmer.
if ( count == 1)
...
if ( count == 2)
...
if ( count == 3)
...
if ( count == 4)
Das ruft nach switch/case
Micha383:
Das Projekt wird auch weiter wachsen da ich hoffentlich mit der Zeit es schaffe noch Ströme auszuwerten.
So mein aktueller Stand der funktioniert.
Sicher nicht der straffste Code aber dafür das ich am verzweifeln war, gefällt er mir doch recht gut ^^
//Display Ausgabe der Spannungen in einem intervall von 1er sekunde
unsigned long currentMillis = millis(); //einlesen der aktuellen Millisekunden seit der Arduino läuft "unsigned long" da je nach Laufzeit die millis() eine extrem lange Zeichenkette ergibt.
if (currentMillis - previousMillis == interval) //Eine IF funktion die mit millis() arbeitet um einen 1 Sekunden intervall zu erzeugen mit welchem man einen Zähler (count++) verbinden kann um jeweils 1 Sekunde einen anderen Wert auf dem Display Anzeigen lassen kann.
{ //Es wird mit "unsigned long currentMillis = millis();" der aktuelle "millis()" eingelesen.
previousMillis = currentMillis; //Dann wird verglichen ob die "currentMillis" abzüglich der "perviousmillis" dem "interval" entsprechen. Da der "Loop" permanent durchläuft und die millis() immer weiter hoch zählen wird die Abfrage entsprechend dem interval iwann zutreffen,
//Hier werden die die aktuellen millis() aus der variable "currentMillis" in die Variable PerviousMillis geschrieben.
//Durch dieses konstrukt wird die "if" abfrage alle 1000millisekunden (bzw. dem eingestellten Intervall) zutreffen
//So kann man diese IF Abfrage als einen 1sekündigen Trigger verweden mit dem man weiter Funktionen wie einen Zähler auslösen kann ohne das das Programm angehalten wird
count++; //Was bei Laufzeitkritischen Funktionen die oberste Priorität hat.
//Hier wird ein Zähler verwendet (count++, pro durchlauf um eins erhöhen) um bei jedem Durchlauf eine andere Display Anzeige auszugeben.
//Display Ausgabe LiPo 1 //Mit der IF Abfrage ob count = 1 ist wird geprüft wie oft das Programm schon durchgelaufen ist.
if ( count == 1) //Wenn dies zutrifft wird auf die Entprechende Anzeige auf dem Display ausgegeben.
{ //ACHTUNG!!!!! Die Abfragen für die Display Ausgaben müssen sich in der IF Anfrage der Millisekunden befinden !!!!!AUCHTUNG
lcd.setCursor(1, 0);
lcd.print("LiPo 1 Zelle 1");
lcd.setCursor(4, 1);
lcd.print(VL1Z1);
lcd.print("V");
}
if ( count == 2)
{
lcd.setCursor(1, 0);
lcd.print("LiPo 1 Zelle 2");
lcd.setCursor(4, 1);
lcd.print(VL1Z2);
lcd.print("V");
}
if ( count == 3)
{
lcd.setCursor(1, 0);
lcd.print("LiPo 1 Zelle 3");
lcd.setCursor(4, 1);
lcd.print(VL1Z3);
lcd.print("V");
}
//Display Ausgabe LiPo 2
if ( count == 4)
{
lcd.setCursor(1, 0);
lcd.print("LiPo 2 Zelle 1");
lcd.setCursor(4, 1);
lcd.print(VL2Z1);
lcd.print("V");
}
if ( count == 5)
{
lcd.setCursor(1, 0);
lcd.print("LiPo 2 Zelle 2");
lcd.setCursor(4, 1);
lcd.print(VL2Z2);
lcd.print("V");
}
if (count == 6)
{
lcd.setCursor(1, 0);
lcd.print("LiPo 2 Zelle 3");
lcd.setCursor(4, 1);
lcd.print(VL2Z3);
lcd.print("V");
}
if ( count == 6)
{
count = 0;
}
}
und euch allen echt dickes danke für die infos, den beistand und die beispiele