Hallo,
bin blutiger Anfänger in Sachen Mikrocontroller/Elektronik und versuche,
etwas tiefer in die Materie einzusteigen.
Mein 1. Projekt funktioniert bereits tadellos, möchte es aber bzgl.
Stromverbrauch noch etwas optimieren.
Und zwar soll nur nach (seltenem) Tastendruck folgendes Programm
ausgeführt werden
1
voidloop(){
2
if(digitalRead(Bell)==HIGH){
3
digitalWrite(LiftHandset,HIGH);
4
delay(analogRead(A0)/1.023*0.5);
5
digitalWrite(Redial,HIGH);
6
delay(analogRead(A1)/1.023*1.5);
7
digitalWrite(Redial,LOW);
8
delay(analogRead(A2)/1.023*15);
9
digitalWrite(LiftHandset,LOW);
10
}
11
}
Bei meiner Recherche bin ich auf
http://www.mikrocontroller.net/articles/Sleep_Mode#Aufwachen_per_Tastendruck
gestossen, doch dieses Bsp lässt sich so wie beschrieben wahrscheinlich
nicht mit dem Arduino anwenden - auch sind die Bibliotheken avr/*.h u.
util/*.h nicht vorhanden.
Kennt jemand ein Beispiel, wo sich der Arduino im SLEEP_MODE_PWR_DOWN
befindet und dann nach Tastendruck aufwacht und das Programm ausführt?
In der finalen Version soll ein Digispark Kickstarter Clone verwendet
werden - Stromsparfunktion sollte also auch mit diesem funktionieren.
Danke
Matthias
Matthias schrieb:> Bei meiner Recherche bin ich auf
Ich frag mich ja immer wie ihr sucht.
Mindestens 5 mal die Woche kommt wer, der behauptet er hätte schon
recherchiert und nichts gefunden.
Dann starte ich ein 2-tes Fenster im Browser, gebe bei Google die mir
zunächst naheliegend scheinenden Stichworte ein, in diesem Fall "Arduino
sleep", und in den ersten 10 Ergebnissen sind normalerweise mit
Sicherheit mehr als 3 Links, die sich um genau dieses Thema drehen. Bei
Arduino Themen ist die Trefferquote meistens noch höher: so um die 9
Volltreffer in den ersten 10 Links ist der Normalfall. Das dauert keine
10 Sekunden und ich hab ein paar Links für etwas, worüber man angeblich
nichts im Web findet und worüber der Fragesteller schon 'tagelang'
erfolglos recherchiert hat.
Ja, ich weiss. Die Google Ergebnisse sind je nach Region
unterschiedlich. Aber so unterschiedlich können die doch dann auch
wieder nicht sein? Und das augerechnet mich Google ganz besonders lieb
hat würde ich mal nicht annehmen.
http://playground.arduino.cc/Learning/ArduinoSleepCodehttps://learn.adafruit.com/low-power-wifi-datalogging/power-down-sleep
>Ich frag mich ja immer wie ihr sucht.
Wahrscheinlich genauso wie Du und die Ergebnisse dürften gleich sein.
Nur fehlen bei Neulingen manchmal nur Kleinigkeiten, um Zusammenhänge zu
erkennen oder Probleme zu lösen.
Den 1. Link hatte ich selbst schon gefunden, aber ich scheiterte wie bei
anderen gefundenen Beispielen an "#include <avr/sleep.h>".
Die Lösung stand dann im 2. Link, nämlich dass man zus. die "AVR Libc
library" benötigt und diese auch beim Arduino verwenden kann.
Das bringt mich zum nächsten Anfängerproblem: welche Dateien werden
benötigt?
Reicht es, den ganzen Ordner "avr-libc-1.8.1\include\avr" mit den Header
Dateien nach "..\Arduino\libraries" zu kopieren oder muss die ganze "AVR
Libc library" kopiert werden?
Irgendwas läuft trotzdem noch schief, denn Stromverbrauch ist mit
Beispiel aus 1. Link
< 10 sek - ca. 45 mA
dann kurzzeitig 3,xx mA
und dann dauerhaft 31,5 mA und Tastendruck hat keine Auswirkung.
// ADCSRA &= ~ bit(ADEN); bitSet(PRR, PRADC); // Disable the ADC to save power
36
}
37
38
39
void loop()
40
{
41
if (Startup == 0)
42
{
43
digitalWrite(LiftHandset, HIGH);
44
delay(analogRead(A0)/1.023*0.5);
45
digitalWrite(Redial, HIGH);
46
delay(analogRead(A1)/1.023*1.5);
47
digitalWrite(Redial, LOW);
48
delay(analogRead(A2)/1.023*15);
49
digitalWrite(LiftHandset, LOW);
50
}
51
else
52
{
53
Startup = 0;
54
}
55
GoSleep();
56
}
Taster jetzt über 330 Ohm (im Beispiel waren es 220 Ohm) Widerstand an
5V (vorher an Gnd) und Funktion ist jetzt OK.
Allerdings komme ich nur für Sekundenbruchteile auf 3,xx mA, dann steigt
der Verbrauch sofort wieder auf 31,xx mA und ändert sich nicht mehr. Ist
fast so, als ob irgendwas den Schlafmodus unterbricht.
Normaler Verbrauch ohne Interrupt und Schlafmodus ist Idle ca. 45 mA und
steigt bei Tastendruck auf ca. 54 mA.
c) 5V Ader vom USB Kabel aufgetrennt und Multimeter in Reihe
Morgen Matthias,
na das sollten wir hinkriegen.
a) Das Board hat eine PowerOn LED. Mindestens die solltest du auslöten.
Ein schlafender Arduino kommt leicht auf deutlich unter 1 mA.
Da ist die LED dann bei weiterm der größte Verbraucher.
Das zweite Board übrigens scheint aus dem ersten Blick einen 7805
Spannungsregulator zu haben. Auch der ist bei irgendwelchen
sleep-Versuchen eher hinderlich, behalte das mal im Hinterkopf.
b) Sei erstmal vorsichtig mit den Interrupts und lass die weg. Schick
das Board ruhig mal dauerhaft in den sleep.
Denke dran dass der Stromverbrauch dann dauerhaft sehr gering sein
sollte.
Eine blinkende LED in der main-Loop sollte das blinken aufhören. Damit
siehst du dass die Abarbeitung auch wirklich gestoppt wurde.
Nun zum Programmcode:
1
/* gewuensten sleep_mode einstellen, PWR_DOWN ist der tiefste sleep_mode, es wird das Bit SM1 im Register SMCR gesetzt */
2
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
3
/* sleep im SMCR Register aktivieren, Bit SE wird auf 1 gesetzt */
4
sleep_enable();
5
/* Eigentlich ein Macro (siehe sleep.h) welches ausführt: sleep_enable(), sleep_cpu(), sleep_disable() */
6
sleep_mode();
7
/* setzt das SE Bit im SMCR Register auf 0 */
8
sleep_disable();
Ich gebe zu, das durchsuchen der sleep.h um herauszufinden was die
Befehle eigentlich tun ist GRAUENHAFT.
Die Datei besteht fast ausschließlich aus Macros und riesigen
Präprozessor defines die abhängig vom Mikrocontroller Typ alles wieder
anders machen.
Leider führt an der Datei, und am Datenblatt des 328P kein Weg vorbei
sobald man mal aus der kuscheligen Arduino-Welt ausbrechen will.
Manchmal ist es sogar einfacher selber die Register gemäß dem Datenblatt
zu setzen als die fertigen Funktionen von avr zu nehmen.
Einfach weil man dann weiß was eigentlich passiert !
Ich kann erstmal heute vormittag nichts testen, aber dein Programmcode
sieht (für mich) eigentlich ganz richtig aus.
Was passiert denn wenn du den attachInterrupt() weg lässt?
Außerdem verändere das Timing mal so dass du mit Sekunden messen (und
LED die an oder ausgeht) genau weißt wo du gerade bist.
Evtl. auch mit serial.print().
Dank einem nachfolgenden serial.print() oder LED blinken weißt du auch
ob das Ding überhaupt schläft.
c) Sei dir bewusst das Multimeter beim Messen von Strom die Spannung
einbrechen lassen (BurdenVoltage) das kann bei USB 5V durchaus von
Bedeutung sein.
Der Atmel sollte damit wohl gut klar kommen (denke der 328P geht noch
weit unter 5V) aber andere Bauteile nicht.
Nur kurz ein Zitat zum Thema 'irgendwas unterbricht den Sleep'.
Es gibt da einiges was in Frage käme. Auszug auf dem Datasheet (was ein
neues blaues design hat... ahhh, ungewohnt...), Seite 40+41, Kapitel
10.5:
1
10.5 Power-down Mode
2
When the SM2...0 bits are written to 010, the SLEEP instruction makes the MCU enter Power-down mode. In
3
this mode, the external Oscillator is stopped, while the external interrupts, the 2-wire Serial Interface address
4
watch, and the Watchdog continue operating (if enabled). Only an External Reset, a Watchdog System Reset, a
5
Watchdog Interrupt, a Brown-out Reset, a 2-wire Serial Interface address match, an external level interrupt on
6
INT0 or INT1, or a pin change interrupt can wake up the MCU. This sleep mode basically halts all generated
7
clocks, allowing operation of asynchronous modules only.
8
9
Note: If a level triggered interrupt is used for wake-up from Power-down, the required level must be held long enough for the MCU
10
to complete the wake-up to trigger the level interrupt. If the level disappears before the end of the Start-up Time, the MCU will
11
still wake up, but no interrupt will be generated. ”External Interrupts” on page 70. The start-up time is defined by the SUT
12
and CKSEL Fuses as described in ”System Clock and Clock Options” on page 27.
13
14
When waking up from Power-down mode, there is a delay from the wake-up condition occurs until the wake-up
15
becomes effective. This allows the clock to restart and become stable after having been stopped. The wake-up
16
period is defined by the same CKSEL Fuses that define the Reset Time-out period, as described in ”Clock
Matthias schrieb:> Irgendwas läuft trotzdem noch schief, denn Stromverbrauch ist mit> Beispiel aus 1. Link> < 10 sek - ca. 45 mA> dann kurzzeitig 3,xx mA> und dann dauerhaft 31,5 mA und Tastendruck hat keine Auswirkung.
Du hast einen Arduino Nano: da kannst den µC auslöten, der braucht
trotzdem 30-45mA, da da sitzt der FTDI(-Klon) drauf. Der braucht bis man
den Arduino an USB steckt um 45mA, wenn man ihn dan wieder vom USB
trennt sinkt der Verbrauch auf ca. 30mA-35mA und bleibt dort.
Dein AVR schläft wahrscheinlich im Tiefstschlaf, seine Komplizen auf dem
Board fressen aber weiter!
Gruß!
Marek
Hallo Matthias,
Marek schrieb:
> Du hast einen Arduino Nano: da kannst den µC auslöten, der braucht> trotzdem 30-45mA, da da sitzt der FTDI(-Klon) drauf. Der braucht bis man> den Arduino an USB steckt um 45mA, wenn man ihn dan wieder vom USB> trennt sinkt der Verbrauch auf ca. 30mA-35mA und bleibt dort.>> Dein AVR schläft wahrscheinlich im Tiefstschlaf, seine Komplizen auf dem> Board fressen aber weiter!
Genau. Ich stand auch vor diesem Problem. Ich wollte batteriebetriebene
Temperatur/Feuchtesensoren für mein FHEM System bauen. Mit dem nano
kommst Du aber nicht weit. Ich bin dann beim Arduino Pro Mini (5V M328
Variante) gelandet. Da muss nur die Powerled raus und der DC-DC Wandler
abgeklemmt werden. Mein Board verbraucht damit nur noch 35µA im
Tiefschlaf. Alle 15 Minuten wacht es auf (per WDT) und schickt die
Sensordaten über einen billigen FS1000A zur Basisstation. Dabei
verbraucht es für ca. 1s 15mA. Macht im Schnitt ca. 50µA. Ach ja,
betriebn wird das ganze mit 3AA Batterien.
War zwar eher als Prototyp gedacht, läuft aber wunderbar. Falls Dich der
Quellcode interessiert: http://github.com/michhey/thsens.
Da ich das Rad nicht nochmal neu erfinden wollte, nutze ich für den
Tiefschlaf die LowPower Arduino Lib. Ist aber kein Hexenwerk...
Gruß,
Micha
Ich hab bei meinem letzten Projekt einen Attiny13 verwendet. Dem klemmt
man ein bisschen Strom an und der schaltet dann einen FET welcher den
großen Arduino mit Strom versorgt sobald ihn irgendwas aufgeweckt hat.
Bei mir gings damals drum zwar einen Arduino und seine Libs zu verwenden
(weil einfach und schnell) aber während der langen Sleep-Phasen "keinen"
Strom zu verbrauchen.
Deshalb Bewegungsmelder an Attiny. Beides verbraucht so gut wie
garkeinen Strom und wenn eine Beweung registriert wird habe ich in
wenigen Millisekunden den großen Arduino am laufen.
Thomas
PS: Auch hier kann ich dir natürlich den Programmcode liefern. 25 € und
er ist dein*
* Kleiner Scherz, natürlich ist es mir eine Ehre der Community etwas
zurückzugeben.
Hallo und danke für alle Antworten
Thomas schrieb:> a) Das Board hat eine PowerOn LED. Mindestens die solltest du auslöten.> Ein schlafender Arduino kommt leicht auf deutlich unter 1 mA.> Da ist die LED dann bei weiterm der größte Verbraucher.
Werde ich für finale Version beim Digispark Clone auslöten, sofern
dieses Board auch funktioniert.
Thomas schrieb:> c) Sei dir bewusst das Multimeter beim Messen von Strom die Spannung> einbrechen lassen (BurdenVoltage) das kann bei USB 5V durchaus von
..
..
> Nur kurz ein Zitat zum Thema 'irgendwas unterbricht den Sleep'.> Es gibt da einiges was in Frage käme...
Denke nicht mehr, dass der Sleep unterbrochen wird und halte einen
Anzeigefehler des Multimeters für wahrscheinlicher.
Marek Lewandowski schrieb:> ...Der braucht bis man> den Arduino an USB steckt um 45mA, wenn man ihn dan wieder vom USB> trennt sinkt der Verbrauch auf ca. 30mA-35mA und bleibt dort
Habe USB abgesteckt und das Board nun direkt über 5V/Gnd Pins
angeschlossen und da sinkt der Verbrauch beim Schlafen um ca. 10 mA auf
21,16 mA.
Das scheint ohne Hardwareeingriff das Minimum zu sein und da die finale
Version ohnehin am USB der Fritzbox laufen soll und der Verbrauch mit
21,16 mA unter 1 kW/Jahr ist, gebe ich mich damit zufrieden.
Micha H. schrieb:> Da ich das Rad nicht nochmal neu erfinden wollte, nutze ich für den> Tiefschlaf die LowPower Arduino Lib. Ist aber kein Hexenwerk...
Die hatte ich gestern testweise auch mal getestet, bekomme aber beim
Kompilieren viele Fehler ähnlich
In file included from sketch_feb12a.ino:2:
C:\Program Files\Arduino\libraries\LowPower/LowPower.h:12: error: stray
'\302' in program
Habe von C zuwenig Ahnung und kam damit gestern nicht weiter
Grüsse
Matthias