Hallo Ich habe mir ein kleinen Akku Wächter mit dem attiny13a gebaut/gelötet was sogar geht (Schulterklopf). Nur bei einer sache brauche ich noch Hilfe, wenn die Spannung den wert von 2 volt unterschrieten hat soll der die last trennen, macht er auch. Nur wäre es mir lieb wenn er dann den mosfet nicht mehr einschaltet oder erst nach 30/60 Minuten ein neuen versuch macht. Ich habe es zuerst so lösen wollen: void setup() { pinMode(PB0, OUTPUT); (last+LED zur anzeige) pinMode(PB2, OUTPUT); (led die anzeigt wenn Akku leer) } void loop() { int sensorValue = analogRead(PB3); float voltage = sensorValue * (4.9 / 1023.0); if (voltage > 2.0) { digitalWrite(PB0,HIGH); } else { digitalWrite(PB0,LOW); digitalWrite(PB2,HIGH); delay(3600000); } delay(10000); } Aber nach cr 2-3 Minuten hängt er sich auf und schaltet alle Ausgänge auf HIGH um also auch die Last wieder ein ???? Wie kann ich das umgehen ? hin zukommt noch: Der Sketch verwendet 1.020 Bytes (99%) des Programmspeicherplatzes. Das Maximum sind 1.024 Bytes. Globale Variablen verwenden 4 Bytes (6%) des dynamischen Speichers, 60 Bytes für lokale Variablen verbleiben. Das Maximum sind 64 Bytes. Habe also nur noch wenige Möglichkeiten was den platz angeht. Jemand eine Idee ? DANKE
DAVID -. schrieb: > Jemand eine Idee ? Wie willst du mit nur noch 4 Bytes irgendwas reissen? Du musst also den Code so umschreiben, das du Luft hast. Das geht in C oder auch in Assembler, aber nicht mit den Arduino Libraries. Wenigstens das PinMode und DigitalOut Zeugs ist ja auch wirklich easy auf C umzunageln. DAVID -. schrieb: > pinMode(PB0, OUTPUT); (last+LED zur anzeige) > pinMode(PB2, OUTPUT); (led die anzeigt wenn Akku leer) Wird zu
1 | DDRB = (1 << PB0) | (1 <<PB2); |
Und DAVID -. schrieb: > digitalWrite(PB0,HIGH); wird zu
1 | PORTB |= (1 << PB0); |
Willst du wieder auf low, dann
1 | PORTB &= ~(1 << PB0); |
DAVID -. schrieb: > Habe also nur noch wenige Möglichkeiten was den platz angeht. > Jemand eine Idee ? > float voltage = sensorValue * (4.9 / 1023.0); > if (voltage > 2.0) Floating Point ist auf einem so kleinen Kontrölerchen grundsätzlich keine gute Idee. In diesem Fall sogar eine ganz schlechte. Das rechnest du gar nicht, sondern benutzt den ADC-Wert direkt. Denn mit deiner Rechnung machst du nichts anderes, als den Wert mit viel Aufwand ein wenig aufzuhübschen. Viel Aufwand für nichts.
DAVID -. schrieb: > void loop() { > int sensorValue = analogRead(PB3); > float voltage = sensorValue * (4.9 / 1023.0); > if (voltage > 2.0) Da kann man alle Rechnungen als Konstante herausziehen und den Compiler machen lassen. Übrig bleibt nur der Vergleich:
1 | #define VOLT2ADC(volt) (uint16_t)(volt * 1023.0 / 4.9)
|
2 | void loop() { |
3 | if( analogRead(PB3) > VOLT2ADC(2.0)) |
das sieht schon mal gut aus! void setup() { DDRB = (1 << PB0) | (1 <<PB2); } void loop() { int sensorValue = analogRead(PB3); float voltage = sensorValue * (4.9 / 1023.0); if (voltage > 2.0) { PORTB |= (1 << PB0); } else { PORTB &= ~(1 << PB0); PORTB |= (1 << PB2); delay(3600000); } delay(10000); } Der Sketch verwendet 858 Bytes (83%) des Programmspeicherplatzes. Das Maximum sind 1.024 Bytes. Globale Variablen verwenden 4 Bytes (6%) des dynamischen Speichers, 60 Bytes für lokale Variablen verbleiben. Das Maximum sind 64 Bytes. Testen obs auch geht kommt später bekomme aber immer hin schon mal keine Fehler. Muss ich mir noch überlegen wie ich eine warte oder abschalt zeit hin bekomme wenn Spannung runter geht. habe gelesen das es bei delay Zeiten über 2 Minuten immer wieder zu Fehlern kommt stimmt das ?
DAVID -. schrieb: > Der Sketch verwendet 858 Bytes (83%) des Programmspeicherplatzes. Kannste mal sehen. Wenn du jetzt noch die Floats los wirst und den ADC selber bedienst, kannste noch 3 solche Programme in den Tiny flashen :-P https://www.mikrocontroller.net/articles/Festkommaarithmetik
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.